Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?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 core\output;

use context_course;
use moodle_page;
use navigation_node;
use moodle_url;

/**
 * Class responsible for generating the action bar (tertiary nav) elements in the participants page and related pages.
 *
 * @package    core
 * @copyright  2021 Peter Dias
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class participants_action_bar implements \renderable {
    /** @var object $course The course we are dealing with. */
    private $course;
    /** @var moodle_page $page The current page. */
    private $page;
    /** @var navigation_node $node The settings node for the participants page. */
    private $node;
    /** @var string|null $renderedcontent Rendered buttons to be displayed in-line with the select box */
    private $renderedcontent;

    /**
     * Constructor participants_action_bar
     * @param object $course The course that we are generating the nav for
     * @param moodle_page $page The page object
     * @param string|null $renderedcontent Any additional rendered content/actions to be displayed in line with the nav
     */
    public function __construct(object $course, moodle_page $page, ?string $renderedcontent) {
        $this->course = $course;
        $this->page = $page;
        $node = 'users';
        if ($this->page->context->contextlevel == CONTEXT_MODULE) {
            $node = 'modulesettings';
        } else if ($this->page->context->contextlevel == CONTEXT_COURSECAT) {
            $node = 'categorysettings';
        }

        $this->node = $this->page->settingsnav->find($node, null);
        $this->renderedcontent = $renderedcontent;
    }

    /**
     * Return the nodes required to be displayed in the url_select box.
     * The nodes are divided into 3 sections each with the heading as the key.
     *
     * @return array
     */
    protected function get_ordered_nodes(): array {
        return [
            'enrolments:enrol' => [
                'review',
< 'manageinstances'
> 'manageinstances', > 'renameroles',
], 'groups:group' => [ 'groups' ], 'permissions:role' => [ 'override', 'roles', 'otherusers', 'permissions', 'roleoverride', 'rolecheck', 'roleassign',
< ]
> ],
]; } /** * Get the content for the url_select select box. * * @return array */ protected function get_content_for_select(): array { if (!$this->node) { return []; } $formattedcontent = []; $enrolmentsheading = get_string('enrolments', 'enrol'); if ($this->page->context->contextlevel != CONTEXT_MODULE && $this->page->context->contextlevel != CONTEXT_COURSECAT) { // Pre-populate the formatted tertiary nav items with the "Enrolled users" node if user can view the participants page. $coursecontext = context_course::instance($this->course->id); $canviewparticipants = course_can_view_participants($coursecontext); if ($canviewparticipants) { $participantsurl = (new moodle_url('/user/index.php', ['id' => $this->course->id]))->out(); $formattedcontent[] = [ $enrolmentsheading => [ $participantsurl => get_string('enrolledusers', 'enrol'), ] ]; } } $nodes = $this->get_ordered_nodes(); foreach ($nodes as $description => $content) { list($stringid, $location) = explode(':', $description); $heading = get_string($stringid, $location); $items = []; foreach ($content as $key) { if ($node = $this->node->find($key, null)) { if ($node->has_action()) { $items[$node->action()->out()] = $node->text; } // Additional items to be added. if ($key === 'groups') { $params = ['id' => $this->course->id]; $items += [ (new moodle_url('/group/groupings.php', $params))->out() => get_string('groupings', 'group'), (new moodle_url('/group/overview.php', $params))->out() => get_string('overview', 'group') ]; } } } if ($items) { if ($heading === $enrolmentsheading) { // Merge the contents of the "Enrolments" group with the ones from the course settings nav. $formattedcontent[0][$heading] = array_merge($formattedcontent[0][$heading], $items); } else { $formattedcontent[][$heading] = $items; } } } // If we are accessing a page from a module/category context additional nodes will not be visible. if ($this->page->context->contextlevel != CONTEXT_MODULE && $this->page->context->contextlevel != CONTEXT_COURSECAT) { // Need to do some funky code here to find out if we have added third party navigation nodes. $thirdpartynodearray = $this->get_thirdparty_node_array() ?: []; $formattedcontent = array_merge($formattedcontent, $thirdpartynodearray); } return $formattedcontent; } /** * Gets an array of third party navigation nodes in an array formatted for a url_select element. * * @return array|null The thirdparty node array. */ protected function get_thirdparty_node_array(): ?array { $results = []; $flatnodes = array_merge(...(array_values($this->get_ordered_nodes()))); foreach ($this->node->children as $child) { if (array_search($child->key, $flatnodes) === false) { $results[] = $child; } } return \core\navigation\views\secondary::create_menu_element($results, true); } /** * Recursively tries to find a matching url * @param array $urlcontent The content for the url_select * @param int $strictness Strictness for the compare criteria * @return string The matching active url */ protected function find_active_page(array $urlcontent, int $strictness = URL_MATCH_EXACT): string { foreach ($urlcontent as $key => $value) { if (is_array($value) && $activeitem = $this->find_active_page($value, $strictness)) { return $activeitem; } else if ($this->page->url->compare(new moodle_url($key), $strictness)) { return $key; } } return ""; } /** * Gets the url_select to be displayed in the participants page if available. * * @param \renderer_base $output
< * @return object|null The content required to render the url_select
> * @return object|null The content required to render the tertiary navigation
*/ public function get_dropdown(\renderer_base $output): ?object { if ($urlselectcontent = $this->get_content_for_select()) { $activeurl = $this->find_active_page($urlselectcontent); $activeurl = $activeurl ?: $this->find_active_page($urlselectcontent, URL_MATCH_BASE);
< $urlselect = new \url_select($urlselectcontent, $activeurl, null); < $urlselect->set_label(get_string('participantsnavigation', 'course'), ['class' => 'sr-only']); < return $urlselect->export_for_template($output);
> > $selectmenu = new select_menu('participantsnavigation', $urlselectcontent, $activeurl); > $selectmenu->set_label(get_string('participantsnavigation', 'course'), ['class' => 'sr-only']); > > return $selectmenu->export_for_template($output);
} return null; } /** * Export the content to be displayed on the participants page. * * @param \renderer_base $output * @return array Consists of the following:
< * - urlselect A stdclass representing the standard navigation options to be fed into a urlselect
> * - navigation A stdclass representing the standard navigation options to be fed into a urlselect
* - renderedcontent Rendered content to be displayed in line with the tertiary nav */ public function export_for_template(\renderer_base $output) { return [
< 'urlselect' => $this->get_dropdown($output),
> 'navigation' => $this->get_dropdown($output),
'renderedcontent' => $this->renderedcontent, ]; } }