MDL-60913 search: add search area categories
[moodle.git] / search / classes / output / renderer.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Search renderer.
19  *
20  * @package    core_search
21  * @copyright  2015 David Monllao {@link http://www.davidmonllao.com}
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_search\output;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Search renderer.
31  *
32  * @package    core_search
33  * @copyright  2015 David Monllao {@link http://www.davidmonllao.com}
34  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35  */
36 class renderer extends \plugin_renderer_base {
38     /**
39      * @var int Max number chars to display of a string value
40      */
41     const SEARCH_RESULT_STRING_SIZE = 100;
43     /**
44      * @var int Max number chars to display of a text value
45      */
47     const SEARCH_RESULT_TEXT_SIZE = 500;
49     /**
50      * Renders search results.
51      *
52      * @param \core_search\document[] $results
53      * @param int $page Zero based page number.
54      * @param int $totalcount Total number of results available.
55      * @param \moodle_url $url
56      * @param \core_search\area_category|null $cat Selected search are category or null if category functionality is disabled.
57      * @return string HTML
58      */
59     public function render_results($results, $page, $totalcount, $url, $cat = null) {
60         $content = '';
62         if (\core_search\manager::is_search_area_categories_enabled() && !empty($cat)) {
63             $toprow = [];
64             foreach (\core_search\manager::get_search_area_categories() as $category) {
65                 $taburl = clone $url;
66                 $taburl->param('cat', $category->get_name());
67                 $taburl->param('page', 0);
68                 $taburl->remove_params(['page', 'areaids']);
69                 $toprow[$category->get_name()] = new \tabobject($category->get_name(), $taburl, $category->get_visiblename());
70             }
72             if (\core_search\manager::should_hide_all_results_category()) {
73                 unset($toprow[\core_search\manager::SEARCH_AREA_CATEGORY_ALL]);
74             }
76             $content .= $this->tabtree($toprow, $cat->get_name());
77         }
79         // Paging bar.
80         $perpage = \core_search\manager::DISPLAY_RESULTS_PER_PAGE;
81         $content .= $this->output->paging_bar($totalcount, $page, $perpage, $url);
83         // Results.
84         $resultshtml = array();
85         foreach ($results as $hit) {
86             $resultshtml[] = $this->render_result($hit);
87         }
88         $content .= \html_writer::tag('div', implode('<hr/>', $resultshtml), array('class' => 'search-results'));
90         // Paging bar.
91         $content .= $this->output->paging_bar($totalcount, $page, $perpage, $url);
93         return $content;
94     }
96     /**
97      * Displaying search results.
98      *
99      * @param \core_search\document Containing a single search response to be displayed.a
100      * @return string HTML
101      */
102     public function render_result(\core_search\document $doc) {
103         $docdata = $doc->export_for_template($this);
105         // Limit text fields size.
106         $docdata['title'] = shorten_text($docdata['title'], static::SEARCH_RESULT_STRING_SIZE, true);
107         $docdata['content'] = $docdata['content'] ? shorten_text($docdata['content'], static::SEARCH_RESULT_TEXT_SIZE, true) : '';
108         $docdata['description1'] = $docdata['description1'] ? shorten_text($docdata['description1'], static::SEARCH_RESULT_TEXT_SIZE, true) : '';
109         $docdata['description2'] = $docdata['description2'] ? shorten_text($docdata['description2'], static::SEARCH_RESULT_TEXT_SIZE, true) : '';
111         return $this->output->render_from_template('core_search/result', $docdata);
112     }
114     /**
115      * Returns a box with a search disabled lang string.
116      *
117      * @return string HTML
118      */
119     public function render_search_disabled() {
120         $content = $this->output->box_start();
121         $content .= $this->output->notification(get_string('globalsearchdisabled', 'search'), 'notifymessage');
122         $content .= $this->output->box_end();
123         return $content;
124     }
126     /**
127      * Returns information about queued index requests.
128      *
129      * @param \stdClass $info Info object from get_index_requests_info
130      * @return string HTML
131      * @throws \moodle_exception Any error with template
132      */
133     public function render_index_requests_info(\stdClass $info) {
134         return $this->output->render_from_template('core_search/index_requests', $info);
135     }