b87d9c4adb93444d4a293fb02a4ea9e459af5d72
[moodle.git] / theme / bootstrapbase / renderers / core_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  * Renderers to align Moodle's HTML with that expected by Bootstrap
19  *
20  * @package    theme_bootstrapbase
21  * @copyright  2012
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 class theme_bootstrapbase_core_renderer extends core_renderer {
27     /** @var custom_menu_item language The language menu if created */
28     protected $language = null;
30     /*
31      * This renders a notification message.
32      * Uses bootstrap compatible html.
33      */
34     public function notification($message, $classes = 'notifyproblem') {
35         $message = clean_text($message);
36         $type = '';
38         if ($classes == 'notifyproblem') {
39             $type = 'alert alert-error';
40         }
41         if ($classes == 'notifysuccess') {
42             $type = 'alert alert-success';
43         }
44         if ($classes == 'notifymessage') {
45             $type = 'alert alert-info';
46         }
47         if ($classes == 'redirectmessage') {
48             $type = 'alert alert-block alert-info';
49         }
50         return "<div class=\"$type\">$message</div>";
51     }
53     /*
54      * This renders the navbar.
55      * Uses bootstrap compatible html.
56      */
57     public function navbar() {
58         $items = $this->page->navbar->get_items();
59         $breadcrumbs = array();
60         foreach ($items as $item) {
61             $item->hideicon = true;
62             $breadcrumbs[] = $this->render($item);
63         }
64         $divider = '<span class="divider">/</span>';
65         $list_items = '<li>'.join(" $divider</li><li>", $breadcrumbs).'</li>';
66         $title = '<span class="accesshide">'.get_string('pagepath').'</span>';
67         return $title . "<ul class=\"breadcrumb\">$list_items</ul>";
68     }
70     /*
71      * Overriding the custom_menu function ensures the custom menu is
72      * always shown, even if no menu items are configured in the global
73      * theme settings page.
74      */
75     public function custom_menu($custommenuitems = '') {
76         global $CFG;
78         if (!empty($CFG->custommenuitems)) {
79             $custommenuitems .= $CFG->custommenuitems;
80         }
81         $custommenu = new custom_menu($custommenuitems, current_language());
82         return $this->render_custom_menu($custommenu);
83     }
85     /*
86      * This renders the bootstrap top menu.
87      *
88      * This renderer is needed to enable the Bootstrap style navigation.
89      */
90     protected function render_custom_menu(custom_menu $menu) {
91         global $CFG;
93         // TODO: eliminate this duplicated logic, it belongs in core, not
94         // here. See MDL-39565.
95         $addlangmenu = true;
96         $langs = get_string_manager()->get_list_of_translations();
97         if (count($langs) < 2
98             or empty($CFG->langmenu)
99             or ($this->page->course != SITEID and !empty($this->page->course->lang))) {
100             $addlangmenu = false;
101         }
103         if (!$menu->has_children() && $addlangmenu === false) {
104             return '';
105         }
107         if ($addlangmenu) {
108             $this->language = $menu->add(get_string('language'), new moodle_url('#'), get_string('language'), 10000);
109             foreach ($langs as $langtype => $langname) {
110                 $this->language->add($langname, new moodle_url($this->page->url, array('lang' => $langtype)), $langname);
111             }
112         }
114         $content = '<ul class="nav">';
115         foreach ($menu->get_children() as $item) {
116             $content .= $this->render_custom_menu_item($item, 1);
117         }
119         return $content.'</ul>';
120     }
122     /*
123      * This code renders the custom menu items for the
124      * bootstrap dropdown menu.
125      */
126     protected function render_custom_menu_item(custom_menu_item $menunode, $level = 0 ) {
127         static $submenucount = 0;
129         if ($menunode->has_children()) {
131             if ($level == 1) {
132                 $class = 'dropdown';
133             } else {
134                 $class = 'dropdown-submenu';
135             }
137             if ($menunode === $this->language) {
138                 $class .= ' langmenu';
139             }
140             $content = html_writer::start_tag('li', array('class' => $class));
141             // If the child has menus render it as a sub menu.
142             $submenucount++;
143             if ($menunode->get_url() !== null) {
144                 $url = $menunode->get_url();
145             } else {
146                 $url = '#cm_submenu_'.$submenucount;
147             }
148             $content .= html_writer::start_tag('a', array('href'=>$url, 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'title'=>$menunode->get_title()));
149             $content .= $menunode->get_text();
150             if ($level == 1) {
151                 $content .= '<b class="caret"></b>';
152             }
153             $content .= '</a>';
154             $content .= '<ul class="dropdown-menu">';
155             foreach ($menunode->get_children() as $menunode) {
156                 $content .= $this->render_custom_menu_item($menunode, 0);
157             }
158             $content .= '</ul>';
159         } else {
160             $content = '<li>';
161             // The node doesn't have children so produce a final menuitem.
162             if ($menunode->get_url() !== null) {
163                 $url = $menunode->get_url();
164             } else {
165                 $url = '#';
166             }
167             $content .= html_writer::link($url, $menunode->get_text(), array('title'=>$menunode->get_title()));
168         }
169         return $content;
170     }
172     /**
173      * Renders tabtree
174      *
175      * @param tabtree $tabtree
176      * @return string
177      */
178     protected function render_tabtree(tabtree $tabtree) {
179         if (empty($tabtree->subtree)) {
180             return '';
181         }
182         $firstrow = $secondrow = '';
183         foreach ($tabtree->subtree as $tab) {
184             $firstrow .= $this->render($tab);
185             if (($tab->selected || $tab->activated) && !empty($tab->subtree) && $tab->subtree !== array()) {
186                 $secondrow = $this->tabtree($tab->subtree);
187             }
188         }
189         return html_writer::tag('ul', $firstrow, array('class' => 'nav nav-tabs')) . $secondrow;
190     }
192     /**
193      * Renders tabobject (part of tabtree)
194      *
195      * This function is called from {@link core_renderer::render_tabtree()}
196      * and also it calls itself when printing the $tabobject subtree recursively.
197      *
198      * @param tabobject $tabobject
199      * @return string HTML fragment
200      */
201     protected function render_tabobject(tabobject $tab) {
202         if ($tab->selected or $tab->activated) {
203             return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'active'));
204         } else if ($tab->inactive) {
205             return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'disabled'));
206         } else {
207             if (!($tab->link instanceof moodle_url)) {
208                 // backward compartibility when link was passed as quoted string
209                 $link = "<a href=\"$tab->link\" title=\"$tab->title\">$tab->text</a>";
210             } else {
211                 $link = html_writer::link($tab->link, $tab->text, array('title' => $tab->title));
212             }
213             return html_writer::tag('li', $link);
214         }
215     }