See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. namespace mod_glossary\output; use moodle_url; use context_module; use renderable; use renderer_base; use single_button; use templatable; use url_select; /** * Class standard_action_bar - Display the action bar * * @package mod_glossary * @copyright 2021 Peter Dias * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class standard_action_bar implements renderable, templatable { /** @var object $cm The course module. */ private $cm; /** @var string $mode The type of view. */ private $mode; /** @var string $hook The term, entry, cat, etc... to look for based on mode. */ private $hook; /** @var string $sortkey Sorted view: CREATION | UPDATE | FIRSTNAME | LASTNAME. */ private $sortkey; /** @var string $sortorder The sort order (ASC or DESC). */ private $sortorder; /** @var int $offset Entries to bypass (for paging purposes). */ private $offset; /** @var int $pagelimit The page to resume with. */ private $pagelimit; /** @var int $context The context of the glossary. */ private $context; /** @var object $module The glossary record . */ private $module; /** @var int $fullsearch Full search (concept and definition) when searching. */ private $fullsearch; /** @var object $displayformat Override of the glossary display format. */ private $displayformat; /** @var string $tab Browsing entries by categories. */ private $tab; /** * standard_action_bar constructor. * * @param object $cm * @param object $module * @param object $displayformat * @param string $mode * @param string $hook * @param string $sortkey * @param string $sortorder * @param int $offset * @param int $pagelimit * @param int $fullsearch * @param string $tab * @param string $defaulttab * @throws \coding_exception */ public function __construct(object $cm, object $module, object $displayformat, string $mode, string $hook, string $sortkey, string $sortorder, int $offset, int $pagelimit, int $fullsearch, string $tab, string $defaulttab) { $this->cm = $cm; $this->module = $module; $this->displayformat = $displayformat; $this->mode = $mode; $this->tab = $tab; $this->hook = $hook; $this->sortkey = $sortkey; $this->sortorder = $sortorder; $this->offset = $offset; $this->pagelimit = $pagelimit; $this->fullsearch = $fullsearch; $this->context = context_module::instance($this->cm->id); if (!has_capability('mod/glossary:approve', $this->context) && $this->tab == GLOSSARY_APPROVAL_VIEW) { // Non-teachers going to approval view go to defaulttab. $this->tab = $defaulttab; } } /** * Export the action bar * * @param renderer_base $output * @return array */ public function export_for_template(renderer_base $output) { return [ 'addnewbutton' => $this->create_add_button($output), 'searchbox' => $this->create_search_box(), 'tools' => $this->get_additional_tools($output), 'tabjumps' => $this->generate_tab_jumps($output) ]; } /** * Render the search box with the checkbox * * @return array */ private function create_search_box(): array { global $OUTPUT; $fullsearchchecked = false; if ($this->fullsearch || $this->mode != 'search') { $fullsearchchecked = true; } $check = [ 'name' => 'fullsearch', 'id' => 'fullsearch', 'value' => '1', 'checked' => $fullsearchchecked, 'label' => get_string("searchindefinition", "glossary"), ]; $checkbox = $OUTPUT->render_from_template('core/checkbox', $check); $hiddenfields = [ (object) ['name' => 'id', 'value' => $this->cm->id], (object) ['name' => 'mode', 'value' => 'search'], ]; $data = [ 'action' => new moodle_url('/mod/glossary/view.php'), 'hiddenfields' => $hiddenfields, 'otherfields' => $checkbox, 'inputname' => 'hook', 'query' => ($this->mode == 'search') ? s($this->hook) : '', 'searchstring' => get_string('search'), ]; return $data; } /** * Render the add entry button * * @param renderer_base $output * @return \stdClass|null */ private function create_add_button(renderer_base $output): ?\stdClass { if (!has_capability('mod/glossary:write', $this->context)) { return null; } $btn = new single_button(new moodle_url('/mod/glossary/edit.php', ['cmid' => $this->cm->id]),< get_string('addsingleentry', 'glossary'), 'post', true);> get_string('addsingleentry', 'glossary'), 'post', single_button::BUTTON_PRIMARY);return $btn->export_for_template($output); } /** * Render the additional tools required by the glossary * * @param renderer_base $output * @return array */ private function get_additional_tools(renderer_base $output): array { global $USER, $CFG; $items = []; $buttons = []; $openinnewwindow = []; if (has_capability('mod/glossary:import', $this->context)) { $items['button'] = new single_button( new moodle_url('/mod/glossary/import.php', ['id' => $this->cm->id]), get_string('importentries', 'glossary') ); } if (has_capability('mod/glossary:export', $this->context)) { $url = new moodle_url('/mod/glossary/export.php', [ 'id' => $this->cm->id, 'mode' => $this->mode, 'hook' => $this->hook ]); $buttons[get_string('export', 'glossary')] = $url->out(false); } if (has_capability('mod/glossary:manageentries', $this->context) or $this->module->allowprintview) { $params = array( 'id' => $this->cm->id, 'mode' => $this->mode, 'hook' => $this->hook, 'sortkey' => $this->sortkey, 'sortorder' => $this->sortorder, 'offset' => $this->offset, 'pagelimit' => $this->pagelimit ); $printurl = new moodle_url('/mod/glossary/print.php', $params); $buttons[get_string('printerfriendly', 'glossary')] = $printurl->out(false); $openinnewwindow[] = $printurl->out(false); } if (!empty($CFG->enablerssfeeds) && !empty($CFG->glossary_enablerssfeeds) && $this->module->rsstype && $this->module->rssarticles && has_capability('mod/glossary:view', $this->context)) { require_once("$CFG->libdir/rsslib.php"); $string = get_string('rssfeed', 'glossary'); $url = new moodle_url(rss_get_url($this->context->id, $USER->id, 'mod_glossary', $this->cm->instance)); $buttons[$string] = $url->out(false); $openinnewwindow[] = $url->out(false); } foreach ($items as $key => $value) { $items[$key] = $value->export_for_template($output); } if ($buttons) { foreach ($buttons as $index => $value) { $items['select']['options'][] = [ 'url' => $value, 'string' => $index, 'openinnewwindow' => ($openinnewwindow ? in_array($value, $openinnewwindow) : false) ]; } } return $items; } /** * Generate a url select to match any types of glossary views * * @param renderer_base $output * @return \stdClass|null */ private function generate_tab_jumps(renderer_base $output) { $tabs = glossary_get_visible_tabs($this->displayformat); $validtabs = [ GLOSSARY_STANDARD => [ 'mode' => 'letter', 'descriptor' => 'standardview' ], GLOSSARY_CATEGORY => [ 'mode' => 'cat', 'descriptor' => 'categoryview' ], GLOSSARY_DATE => [ 'mode' => 'date', 'descriptor' => 'dateview' ], GLOSSARY_AUTHOR => [ 'mode' => 'author', 'descriptor' => 'authorview' ], ]; $baseurl = new moodle_url('/mod/glossary/view.php', ['id' => $this->cm->id]); $active = null; $options = []; foreach ($validtabs as $key => $tabinfo) { if (in_array($key, $tabs)) { $baseurl->params(['mode' => $tabinfo['mode']]); $active = $active ?? $baseurl->out(false); $active = ($tabinfo['mode'] == $this->mode ? $baseurl->out(false) : $active); $options[get_string($tabinfo['descriptor'], 'glossary')] = $baseurl->out(false); } } if ($this->tab < GLOSSARY_STANDARD_VIEW || $this->tab > GLOSSARY_AUTHOR_VIEW) { $options[get_string('edit')] = '#'; } if (count($options) > 1) { $select = new url_select(array_flip($options), $active, null); $select->set_label(get_string('explainalphabet', 'glossary'), ['class' => 'sr-only']); return $select->export_for_template($output); } return null; } }