6ef43a40df6789fbe834320ca3abba93715b6ac8
[moodle.git] / blocks / navigation / renderer.php
1 <?php
3 class block_navigation_renderer extends plugin_renderer_base {
4     
5     public function navigation_tree(global_navigation $navigation, $expansionlimit, array $options = array()) {
6         $navigation->add_class('navigation_node');
7         $content = $this->navigation_node(array($navigation), array('class'=>'block_tree list'), $expansionlimit, $options);
8         if (isset($navigation->id) && !is_numeric($navigation->id) && !empty($content)) {
9             $content = $this->output->box($content, 'block_tree_box', $navigation->id);
10         }
11         return $content;
12     }
14     protected function navigation_node($items, $attrs=array(), $expansionlimit=null, array $options = array(), $depth=1) {
16         // exit if empty, we don't want an empty ul element
17         if (count($items)==0) {
18             return '';
19         }
21         // array of nested li elements
22         $lis = array();
23         foreach ($items as $item) {
24             if (!$item->display) {
25                 continue;
26             }
27             $content = $item->get_content();
28             $title = $item->get_title();
29             $isbranch = ($item->type !== $expansionlimit && ($item->children->count() > 0 || ($item->nodetype == navigation_node::NODETYPE_BRANCH && $item->children->count()==0 && (isloggedin() || $item->type <= navigation_node::TYPE_CATEGORY))));
30             $hasicon = ((!$isbranch || $item->type == navigation_node::TYPE_ACTIVITY)&& $item->icon instanceof renderable);
32             if ($hasicon) {
33                 $icon = $this->output->render($item->icon);
34                 $content = $icon.$content; // use CSS for spacing of icons
35             }
36             if ($item->helpbutton !== null) {
37                 $content = trim($item->helpbutton).html_writer::tag('span', $content, array('class'=>'clearhelpbutton'));
38             }
40             if ($content === '') {
41                 continue;
42             }
44             $attributes = array();
45             if ($title !== '') {
46                 $attributes['title'] = $title;
47             }
48             if ($item->hidden) {
49                 $attributes['class'] = 'dimmed_text';
50             }
51             if (is_string($item->action) || empty($item->action) || ($item->type === navigation_node::TYPE_CATEGORY && empty($options['linkcategories']))) {
52                 $content = html_writer::tag('span', $content, $attributes);
53             } else if ($item->action instanceof action_link) {
54                 //TODO: to be replaced with something else
55                 $link = $item->action;
56                 $link->attributes = array_merge($link->attributes, $attributes);
57                 $content = $this->output->render($link);
58                 $linkrendered = true;
59             } else if ($item->action instanceof moodle_url) {
60                 $content = html_writer::link($item->action, $content, $attributes);
61             }
63             // this applies to the li item which contains all child lists too
64             $liclasses = array($item->get_css_type(), 'depth_'.$depth);
65             if ($item->has_children() && (!$item->forceopen || $item->collapse)) {
66                 $liclasses[] = 'collapsed';
67             }
68             if ($isbranch) {
69                 $liclasses[] = 'contains_branch';
70             } else if ($hasicon) {
71                 $liclasses[] = 'item_with_icon';
72             }
73             if ($item->isactive === true) {
74                 $liclasses[] = 'current_branch';
75             }
76             $liattr = array('class'=>join(' ',$liclasses));
77             // class attribute on the div item which only contains the item content
78             $divclasses = array('tree_item');
79             if ($isbranch) {
80                 $divclasses[] = 'branch';
81             } else {
82                 $divclasses[] = 'leaf';
83             }
84             if ($hasicon) {
85                 $divclasses[] = 'hasicon';
86             }
87             if (!empty($item->classes) && count($item->classes)>0) {
88                 $divclasses[] = join(' ', $item->classes);
89             }
90             $divattr = array('class'=>join(' ', $divclasses));
91             if (!empty($item->id)) {
92                 $divattr['id'] = $item->id;
93             }
94             $content = html_writer::tag('p', $content, $divattr) . $this->navigation_node($item->children, array(), $expansionlimit, $options, $depth+1);
95             if (!empty($item->preceedwithhr) && $item->preceedwithhr===true) {
96                 $content = html_writer::empty_tag('hr') . $content;
97             }
98             $content = html_writer::tag('li', $content, $liattr);
99             $lis[] = $content;
100         }
102         if (count($lis)) {
103             return html_writer::tag('ul', implode("\n", $lis), $attrs);
104         } else {
105             return '';
106         }
107     }