121fcef82SMichael Große<?php 221fcef82SMichael Große 321fcef82SMichael Großenamespace dokuwiki\Ui; 421fcef82SMichael Große 5*427ed988SMichael Großeuse \dokuwiki\Form\Form; 6*427ed988SMichael Große 721fcef82SMichael Großeclass Search extends Ui 821fcef82SMichael Große{ 921fcef82SMichael Große protected $query; 1021fcef82SMichael Große protected $pageLookupResults = array(); 1121fcef82SMichael Große protected $fullTextResults = array(); 1221fcef82SMichael Große protected $highlight = array(); 1321fcef82SMichael Große 1421fcef82SMichael Große /** 1521fcef82SMichael Große * Search constructor. 1621fcef82SMichael Große * 1721fcef82SMichael Große * @param string $query the search query 1821fcef82SMichael Große */ 1921fcef82SMichael Große public function __construct($query) 2021fcef82SMichael Große { 2121fcef82SMichael Große $this->query = $query; 2221fcef82SMichael Große } 2321fcef82SMichael Große 2421fcef82SMichael Große /** 2521fcef82SMichael Große * run the search 2621fcef82SMichael Große */ 2721fcef82SMichael Große public function execute() 2821fcef82SMichael Große { 2921fcef82SMichael Große $this->pageLookupResults = ft_pageLookup($this->query, true, useHeading('navigation')); 3021fcef82SMichael Große $this->fullTextResults = ft_pageSearch($this->query, $highlight); 3121fcef82SMichael Große $this->highlight = $highlight; 3221fcef82SMichael Große } 3321fcef82SMichael Große 3421fcef82SMichael Große /** 3521fcef82SMichael Große * display the search result 3621fcef82SMichael Große * 3721fcef82SMichael Große * @return void 3821fcef82SMichael Große */ 3921fcef82SMichael Große public function show() 4021fcef82SMichael Große { 4121fcef82SMichael Große $searchHTML = ''; 4221fcef82SMichael Große 43*427ed988SMichael Große $searchHTML .= $this->getSearchFormHTML($this->query); 44*427ed988SMichael Große 4521fcef82SMichael Große $searchHTML .= $this->getSearchIntroHTML($this->query); 4621fcef82SMichael Große 4721fcef82SMichael Große $searchHTML .= $this->getPageLookupHTML($this->pageLookupResults); 4821fcef82SMichael Große 4921fcef82SMichael Große $searchHTML .= $this->getFulltextResultsHTML($this->fullTextResults, $this->highlight); 5021fcef82SMichael Große 5121fcef82SMichael Große echo $searchHTML; 5221fcef82SMichael Große } 5321fcef82SMichael Große 5421fcef82SMichael Große /** 55*427ed988SMichael Große * Get a form which can be used to adjust/refine the search 56*427ed988SMichael Große * 57*427ed988SMichael Große * @param string $query 58*427ed988SMichael Große * 59*427ed988SMichael Große * @return string 60*427ed988SMichael Große */ 61*427ed988SMichael Große protected function getSearchFormHTML($query) 62*427ed988SMichael Große { 63*427ed988SMichael Große global $lang; 64*427ed988SMichael Große 65*427ed988SMichael Große $searchForm = (new Form())->attrs(['method' => 'get']); 66*427ed988SMichael Große $searchForm->setHiddenField('do', 'search'); 67*427ed988SMichael Große 68*427ed988SMichael Große $searchForm->addFieldsetOpen(); 69*427ed988SMichael Große $searchForm->addTextInput('id', '')->val($query); 70*427ed988SMichael Große $searchForm->addButton('', $lang['btn_search'])->attr('type', 'submit'); 71*427ed988SMichael Große $searchForm->addFieldsetClose(); 72*427ed988SMichael Große 73*427ed988SMichael Große return $searchForm->toHTML(); 74*427ed988SMichael Große } 75*427ed988SMichael Große 76*427ed988SMichael Große /** 7721fcef82SMichael Große * Build the intro text for the search page 7821fcef82SMichael Große * 7921fcef82SMichael Große * @param string $query the search query 8021fcef82SMichael Große * 8121fcef82SMichael Große * @return string 8221fcef82SMichael Große */ 8321fcef82SMichael Große protected function getSearchIntroHTML($query) 8421fcef82SMichael Große { 8521fcef82SMichael Große global $ID, $lang; 8621fcef82SMichael Große 8721fcef82SMichael Große $intro = p_locale_xhtml('searchpage'); 8821fcef82SMichael Große // allow use of placeholder in search intro 8921fcef82SMichael Große $pagecreateinfo = (auth_quickaclcheck($ID) >= AUTH_CREATE) ? $lang['searchcreatepage'] : ''; 9021fcef82SMichael Große $intro = str_replace( 9121fcef82SMichael Große array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'), 9221fcef82SMichael Große array(hsc(rawurlencode($query)), hsc($query), $pagecreateinfo), 9321fcef82SMichael Große $intro 9421fcef82SMichael Große ); 9521fcef82SMichael Große return $intro; 9621fcef82SMichael Große } 9721fcef82SMichael Große 9821fcef82SMichael Große /** 9921fcef82SMichael Große * Build HTML for a list of pages with matching pagenames 10021fcef82SMichael Große * 10121fcef82SMichael Große * @param array $data search results 10221fcef82SMichael Große * 10321fcef82SMichael Große * @return string 10421fcef82SMichael Große */ 10521fcef82SMichael Große protected function getPageLookupHTML($data) 10621fcef82SMichael Große { 10721fcef82SMichael Große if (empty($data)) { 10821fcef82SMichael Große return ''; 10921fcef82SMichael Große } 11021fcef82SMichael Große 11121fcef82SMichael Große global $lang; 11221fcef82SMichael Große 11321fcef82SMichael Große $html = '<div class="search_quickresult">'; 11421fcef82SMichael Große $html .= '<h3>' . $lang['quickhits'] . ':</h3>'; 11521fcef82SMichael Große $html .= '<ul class="search_quickhits">'; 11621fcef82SMichael Große foreach ($data as $id => $title) { 11721fcef82SMichael Große $html .= '<li> '; 11821fcef82SMichael Große if (useHeading('navigation')) { 11921fcef82SMichael Große $name = $title; 12021fcef82SMichael Große } else { 12121fcef82SMichael Große $ns = getNS($id); 12221fcef82SMichael Große if ($ns) { 12321fcef82SMichael Große $name = shorten(noNS($id), ' (' . $ns . ')', 30); 12421fcef82SMichael Große } else { 12521fcef82SMichael Große $name = $id; 12621fcef82SMichael Große } 12721fcef82SMichael Große } 12821fcef82SMichael Große $html .= html_wikilink(':' . $id, $name); 12921fcef82SMichael Große $html .= '</li> '; 13021fcef82SMichael Große } 13121fcef82SMichael Große $html .= '</ul> '; 13221fcef82SMichael Große //clear float (see http://www.complexspiral.com/publications/containing-floats/) 13321fcef82SMichael Große $html .= '<div class="clearer"></div>'; 13421fcef82SMichael Große $html .= '</div>'; 13521fcef82SMichael Große 13621fcef82SMichael Große return $html; 13721fcef82SMichael Große } 13821fcef82SMichael Große 13921fcef82SMichael Große /** 14021fcef82SMichael Große * Build HTML for fulltext search results or "no results" message 14121fcef82SMichael Große * 14221fcef82SMichael Große * @param array $data the results of the fulltext search 14321fcef82SMichael Große * @param array $highlight the terms to be highlighted in the results 14421fcef82SMichael Große * 14521fcef82SMichael Große * @return string 14621fcef82SMichael Große */ 14721fcef82SMichael Große protected function getFulltextResultsHTML($data, $highlight) 14821fcef82SMichael Große { 14921fcef82SMichael Große global $lang; 15021fcef82SMichael Große 15121fcef82SMichael Große if (empty($data)) { 15221fcef82SMichael Große return '<div class="nothing">' . $lang['nothingfound'] . '</div>'; 15321fcef82SMichael Große } 15421fcef82SMichael Große 15521fcef82SMichael Große $html = ''; 15621fcef82SMichael Große $html .= '<dl class="search_results">'; 15721fcef82SMichael Große $num = 1; 15821fcef82SMichael Große foreach ($data as $id => $cnt) { 15921fcef82SMichael Große $html .= '<dt>'; 16021fcef82SMichael Große $html .= html_wikilink(':' . $id, useHeading('navigation') ? null : $id, $highlight); 16121fcef82SMichael Große if ($cnt !== 0) { 16221fcef82SMichael Große $html .= ': ' . $cnt . ' ' . $lang['hits'] . ''; 16321fcef82SMichael Große } 16421fcef82SMichael Große $html .= '</dt>'; 16521fcef82SMichael Große if ($cnt !== 0) { 16621fcef82SMichael Große if ($num < FT_SNIPPET_NUMBER) { // create snippets for the first number of matches only 16721fcef82SMichael Große $html .= '<dd>' . ft_snippet($id, $highlight) . '</dd>'; 16821fcef82SMichael Große } 16921fcef82SMichael Große $num++; 17021fcef82SMichael Große } 17121fcef82SMichael Große } 17221fcef82SMichael Große $html .= '</dl>'; 17321fcef82SMichael Große 17421fcef82SMichael Große return $html; 17521fcef82SMichael Große } 17621fcef82SMichael Große} 177