MDL-40821 theme_bootstrapbase: show the current lang in the menu
[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             $strlang =  get_string('language');
109             $currentlang = current_language();
110             if (isset($langs[$currentlang])) {
111                 $currentlang = $langs[$currentlang];
112             } else {
113                 $currentlang = $strlang;
114             }
115             $this->language = $menu->add($currentlang, new moodle_url('#'), $strlang, 10000);
116             foreach ($langs as $langtype => $langname) {
117                 $this->language->add($langname, new moodle_url($this->page->url, array('lang' => $langtype)), $langname);
118             }
119         }
121         $content = '<ul class="nav">';
122         foreach ($menu->get_children() as $item) {
123             $content .= $this->render_custom_menu_item($item, 1);
124         }
126         return $content.'</ul>';
127     }
129     /*
130      * This code renders the custom menu items for the
131      * bootstrap dropdown menu.
132      */
133     protected function render_custom_menu_item(custom_menu_item $menunode, $level = 0 ) {
134         static $submenucount = 0;
136         if ($menunode->has_children()) {
138             if ($level == 1) {
139                 $class = 'dropdown';
140             } else {
141                 $class = 'dropdown-submenu';
142             }
144             if ($menunode === $this->language) {
145                 $class .= ' langmenu';
146             }
147             $content = html_writer::start_tag('li', array('class' => $class));
148             // If the child has menus render it as a sub menu.
149             $submenucount++;
150             if ($menunode->get_url() !== null) {
151                 $url = $menunode->get_url();
152             } else {
153                 $url = '#cm_submenu_'.$submenucount;
154             }
155             $content .= html_writer::start_tag('a', array('href'=>$url, 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'title'=>$menunode->get_title()));
156             $content .= $menunode->get_text();
157             if ($level == 1) {
158                 $content .= '<b class="caret"></b>';
159             }
160             $content .= '</a>';
161             $content .= '<ul class="dropdown-menu">';
162             foreach ($menunode->get_children() as $menunode) {
163                 $content .= $this->render_custom_menu_item($menunode, 0);
164             }
165             $content .= '</ul>';
166         } else {
167             $content = '<li>';
168             // The node doesn't have children so produce a final menuitem.
169             if ($menunode->get_url() !== null) {
170                 $url = $menunode->get_url();
171             } else {
172                 $url = '#';
173             }
174             $content .= html_writer::link($url, $menunode->get_text(), array('title'=>$menunode->get_title()));
175         }
176         return $content;
177     }
179     /**
180      * Renders tabtree
181      *
182      * @param tabtree $tabtree
183      * @return string
184      */
185     protected function render_tabtree(tabtree $tabtree) {
186         if (empty($tabtree->subtree)) {
187             return '';
188         }
189         $firstrow = $secondrow = '';
190         foreach ($tabtree->subtree as $tab) {
191             $firstrow .= $this->render($tab);
192             if (($tab->selected || $tab->activated) && !empty($tab->subtree) && $tab->subtree !== array()) {
193                 $secondrow = $this->tabtree($tab->subtree);
194             }
195         }
196         return html_writer::tag('ul', $firstrow, array('class' => 'nav nav-tabs')) . $secondrow;
197     }
199     /**
200      * Renders tabobject (part of tabtree)
201      *
202      * This function is called from {@link core_renderer::render_tabtree()}
203      * and also it calls itself when printing the $tabobject subtree recursively.
204      *
205      * @param tabobject $tabobject
206      * @return string HTML fragment
207      */
208     protected function render_tabobject(tabobject $tab) {
209         if ($tab->selected or $tab->activated) {
210             return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'active'));
211         } else if ($tab->inactive) {
212             return html_writer::tag('li', html_writer::tag('a', $tab->text), array('class' => 'disabled'));
213         } else {
214             if (!($tab->link instanceof moodle_url)) {
215                 // backward compartibility when link was passed as quoted string
216                 $link = "<a href=\"$tab->link\" title=\"$tab->title\">$tab->text</a>";
217             } else {
218                 $link = html_writer::link($tab->link, $tab->text, array('title' => $tab->title));
219             }
220             return html_writer::tag('li', $link);
221         }
222     }