1.20.x system.menu.inc | system_menu_tree_prune_tree(array &$tree, $level, array $parent_item = NULL) |
Prune a tree so that it begins at the specified level.
This function will follow the active menu trail to the specified level.
Parameters
array $tree: The menu tree to prune.
int $level: The level of the original tree that will start the pruned tree.
array $parent_item: The menu item that should be used as the root of the tree.
File
- modules/
system/ system.menu.inc, line 297
Code
function system_menu_tree_prune_tree(array &$tree, $level, array $parent_item = NULL) {
if (!empty($parent_item)) {
// Prune the tree along the path to the menu item.
for ($i = 1; $i <= MENU_MAX_DEPTH && $parent_item["p$i"] != '0'; $i++) {
$plid = $parent_item["p$i"];
$found_active_trail = FALSE;
// Examine each element at this level for the ancestor.
foreach ($tree as $key => &$value) {
if ($tree[$key]['link']['mlid'] == $plid) {
system_menu_block_set_title($tree[$key]['link']);
// Prune the tree to the children of this ancestor.
$tree = $tree[$key]['below'] ? $tree[$key]['below'] : array();
$found_active_trail = TRUE;
break;
}
}
// If we don't find the ancestor, bail out.
if (!$found_active_trail) {
$tree = array();
break;
}
}
}
$is_front_page = backdrop_is_front_page();
// Trim the upper levels down to the one desired.
for ($i = 1; $i < $level; $i++) {
$found_active_trail = FALSE;
// Examine each element at this level for the active trail.
foreach ($tree as $key => &$value) {
// Also include the children of the home page.
if ($tree[$key]['link']['in_active_trail'] || ($tree[$key]['link']['link_path'] == '<front>' && $is_front_page)) {
// Get the title for the pruned tree.
system_menu_block_set_title($tree[$key]['link']);
// Prune the tree to the children of the item in the active trail.
$tree = $tree[$key]['below'] ? $tree[$key]['below'] : array();
$found_active_trail = TRUE;
break;
}
}
// If we don't find the active trail, the active item isn't in the tree we want.
if (!$found_active_trail) {
$tree = array();
break;
}
}
}