| Versionen | |
|---|---|
| drupal6 – drupal7 | menu_set_active_trail($new_trail = NULL) |
Set (or get) the active trail for the current page - the path to root in the menu tree.
includes/
<?php
function menu_set_active_trail($new_trail = NULL) {
$trail = &drupal_static(__FUNCTION__);
if (isset($new_trail)) {
$trail = $new_trail;
}
elseif (!isset($trail)) {
$trail = array();
$trail[] = array('title' => t('Home'), 'href' => '<front>', 'localized_options' => array(), 'type' => 0);
$item = menu_get_item();
// Check whether the current item is a local task (displayed as a tab).
if ($item['tab_parent']) {
// The title of a local task is used for the tab, never the page title.
// Thus, replace it with the item corresponding to the root path to get
// the relevant href and title. For example, the menu item corresponding
// to 'admin' is used when on the 'By module' tab at 'admin/by-module'.
$parts = explode('/', $item['tab_root']);
$args = arg();
// Replace wildcards in the root path using the current path.
foreach ($parts as $index => $part) {
if ($part == '%') {
$parts[$index] = $args[$index];
}
}
// Retrieve the menu item using the root path after wildcard replacement.
$root_item = menu_get_item(implode('/', $parts));
if ($root_item && $root_item['access']) {
$item = $root_item;
}
}
$menu_names = menu_get_active_menu_names();
$curr = FALSE;
// Determine if the current page is a link in any of the active menus.
if ($menu_names) {
$query = db_select('menu_links', 'ml');
$query->fields('ml', array('menu_name'));
$query->condition('ml.link_path', $item['href']);
$query->condition('ml.menu_name', $menu_names, 'IN');
$result = $query->execute();
$found = array();
foreach ($result as $menu) {
$found[] = $menu->menu_name;
}
// The $menu_names array is ordered, so take the first one that matches.
$name = current(array_intersect($menu_names, $found));
if ($name !== FALSE) {
$tree = menu_tree_page_data($name);
list($key, $curr) = each($tree);
}
}
while ($curr) {
// Terminate the loop when we find the current path in the active trail.
if ($curr['link']['href'] == $item['href']) {
$trail[] = $curr['link'];
$curr = FALSE;
}
else {
// Add the link if it's in the active trail, then move to the link below.
if ($curr['link']['in_active_trail']) {
$trail[] = $curr['link'];
$tree = $curr['below'] ? $curr['below'] : array();
}
list($key, $curr) = each($tree);
}
}
// Make sure the current page is in the trail (needed for the page title),
// but exclude tabs and the front page.
$last = count($trail) - 1;
if ($trail[$last]['href'] != $item['href'] && !(bool) ($item['type'] & MENU_IS_LOCAL_TASK) && !drupal_is_front_page()) {
$trail[] = $item;
}
}
return $trail;
}
?>
Kommentare
Kommentar hinzufügen