Files
moodle/theme/bootstrapbase/renderers/core_renderer.php
T
Sam Hemelryk 09d5cfadc5 MDL-44729 theme_bootstrapbase: override the maintenance renderer
This patch overrides the maintenance renderer in the bootstrapbase
theme in order to override the notification method in the same way
we override the core renderer notification method.
This ensures now that clean is standard that notifications during
maintenance tasks (install, upgrade etc) look pretty.
2014-05-02 13:42:22 +12:00

269 lines
9.5 KiB
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/>.
/**
* Renderers to align Moodle's HTML with that expected by Bootstrap
*
* @package theme_bootstrapbase
* @copyright 2012 Bas Brands, www.basbrands.nl
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class theme_bootstrapbase_core_renderer extends core_renderer {
/** @var custom_menu_item language The language menu if created */
protected $language = null;
/*
* This renders a notification message.
* Uses bootstrap compatible html.
*/
public function notification($message, $classes = 'notifyproblem') {
$message = clean_text($message);
$type = '';
if (($classes == 'notifyproblem') || ($classes == 'notifytiny')) {
$type = 'alert alert-error';
}
if ($classes == 'notifysuccess') {
$type = 'alert alert-success';
}
if ($classes == 'notifymessage') {
$type = 'alert alert-info';
}
if ($classes == 'redirectmessage') {
$type = 'alert alert-block alert-info';
}
return "<div class=\"$type\">$message</div>";
}
/*
* This renders the navbar.
* Uses bootstrap compatible html.
*/
public function navbar() {
$items = $this->page->navbar->get_items();
$breadcrumbs = array();
foreach ($items as $item) {
$item->hideicon = true;
$breadcrumbs[] = $this->render($item);
}
$divider = '<span class="divider">'.get_separator().'</span>';
$list_items = '<li>'.join(" $divider</li><li>", $breadcrumbs).'</li>';
$title = '<span class="accesshide">'.get_string('pagepath').'</span>';
return $title . "<ul class=\"breadcrumb\">$list_items</ul>";
}
/*
* Overriding the custom_menu function ensures the custom menu is
* always shown, even if no menu items are configured in the global
* theme settings page.
*/
public function custom_menu($custommenuitems = '') {
global $CFG;
if (!empty($CFG->custommenuitems)) {
$custommenuitems .= $CFG->custommenuitems;
}
$custommenu = new custom_menu($custommenuitems, current_language());
return $this->render_custom_menu($custommenu);
}
/*
* This renders the bootstrap top menu.
*
* This renderer is needed to enable the Bootstrap style navigation.
*/
protected function render_custom_menu(custom_menu $menu) {
global $CFG;
// TODO: eliminate this duplicated logic, it belongs in core, not
// here. See MDL-39565.
$addlangmenu = true;
$langs = get_string_manager()->get_list_of_translations();
if (count($langs) < 2
or empty($CFG->langmenu)
or ($this->page->course != SITEID and !empty($this->page->course->lang))) {
$addlangmenu = false;
}
if (!$menu->has_children() && $addlangmenu === false) {
return '';
}
if ($addlangmenu) {
$strlang = get_string('language');
$currentlang = current_language();
if (isset($langs[$currentlang])) {
$currentlang = $langs[$currentlang];
} else {
$currentlang = $strlang;
}
$this->language = $menu->add($currentlang, new moodle_url('#'), $strlang, 10000);
foreach ($langs as $langtype => $langname) {
$this->language->add($langname, new moodle_url($this->page->url, array('lang' => $langtype)), $langname);
}
}
$content = '<ul class="nav">';
foreach ($menu->get_children() as $item) {
$content .= $this->render_custom_menu_item($item, 1);
}
return $content.'</ul>';
}
/*
* This code renders the custom menu items for the
* bootstrap dropdown menu.
*/
protected function render_custom_menu_item(custom_menu_item $menunode, $level = 0 ) {
static $submenucount = 0;
if ($menunode->has_children()) {
if ($level == 1) {
$class = 'dropdown';
} else {
$class = 'dropdown-submenu';
}
if ($menunode === $this->language) {
$class .= ' langmenu';
}
$content = html_writer::start_tag('li', array('class' => $class));
// If the child has menus render it as a sub menu.
$submenucount++;
if ($menunode->get_url() !== null) {
$url = $menunode->get_url();
} else {
$url = '#cm_submenu_'.$submenucount;
}
$content .= html_writer::start_tag('a', array('href'=>$url, 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'title'=>$menunode->get_title()));
$content .= $menunode->get_text();
if ($level == 1) {
$content .= '<b class="caret"></b>';
}
$content .= '</a>';
$content .= '<ul class="dropdown-menu">';
foreach ($menunode->get_children() as $menunode) {
$content .= $this->render_custom_menu_item($menunode, 0);
}
$content .= '</ul>';
} else {
$content = '<li>';
// The node doesn't have children so produce a final menuitem.
if ($menunode->get_url() !== null) {
$url = $menunode->get_url();
} else {
$url = '#';
}
$content .= html_writer::link($url, $menunode->get_text(), array('title'=>$menunode->get_title()));
}
return $content;
}
/**
* Renders tabtree
*
* @param tabtree $tabtree
* @return string
*/
protected function render_tabtree(tabtree $tabtree) {
if (empty($tabtree->subtree)) {
return '';
}
$firstrow = $secondrow = '';
foreach ($tabtree->subtree as $tab) {
$firstrow .= $this->render($tab);
if (($tab->selected || $tab->activated) && !empty($tab->subtree) && $tab->subtree !== array()) {
$secondrow = $this->tabtree($tab->subtree);
}
}
return html_writer::tag('ul', $firstrow, array('class' => 'nav nav-tabs')) . $secondrow;
}
/**
* Renders tabobject (part of tabtree)
*
* This function is called from {@link core_renderer::render_tabtree()}
* and also it calls itself when printing the $tabobject subtree recursively.
*
* @param tabobject $tabobject
* @return string HTML fragment
*/
protected function render_tabobject(tabobject $tab) {
if ($tab->selected or $tab->activated) {
return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'active'));
} else if ($tab->inactive) {
return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'disabled'));
} else {
if (!($tab->link instanceof moodle_url)) {
// backward compartibility when link was passed as quoted string
$link = "<a href=\"$tab->link\" title=\"$tab->title\">$tab->text</a>";
} else {
$link = html_writer::link($tab->link, $tab->text, array('title' => $tab->title));
}
return html_writer::tag('li', $link);
}
}
}
/**
* Overridden core maintenance renderer.
*
* This renderer gets used instead of the standard core_renderer during maintenance
* tasks such as installation and upgrade.
* We override it in order to style those scenarios consistently with the regular
* bootstrap look and feel.
*
* @package theme_bootstrapbase
* @copyright 2014 Sam Hemelryk
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class theme_bootstrapbase_core_renderer_maintenance extends core_renderer_maintenance {
/**
* Renders notifications for maintenance scripts.
*
* We need to override this method in the same way we do for the core_renderer maintenance method
* found above.
* Please note this isn't required of every function, only functions used during maintenance.
* In this case notification is used to print errors and we want pretty errors.
*
* @param string $message
* @param string $classes
* @return string
*/
public function notification($message, $classes = 'notifyproblem') {
$message = clean_text($message);
$type = '';
if (($classes == 'notifyproblem') || ($classes == 'notifytiny')) {
$type = 'alert alert-error';
}
if ($classes == 'notifysuccess') {
$type = 'alert alert-success';
}
if ($classes == 'notifymessage') {
$type = 'alert alert-info';
}
if ($classes == 'redirectmessage') {
$type = 'alert alert-block alert-info';
}
return "<div class=\"$type\">$message</div>";
}
}