░▒▓████████████████████████████████▓▒░ ░▒▓█ ▓▒░ ░▒▓█ ~ S W A M P ~ ▓▒░ ░▒▓█ ▓▒░ ░▒▓████████████████████████████████▓▒░
pplmvsvm
LOCATION:
/var/www/moodle/public/theme/moove/classes/output
☗ ROOT
↻ REFRESH
✎ CARVE FLESH
EDITING: core_renderer.php
<?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/>. /** * Overriden theme boost core renderer. * * @package theme_moove * @copyright 2022 Willian Mano {@link https://conecti.me} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace theme_moove\output; use theme_config; use core\context\course as context_course; use moodle_url; use html_writer; use theme_moove\output\core_course\activity_navigation; use theme_moove\util\settings; /** * Renderers to align Moodle's HTML with that expected by Bootstrap * * @package theme_moove * @copyright 2022 Willian Mano {@link https://conecti.me} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class core_renderer extends \theme_boost\output\core_renderer { /** * The standard tags (meta tags, links to stylesheets and JavaScript, etc.) * that should be included in the <head> tag. Designed to be called in theme * layout.php files. * * @return string HTML fragment. */ public function standard_head_html() { $output = parent::standard_head_html(); $googleanalyticscode = "<script async src='https://www.googletagmanager.com/gtag/js?id=GOOGLE-ANALYTICS-CODE'> </script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'GOOGLE-ANALYTICS-CODE'); </script>"; $theme = theme_config::load('moove'); if (!empty($theme->settings->googleanalytics)) { $output .= str_replace("GOOGLE-ANALYTICS-CODE", trim($theme->settings->googleanalytics), $googleanalyticscode); } $sitefont = isset($theme->settings->fontsite) ? $theme->settings->fontsite : 'Moodle'; if ($sitefont != 'Moodle') { $output .= '<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=' . $sitefont . ':ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap" rel="stylesheet">'; } return $output; } /** * Returns HTML attributes to use within the body tag. This includes an ID and classes. * * @param string|array $additionalclasses Any additional classes to give the body tag, * * @return string * * @throws \coding_exception * * @since Moodle 2.5.1 2.6 */ public function body_attributes($additionalclasses = []) { $hasaccessibilitybar = get_user_preferences('thememoovesettings_enableaccessibilitytoolbar', ''); if ($hasaccessibilitybar) { $additionalclasses[] = 'hasaccessibilitybar'; $currentfontsizeclass = get_user_preferences('accessibilitystyles_fontsizeclass', ''); if ($currentfontsizeclass) { $additionalclasses[] = $currentfontsizeclass; } $currentsitecolorclass = get_user_preferences('accessibilitystyles_sitecolorclass', ''); if ($currentsitecolorclass) { $additionalclasses[] = $currentsitecolorclass; } } $fonttype = get_user_preferences('thememoovesettings_fonttype', ''); if ($fonttype) { $additionalclasses[] = $fonttype; } $colormode = 'light'; $settings = new settings(); $darkmode = get_user_preferences('dark-mode-on', ''); if ($settings->enabledarkmode && $darkmode) { $additionalclasses[] = 'moove-darkmode'; $colormode = 'dark'; } if (!is_array($additionalclasses)) { $additionalclasses = explode(' ', $additionalclasses); } return " id='{$this->body_id()}' class='{$this->body_css_classes($additionalclasses)}' data-bs-theme='{$colormode}' "; } /** * Whether we should display the main theme or site logo in the navbar. * * @return bool */ public function should_display_logo() { if ($this->should_display_theme_logo() || parent::should_display_navbar_logo()) { return true; } return false; } /** * Whether we should display the main theme logo in the navbar. * * @return bool */ public function should_display_theme_logo() { $logo = $this->get_theme_logo_url(); return !empty($logo); } /** * Get the main logo URL. * * @return string */ public function get_logo() { $logo = $this->get_theme_logo_url(); if ($logo) { return $logo; } $logo = $this->get_logo_url(); if ($logo) { return $logo->out(false); } return false; } /** * Get the main logo URL. * * @return string */ public function get_logo_dark() { $logo = $this->get_theme_logo_dark_url(); if ($logo) { return $logo; } return $this->get_logo(); } /** * Get the main logo URL. * * @return string */ public function get_theme_logo_url() { $theme = theme_config::load('moove'); return $theme->setting_file_url('logo', 'logo'); } /** * Get the main dark logo URL. * * @return string */ public function get_theme_logo_dark_url() { $theme = theme_config::load('moove'); return $theme->setting_file_url('logodark', 'logodark'); } /** * Renders the login form. * * @param \core_auth\output\login $form The renderable. * @return string */ public function render_login(\core_auth\output\login $form) { global $SITE, $CFG; $context = $form->export_for_template($this); $context->errorformatted = $this->error_text($context->error); $context->logourl = $this->get_logo(); $context->sitename = format_string( $SITE->fullname, true, ['context' => context_course::instance(SITEID), "escape" => false] ); if (!$CFG->auth_instructions) { $context->instructions = null; $context->hasinstructions = false; } $context->hastwocolumns = false; if ($CFG->auth_instructions) { $context->hastwocolumns = true; } if ($context->identityproviders) { foreach ($context->identityproviders as $key => $provider) { $isfacebook = false; if (!empty($provider['iconurl']) && strpos($provider['iconurl'], 'facebook') !== false) { $isfacebook = true; } $context->identityproviders[$key]['isfacebook'] = $isfacebook; } } return $this->render_from_template('core/loginform', $context); } /** * Returns the HTML for the site support email link * * @param array $customattribs Array of custom attributes for the support email anchor tag. * @param bool $embed Set to true if you want to embed the link in other inline content. * @return string The html code for the support email link. */ public function supportemail(array $customattribs = [], bool $embed = false): string { global $CFG; // Do not provide a link to contact site support if it is unavailable to this user. This would be where the site has // disabled support, or limited it to authenticated users and the current user is a guest or not logged in. if ( !isset($CFG->supportavailability) || $CFG->supportavailability == CONTACT_SUPPORT_DISABLED || ($CFG->supportavailability == CONTACT_SUPPORT_AUTHENTICATED && (!isloggedin() || isguestuser())) ) { return ''; } $label = get_string('contactsitesupport', 'admin'); $icon = $this->pix_icon('t/life-ring', '', 'moodle', ['class' => 'iconhelp icon-pre']); $content = $icon . $label; if ($embed) { $content = $label; } if (!empty($CFG->supportpage)) { $attributes = ['href' => $CFG->supportpage, 'target' => 'blank', 'class' => 'btn contactsitesupport btn-outline-info']; $content .= $this->pix_icon('i/externallink', '', 'moodle', ['class' => 'ml-1']); } else { $attributes = [ 'href' => $CFG->wwwroot . '/user/contactsitesupport.php', 'class' => 'btn contactsitesupport btn-outline-info', ]; } $attributes += $customattribs; return html_writer::tag('a', $content, $attributes); } /** * Returns the moodle_url for the favicon. * * @since Moodle 2.5.1 2.6 * @return moodle_url The moodle_url for the favicon */ public function favicon() { global $CFG; $theme = theme_config::load('moove'); $favicon = $theme->setting_file_url('favicon', 'favicon'); if (!empty(($favicon))) { $urlreplace = preg_replace('|^https?://|i', '//', $CFG->wwwroot); $favicon = str_replace($urlreplace, '', $favicon); return new moodle_url($favicon); } return parent::favicon(); } /** * Returns standard navigation between activities in a course. * * @return string the navigation HTML. */ public function activity_navigation() { // First we should check if we want to add navigation. $context = $this->page->context; if ( ($this->page->pagelayout !== 'incourse' && $this->page->pagelayout !== 'frametop') || $context->contextlevel != CONTEXT_MODULE ) { return ''; } // If the activity is in stealth mode, show no links. if ($this->page->cm->is_stealth()) { return ''; } $course = $this->page->cm->get_course(); // Get a list of all the activities in the course. $modules = get_fast_modinfo($course->id)->get_cms(); // Put the modules into an array in order by the position they are shown in the course. $mods = []; $activitylist = []; foreach ($modules as $module) { // Only add activities the user can access, aren't in stealth mode and have a url (eg. mod_label does not). if (!$module->uservisible || $module->is_stealth() || empty($module->url)) { continue; } $mods[$module->id] = $module; // No need to add the current module to the list for the activity dropdown menu. if ($module->id == $this->page->cm->id) { continue; } // Module name. $modname = $module->get_formatted_name(); // Display the hidden text if necessary. if (!$module->visible) { $modname .= ' ' . get_string('hiddenwithbrackets'); } // Module URL. $linkurl = new moodle_url($module->url, ['forceview' => 1]); // Add module URL (as key) and name (as value) to the activity list array. $activitylist[$linkurl->out(false)] = $modname; } $nummods = count($mods); // If there is only one mod then do nothing. if ($nummods == 1) { return ''; } // Get an array of just the course module ids used to get the cmid value based on their position in the course. $modids = array_keys($mods); // Get the position in the array of the course module we are viewing. $position = array_search($this->page->cm->id, $modids); $prevmod = null; $nextmod = null; // Check if we have a previous mod to show. if ($position > 0) { $prevmod = $mods[$modids[$position - 1]]; } // Check if we have a next mod to show. if ($position < ($nummods - 1)) { $nextmod = $mods[$modids[$position + 1]]; } $activitynav = new activity_navigation($prevmod, $nextmod, $activitylist); $renderer = $this->page->get_renderer('core', 'course'); return $renderer->render($activitynav); } /** * Returns plugins callback renderable data to be printed on navbar. * * @return string Final html code. */ public function get_navbar_callbacks_data() { $callbacks = get_plugins_with_function('moove_additional_header', 'lib.php', true, true); if (!$callbacks) { return ''; } $output = ''; foreach ($callbacks as $plugins) { foreach ($plugins as $pluginfunction) { if (function_exists($pluginfunction)) { $output .= $pluginfunction(); } } } return $output; } /** * Returns plugins callback renderable data to be printed on navbar. * * @return string Final html code. */ public function get_module_footer_callbacks_data() { $callbacks = get_plugins_with_function('moove_module_footer', 'lib.php', true, true); if (!$callbacks) { return ''; } $output = ''; foreach ($callbacks as $plugins) { foreach ($plugins as $pluginfunction) { if (function_exists($pluginfunction)) { $output .= $pluginfunction(); } } } return $output; } /** * Redirects the user by any means possible given the current state * * This function should not be called directly, it should always be called using * the redirect function in lib/weblib.php * * The redirect function should really only be called before page output has started * however it will allow itself to be called during the state STATE_IN_BODY * * @param string $encodedurl The URL to send to encoded if required * @param string $message The message to display to the user if any * @param int $delay The delay before redirecting a user, if $message has been * set this is a requirement and defaults to 3, set to 0 no delay * @param boolean $debugdisableredirect this redirect has been disabled for * debugging purposes. Display a message that explains, and don't * trigger the redirect. * @param string $messagetype The type of notification to show the message in. * See constants on \core\output\notification. * @return string The HTML to display to the user before dying, may contain * meta refresh, javascript refresh, and may have set header redirects */ public function redirect_message( $encodedurl, $message, $delay, $debugdisableredirect, $messagetype = \core\output\notification::NOTIFY_INFO ) { $url = str_replace('&', '&', $encodedurl); switch($this->page->state) { case \moodle_page::STATE_BEFORE_HEADER : // No output yet it is safe to delivery the full arsenal of redirect methods. if (!$debugdisableredirect) { // Don't use exactly the same time here, it can cause problems when both redirects fire at the same time. $this->metarefreshtag = '<meta http-equiv="refresh" content="' . $delay . '; url=' . $encodedurl . '" />'; $this->page->requires->js_function_call('document.location.replace', [$url], false, ($delay + 3)); } $output = $this->header(); break; case \moodle_page::STATE_PRINTING_HEADER: // We should hopefully never get here. throw new \coding_exception('You cannot redirect while printing the page header'); break; case \moodle_page::STATE_IN_BODY: // We really shouldn't be here but we can deal with this. debugging("You should really redirect before you start page output"); if (!$debugdisableredirect) { $this->page->requires->js_function_call('document.location.replace', [$url], false, $delay); } $output = $this->opencontainers->pop_all_but_last(); break; case \moodle_page::STATE_DONE: // Too late to be calling redirect now. throw new \coding_exception('You cannot redirect after the entire page has been generated'); break; } $output .= $this->notification($message, $messagetype); $output .= $this->render_from_template('theme_moove/loading-overlay', ['encodedurl' => $encodedurl]); if ($debugdisableredirect) { $output .= '<p><strong>' . get_string('erroroutput', 'error') . '</strong></p>'; } $output .= $this->footer(); return $output; } /** * Renders the "breadcrumb" for all pages in boost. * * @return string the HTML for the navbar. */ public function navbar(): string { $newnav = new \theme_moove\output\boostnavbar($this->page); return $this->render_from_template('core/navbar', $newnav); } /** * Render my learning controls * * @return string My learning controls html content. */ public function render_mylearning_controls() { if (!isloggedin() || isguestuser()) { return ''; } return $this->render_from_template('theme_moove/moove/mylearning', []); } /** * Render darkmode controls * * @return string Dark mode controls html content. */ public function render_darkmode_controls() { if (!isloggedin() || isguestuser()) { return ''; } $settings = new settings(); if (!$settings->enabledarkmode) { return ''; } return $this->render_from_template('theme_moove/moove/darkmode', []); } }
CANCEL
Name
Type
Size
Modified
Actions
↩ ..
DIR
—
—
📁 core/
DIR
—
2026-03-11 08:11
📁 core_course/
DIR
—
2026-03-11 08:11
📄 boostnavbar.php
PHP
13.2 KB
2026-03-11 08:11
EDIT
📄 core_renderer.php
PHP
18.8 KB
2026-03-11 08:11
EDIT
📄 renderer.php
PHP
1.1 KB
2026-03-11 08:11
EDIT