function _site_map_menu_tree_output in Site map 7
Same name and namespace in other branches
- 6.2 site_map.module \_site_map_menu_tree_output()
Returns a rendered menu tree.
This is a clone of the core menu_tree_output() function with the exception of theme('site_map_menu_tree') for theming override reasons.
The menu item's LI element is given one of the following classes:
- expanded: The menu item is showing its submenu.
- collapsed: The menu item has a submenu which is not shown.
- leaf: The menu item has no submenu.
@codingStandardsIgnoreStart
Parameters
array $tree: A data structure representing the tree as returned from menu_tree_data.
Return value
array A structured array to be rendered by drupal_render().
2 calls to _site_map_menu_tree_output()
- _site_map_books in ./
site_map.module - Render the latest maps for books.
- _site_map_menus in ./
site_map.module - Render the latest maps for all the menus.
File
- ./
site_map.module, line 777 - site_map.module
Code
function _site_map_menu_tree_output($tree) {
// @codingStandardsIgnoreEnd
$build = array();
$items = array();
// Pull out just the menu links we are going to render so that we
// get an accurate count for the first/last classes.
// Thanks for fix by zhuber at https://drupal.org/node/1331104#comment-5200266
foreach ($tree as $data) {
if ($data['link']['access'] && (!$data['link']['hidden'] || variable_get('site_map_show_menus_hidden', 0))) {
$items[] = $data;
}
}
$router_item = menu_get_item();
$num_items = count($items);
foreach ($items as $i => $data) {
$class = array();
if ($i == 0) {
$class[] = 'first';
}
if ($i == $num_items - 1) {
$class[] = 'last';
}
// Set a class for the <li>-tag. Since $data['below'] may contain local
// tasks, only set 'expanded' class if the link also has children within
// the current menu.
if ($data['link']['has_children'] && $data['below']) {
$class[] = 'expanded';
}
elseif ($data['link']['has_children']) {
$class[] = 'collapsed';
}
else {
$class[] = 'leaf';
}
// Set a class if the link is in the active trail.
if ($data['link']['in_active_trail']) {
$class[] = 'active-trail';
$data['link']['localized_options']['attributes']['class'][] = 'active-trail';
}
// Normally, l() compares the href of every link with $_GET['q'] and sets
// the active class accordingly. But local tasks do not appear in menu
// trees, so if the current path is a local task, and this link is its
// tab root, then we have to set the class manually.
if ($data['link']['href'] == $router_item['tab_root_href'] && $data['link']['href'] != $_GET['q']) {
$data['link']['localized_options']['attributes']['class'][] = 'active';
}
// Allow menu-specific theme overrides.
$element['#theme'] = 'site_map_menu_link__' . strtr($data['link']['menu_name'], '-', '_');
$element['#attributes']['class'] = $class;
$element['#title'] = $data['link']['title'];
$element['#href'] = $data['link']['href'];
$element['#title'] = $data['link']['title'];
if (variable_get('site_map_show_node_titles', 1) == 1) {
if (strpos($element['#href'], 'node/') !== FALSE) {
$url = $element['#href'];
$nid = basename($url);
$node = node_load($nid);
if (isset($node->title)) {
$element['#title'] = $node->title;
}
}
}
$element['#localized_options'] = !empty($data['link']['localized_options']) ? $data['link']['localized_options'] : array();
$element['#below'] = $data['below'] ? _site_map_menu_tree_output($data['below']) : $data['below'];
$element['#original_link'] = $data['link'];
// Index using the link's unique mlid.
$build[$data['link']['mlid']] = $element;
}
if ($build) {
// Make sure drupal_render() does not re-order the links.
$build['#sorted'] = TRUE;
// Add the theme wrapper for outer markup.
// Allow menu-specific theme overrides.
$build['#theme_wrappers'][] = 'site_map_menu_tree__' . strtr($data['link']['menu_name'], '-', '_');
}
return $build;
}