| public $search_precond = array('IDF_Precondition::accessIssues');␊ |
| public function search($request, $match)␊ |
| {␊ |
| $query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];␊ |
| return $this->doSearch($request, $query, 'open');␊ |
| }␊ |
| ␊ |
| public $searchStatus_precond = array('IDF_Precondition::accessIssues');␊ |
| public function searchStatus($request, $match)␊ |
| {␊ |
| $query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];␊ |
| $status = in_array($match[2], array('open', 'closed')) ? $match[2] : 'open';␊ |
| return $this->doSearch($request, $query, $status);␊ |
| }␊ |
| ␊ |
| public $searchLabel_precond = array('IDF_Precondition::accessIssues');␊ |
| public function searchLabel($request, $match)␊ |
| {␊ |
| $query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];␊ |
| $tag_id = intval($match[2]);␊ |
| $status = in_array($match[3], array('open', 'closed')) ? $match[3] : 'open';␊ |
| return $this->doSearch($request, $query, $status, $tag_id);␊ |
| }␊ |
| ␊ |
| private function doSearch($request, $query, $status, $tag_id=null)␊ |
| {␊ |
| $prj = $request->project;␊ |
| if (!isset($request->REQUEST['q']) or trim($request->REQUEST['q']) == '') {␊ |
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index',␊ |
| array($prj->shortname));␊ |
| if (trim($query) == '') {␊ |
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index', array($prj->shortname));␊ |
| return new Pluf_HTTP_Response_Redirect($url);␊ |
| }␊ |
| $q = $request->REQUEST['q'];␊ |
| $title = sprintf(__('Search Issues - %s'), $q);␊ |
| $issues = new Pluf_Search_ResultSet(IDF_Search::mySearch($q, $prj, 'IDF_Issue'));␊ |
| if (count($issues) > 100) {␊ |
| // no more than 100 results as we do not care␊ |
| $issues->results = array_slice($issues->results, 0, 100);␊ |
| ␊ |
| $tag = null;␊ |
| if ($tag_id !== null) {␊ |
| $tag = Pluf_Shortcuts_GetObjectOr404('IDF_Tag', $tag_id);␊ |
| }␊ |
| ␊ |
| $title = sprintf(__('Search issues - %s'), $query);␊ |
| if ($status === 'closed') {␊ |
| $title = sprintf(__('Search closed issues - %s'), $query);␊ |
| }␊ |
| ␊ |
| // using Plufs ResultSet implementation here is inefficient, because␊ |
| // it makes a SELECT for each item and does not allow for further␊ |
| // filtering neither, so we just return the ids and filter by them␊ |
| // and other things in the next round␊ |
| $results = IDF_Search::mySearch($query, $prj, 'IDF_Issue');␊ |
| ␊ |
| $issue_ids = array();␊ |
| foreach ($results as $result) {␊ |
| $issue_ids[] = $result['model_id'];␊ |
| }␊ |
| ␊ |
| $otags = $prj->getTagIdsByStatus($status);␊ |
| if (count($otags) == 0) $otags[] = 0;␊ |
| $sql = new Pluf_SQL(␊ |
| 'id IN ('.implode(',', $issue_ids).') '.␊ |
| 'AND status IN ('.implode(', ', $otags).') '.␊ |
| ($tag_id !== null ? 'AND idf_tag_id='.$tag_id.' ' : '')␊ |
| );␊ |
| $model = new IDF_Issue();␊ |
| $issues = $model->getList(array('filter' => $sql->gen(), 'view' => 'join_tags'));␊ |
| ␊ |
| // we unfortunately loose the original sort order,␊ |
| // so we manually have to apply it here again␊ |
| $sorted_issues = new ArrayObject();␊ |
| $filtered_issue_ids = array();␊ |
| foreach ($issue_ids as $issue_id) {␊ |
| foreach ($issues as $issue) {␊ |
| if ($issue->id != $issue_id)␊ |
| continue;␊ |
| if (array_key_exists($issue_id, $sorted_issues))␊ |
| continue;␊ |
| $sorted_issues[$issue_id] = $issue;␊ |
| $filtered_issue_ids[] = $issue_id;␊ |
| }␊ |
| }␊ |
| ␊ |
| $pag = new Pluf_Paginator();␊ |
| $pag->items = $issues;␊ |
| $pag->class = 'recent-issues';␊ |
| $pag->item_extra_props = array('project_m' => $prj,␊ |
| 'shortname' => $prj->shortname,␊ |
| 'current_user' => $request->user);␊ |
| $pag->items = $sorted_issues;␊ |
| $pag->item_extra_props = array(␊ |
| 'project_m' => $prj,␊ |
| 'shortname' => $prj->shortname,␊ |
| 'current_user' => $request->user␊ |
| );␊ |
| $pag->summary = __('This table shows the found issues.');␊ |
| $pag->action = array('IDF_Views_Issue::search', array($prj->shortname), array('q'=> $q));␊ |
| $pag->extra_classes = array('a-c', '', 'a-c', '');␊ |
| $list_display = array(␊ |
| 'id' => __('Id'),␊ |
| array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),␊ |
| array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),␊ |
| array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),␊ |
| );␊ |
| $pag->configure($list_display);␊ |
| $pag->items_per_page = 100;␊ |
| $pag->configure(array(␊ |
| 'id' => __('Id'),␊ |
| array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),␊ |
| array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),␊ |
| array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),␊ |
| ));␊ |
| // disable paginating␊ |
| $pag->items_per_page = PHP_INT_MAX;␊ |
| $pag->no_results_text = __('No issues were found.');␊ |
| $pag->setFromRequest($request);␊ |
| $params = array('page_title' => $title,␊ |
| 'issues' => $pag,␊ |
| 'q' => $q,␊ |
| );␊ |
| return Pluf_Shortcuts_RenderToResponse('idf/issues/search.html', $params, $request);␊ |
| ␊ |
| if ($tag_id === null) {␊ |
| $pag->action = array('IDF_Views_Issue::searchStatus',␊ |
| array($prj->shortname, $status),␊ |
| array('q'=> $query),␊ |
| );␊ |
| } else {␊ |
| $pag->action = array('IDF_Views_Issue::searchLabel',␊ |
| array($prj->shortname, $tag_id, $status),␊ |
| array('q'=> $query),␊ |
| );␊ |
| }␊ |
| ␊ |
| // get stats about the issues␊ |
| $open = $prj->getIssueCountByStatus('open', $tag, $issue_ids);␊ |
| $closed = $prj->getIssueCountByStatus('closed', $tag, $issue_ids);␊ |
| ␊ |
| // query the available tags for this search result␊ |
| $all_tags = $prj->getTagsByIssues($filtered_issue_ids);␊ |
| $grouped_tags = array();␊ |
| foreach ($all_tags as $atag) {␊ |
| // group by class␊ |
| if (!array_key_exists($atag->class, $grouped_tags)) {␊ |
| $grouped_tags[$atag->class] = array();␊ |
| }␊ |
| $grouped_tags[$atag->class][] = $atag;␊ |
| }␊ |
| ␊ |
| $params = array(␊ |
| 'page_title' => $title,␊ |
| 'issues' => $pag,␊ |
| 'query' => $query,␊ |
| 'status' => $status,␊ |
| 'open' => $open,␊ |
| 'closed' => $closed,␊ |
| 'tag' => $tag,␊ |
| 'all_tags' => $grouped_tags,␊ |
| );␊ |
| ␊ |
| return Pluf_Shortcuts_RenderToResponse('idf/issues/search.html', $params, $request);␊ |
| }␊ |
| ␊ |
| public $view_precond = array('IDF_Precondition::accessIssues');␊ |