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