Как получить все пункты меню ниже определенного родителя в drupal?
Мне действительно нужен только текст mlid и title для первого уровня ниже определенного пункта меню. Вот что я сейчас делаю. (Это работает, но я подозреваю, что может быть более drupal-y way.):
/**
* Get all the children menu items below 'Style Guide' and put them in this format:
* $menu_items[mlid] = 'menu-title'
* @return array
*/
function mymod_get_menu_items() {
$tree = menu_tree_all_data('primary-links');
$branches = $tree['49952 Parent Item 579']['below']; // had to dig for that ugly key
$menu_items = array();
foreach ($branches as $menu_item) {
$menu_items[$menu_item['link']['mlid']] = $menu_item['link']['title'];
}
return $menu_items;
}
Есть ли?
Ответы
Ответ 1
afaik, нет (надеюсь, я ошибаюсь).
на время, вместо того, чтобы рыть для уродливых ключей, вы можете превратить свою функцию в более абстрактную вспомогательную функцию, просто добавив foreach ($ tree). то вы можете использовать свою собственную логику для вывода того, что хотите (mlid, в данном случае). вот мое предложение:
/**
* Get the children of a menu item in a given menu.
*
* @param string $title
* The title of the parent menu item.
* @param string $menu
* The internal menu name.
*
* @return array
* The children of the given parent.
*/
function MY_MODULE_submenu_tree_all_data($title, $menu = 'primary-links') {
$tree = menu_tree_all_data($menu);
foreach ($tree as $branch) {
if ($branch['link']['title'] == $title) {
return $branch['below'];
}
}
return array();
}
Ответ 2
На самом деле есть простой способ получить эту информацию с помощью menu_build_tree():
// Set $path to the internal Drupal path of the parent or
// to NULL for the current path
$path = 'node/123';
$parent = menu_link_get_preferred($path);
$parameters = array(
'active_trail' => array($parent['plid']),
'only_active_trail' => FALSE,
'min_depth' => $parent['depth']+1,
'max_depth' => $parent['depth']+1,
'conditions' => array('plid' => $parent['mlid']),
);
$children = menu_build_tree($parent['menu_name'], $parameters);
$children
содержит всю необходимую информацию. menu_build_tree()
также проверяет ограничения на доступ или перевод, так что вы получаете только то, что пользователь действительно должен видеть.
Ответ 3
Вы заглянули в модуль Блок меню? Более подробная информация об этом модуле (со страницы проекта):
... вы когда-либо использовали функцию ссылок на главные и вторичные ссылки на тему и задавались вопросом: "Как, черт возьми, я отображать любые пункты меню глубже?"
Ну, вот что делает этот модуль. Он предоставляет настраиваемые блоки деревьев меню, начиная с любого уровня любого меню. И еще!
Итак, если вы используете только функции ссылок на главные меню, вы можете добавить и настроить блок "Главное меню (уровни 2+)". Этот блок появится, как только вы попадете на одну из основных страниц меню, и отобразите дерево меню для второго уровня (и глубже) вашего главного меню и будет расширяться по мере прохождения по дереву. Вы также можете ограничить глубину дерева меню (например, "Главное меню (уровни 2-3)" ) и/или развернуть все дочерние подменю (например, "Главное меню (расширенные уровни 2 +)" ).
Ответ 4
Здесь вспомогательная функция для возврата целого поддерева меню, начиная с указанного mlid. Некоторые из других сообщений возвращают только прямых потомков текущего элемента; это вернет ВСЕ потомства.
По умолчанию он дает вам поддеревье, начинающееся с текущей страницы, но вы можете пройти в любом дереве меню (как возвращено menu_build_tree) и любом mlid.
function _menu_build_subtree($menu=NULL,$mlid=NULL) {
if ($menu == NULL || $mlid == NULL) {
$parent = menu_link_get_preferred();
}
$menu = !is_null($menu) ? $menu : menu_build_tree($parent['menu_name']);
$mlid = !is_null($mlid) ? $mlid : $parent['mlid'];
foreach ($menu as $branch) {
if ($branch['link']['mlid'] == $mlid) {
return $branch;
}
$twig = _menu_build_subtree($branch['below'],$mlid);
if ($twig) { return $twig; }
}
return array();
}
Ответ 5
Я использую это:
Просто добавьте свой путь и, возможно, в меню, и он даст вам ребенка.
function MY_MODULE_submenu_tree_all_data($path, $menu = 'main-menu', $curr_level = 0, $rebuilt_path='', $childtree = array()) {
$tree = menu_tree_all_data($menu);
$args = explode('/', $path);
$rebuilt_path = empty($rebuilt_path) ? $args[$curr_level] : $rebuilt_path . '/' . $args[$curr_level];
foreach ($tree as $branch) {
if ($branch['link']['link_path'] == $rebuilt_path) {
$childtree = $branch['below'];
if ($rebuilt_path != $path) {
$curr_level++;
MY_MODULE_submenu_tree_all_data($path, $menu, $curr_level, $rebuilt_path, $childtree);
}
}
}
$items = array();
foreach ($childtree as $child) {
$items[] = l($child['link']['title'], $child['link']['link_path']);
}
return theme('item_list', array('items' => $items, 'attributes' => array(), 'type' => 'ul'));
}