1*21fcef82SMichael Große<?php 2*21fcef82SMichael Große 3*21fcef82SMichael Großenamespace dokuwiki\Ui; 4*21fcef82SMichael Große 5*21fcef82SMichael Großeclass Search extends Ui 6*21fcef82SMichael Große{ 7*21fcef82SMichael Große protected $query; 8*21fcef82SMichael Große protected $pageLookupResults = array(); 9*21fcef82SMichael Große protected $fullTextResults = array(); 10*21fcef82SMichael Große protected $highlight = array(); 11*21fcef82SMichael Große 12*21fcef82SMichael Große /** 13*21fcef82SMichael Große * Search constructor. 14*21fcef82SMichael Große * 15*21fcef82SMichael Große * @param string $query the search query 16*21fcef82SMichael Große */ 17*21fcef82SMichael Große public function __construct($query) 18*21fcef82SMichael Große { 19*21fcef82SMichael Große $this->query = $query; 20*21fcef82SMichael Große } 21*21fcef82SMichael Große 22*21fcef82SMichael Große /** 23*21fcef82SMichael Große * run the search 24*21fcef82SMichael Große */ 25*21fcef82SMichael Große public function execute() 26*21fcef82SMichael Große { 27*21fcef82SMichael Große $this->pageLookupResults = ft_pageLookup($this->query, true, useHeading('navigation')); 28*21fcef82SMichael Große $this->fullTextResults = ft_pageSearch($this->query, $highlight); 29*21fcef82SMichael Große $this->highlight = $highlight; 30*21fcef82SMichael Große } 31*21fcef82SMichael Große 32*21fcef82SMichael Große /** 33*21fcef82SMichael Große * display the search result 34*21fcef82SMichael Große * 35*21fcef82SMichael Große * @return void 36*21fcef82SMichael Große */ 37*21fcef82SMichael Große public function show() 38*21fcef82SMichael Große { 39*21fcef82SMichael Große $searchHTML = ''; 40*21fcef82SMichael Große 41*21fcef82SMichael Große $searchHTML .= $this->getSearchIntroHTML($this->query); 42*21fcef82SMichael Große 43*21fcef82SMichael Große $searchHTML .= $this->getPageLookupHTML($this->pageLookupResults); 44*21fcef82SMichael Große 45*21fcef82SMichael Große $searchHTML .= $this->getFulltextResultsHTML($this->fullTextResults, $this->highlight); 46*21fcef82SMichael Große 47*21fcef82SMichael Große echo $searchHTML; 48*21fcef82SMichael Große } 49*21fcef82SMichael Große 50*21fcef82SMichael Große /** 51*21fcef82SMichael Große * Build the intro text for the search page 52*21fcef82SMichael Große * 53*21fcef82SMichael Große * @param string $query the search query 54*21fcef82SMichael Große * 55*21fcef82SMichael Große * @return string 56*21fcef82SMichael Große */ 57*21fcef82SMichael Große protected function getSearchIntroHTML($query) 58*21fcef82SMichael Große { 59*21fcef82SMichael Große global $ID, $lang; 60*21fcef82SMichael Große 61*21fcef82SMichael Große $intro = p_locale_xhtml('searchpage'); 62*21fcef82SMichael Große // allow use of placeholder in search intro 63*21fcef82SMichael Große $pagecreateinfo = (auth_quickaclcheck($ID) >= AUTH_CREATE) ? $lang['searchcreatepage'] : ''; 64*21fcef82SMichael Große $intro = str_replace( 65*21fcef82SMichael Große array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'), 66*21fcef82SMichael Große array(hsc(rawurlencode($query)), hsc($query), $pagecreateinfo), 67*21fcef82SMichael Große $intro 68*21fcef82SMichael Große ); 69*21fcef82SMichael Große return $intro; 70*21fcef82SMichael Große } 71*21fcef82SMichael Große 72*21fcef82SMichael Große 73*21fcef82SMichael Große /** 74*21fcef82SMichael Große * Build HTML for a list of pages with matching pagenames 75*21fcef82SMichael Große * 76*21fcef82SMichael Große * @param array $data search results 77*21fcef82SMichael Große * 78*21fcef82SMichael Große * @return string 79*21fcef82SMichael Große */ 80*21fcef82SMichael Große protected function getPageLookupHTML($data) 81*21fcef82SMichael Große { 82*21fcef82SMichael Große if (empty($data)) { 83*21fcef82SMichael Große return ''; 84*21fcef82SMichael Große } 85*21fcef82SMichael Große 86*21fcef82SMichael Große global $lang; 87*21fcef82SMichael Große 88*21fcef82SMichael Große $html = '<div class="search_quickresult">'; 89*21fcef82SMichael Große $html .= '<h3>' . $lang['quickhits'] . ':</h3>'; 90*21fcef82SMichael Große $html .= '<ul class="search_quickhits">'; 91*21fcef82SMichael Große foreach ($data as $id => $title) { 92*21fcef82SMichael Große $html .= '<li> '; 93*21fcef82SMichael Große if (useHeading('navigation')) { 94*21fcef82SMichael Große $name = $title; 95*21fcef82SMichael Große } else { 96*21fcef82SMichael Große $ns = getNS($id); 97*21fcef82SMichael Große if ($ns) { 98*21fcef82SMichael Große $name = shorten(noNS($id), ' (' . $ns . ')', 30); 99*21fcef82SMichael Große } else { 100*21fcef82SMichael Große $name = $id; 101*21fcef82SMichael Große } 102*21fcef82SMichael Große } 103*21fcef82SMichael Große $html .= html_wikilink(':' . $id, $name); 104*21fcef82SMichael Große $html .= '</li> '; 105*21fcef82SMichael Große } 106*21fcef82SMichael Große $html .= '</ul> '; 107*21fcef82SMichael Große //clear float (see http://www.complexspiral.com/publications/containing-floats/) 108*21fcef82SMichael Große $html .= '<div class="clearer"></div>'; 109*21fcef82SMichael Große $html .= '</div>'; 110*21fcef82SMichael Große 111*21fcef82SMichael Große return $html; 112*21fcef82SMichael Große } 113*21fcef82SMichael Große 114*21fcef82SMichael Große /** 115*21fcef82SMichael Große * Build HTML for fulltext search results or "no results" message 116*21fcef82SMichael Große * 117*21fcef82SMichael Große * @param array $data the results of the fulltext search 118*21fcef82SMichael Große * @param array $highlight the terms to be highlighted in the results 119*21fcef82SMichael Große * 120*21fcef82SMichael Große * @return string 121*21fcef82SMichael Große */ 122*21fcef82SMichael Große protected function getFulltextResultsHTML($data, $highlight) 123*21fcef82SMichael Große { 124*21fcef82SMichael Große global $lang; 125*21fcef82SMichael Große 126*21fcef82SMichael Große if (empty($data)) { 127*21fcef82SMichael Große return '<div class="nothing">' . $lang['nothingfound'] . '</div>'; 128*21fcef82SMichael Große } 129*21fcef82SMichael Große 130*21fcef82SMichael Große $html = ''; 131*21fcef82SMichael Große $html .= '<dl class="search_results">'; 132*21fcef82SMichael Große $num = 1; 133*21fcef82SMichael Große foreach ($data as $id => $cnt) { 134*21fcef82SMichael Große $html .= '<dt>'; 135*21fcef82SMichael Große $html .= html_wikilink(':' . $id, useHeading('navigation') ? null : $id, $highlight); 136*21fcef82SMichael Große if ($cnt !== 0) { 137*21fcef82SMichael Große $html .= ': ' . $cnt . ' ' . $lang['hits'] . ''; 138*21fcef82SMichael Große } 139*21fcef82SMichael Große $html .= '</dt>'; 140*21fcef82SMichael Große if ($cnt !== 0) { 141*21fcef82SMichael Große if ($num < FT_SNIPPET_NUMBER) { // create snippets for the first number of matches only 142*21fcef82SMichael Große $html .= '<dd>' . ft_snippet($id, $highlight) . '</dd>'; 143*21fcef82SMichael Große } 144*21fcef82SMichael Große $num++; 145*21fcef82SMichael Große } 146*21fcef82SMichael Große } 147*21fcef82SMichael Große $html .= '</dl>'; 148*21fcef82SMichael Große 149*21fcef82SMichael Große return $html; 150*21fcef82SMichael Große } 151*21fcef82SMichael Große} 152