xref: /dokuwiki/inc/Ui/Search.php (revision 427ed988282f72cb160d09b0830f843d462cc93a)
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