как получить все пункты меню ниже определенного родителя в друпале? - PullRequest
14 голосов
/ 27 апреля 2010

Мне действительно нужен только mlid и текст заголовка для первого уровня ниже определенного пункта меню. Вот что я делаю в данный момент. (Это работает, но я подозреваю, что может быть более дружественный путь.):

/**
 * 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;
}

Есть?

Ответы [ 5 ]

24 голосов
/ 23 июля 2012

На самом деле есть простой способ получить эту информацию с помощью 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() также проверяет ограничения доступа или перевода, чтобы вы получали только то, что пользователь действительно должен видеть.

17 голосов
/ 29 апреля 2010

afaik, нет (надеюсь, я не прав). в то же время, вместо того, чтобы искать уродливые ключи, вы можете превратить вашу функцию в более абстрактную вспомогательную функцию, просто добавив foreach ($ tree). тогда вы можете использовать свою собственную логику для вывода того, что вы хотите (в данном случае mlid). вот мое предложение:

<code>
/**
 * 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();
}
3 голосов
/ 27 апреля 2010

Вы смотрели в Блок меню модуль? Еще несколько подробностей об этом модуле (со страницы его проекта):

... Вы когда-нибудь использовали функцию ссылок основного и дополнительного меню в своей теме и задавались вопросом: «Как, черт возьми, я могу отображать какие-либо пункты меню глубже, чем это?»

Ну, вот что делает этот модуль. Он предоставляет настраиваемые блоки деревьев меню, начиная с любого уровня любого меню. И еще!

Таким образом, если вы используете только функцию ссылок главного меню своей темы, вы можете добавить и настроить блок «Главное меню (уровни 2+)». Этот блок появится, как только вы окажетесь на одной из страниц Главного меню, и покажет дерево меню для 2-го уровня (и глубже) вашего Главного меню и расширится, когда вы пройдете по дереву. Вы также можете ограничить глубину дерева меню (например, «Главное меню (уровни 2-3)») и / или развернуть все дочерние подменю (например, «Главное меню (расширенные уровни 2 +)»).

1 голос
/ 06 марта 2016

Вот вспомогательная функция, которая возвращает целое поддерево меню, начиная с указанного 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();
}
0 голосов
/ 18 марта 2013

Я использую это: просто добавьте свой путь и, в конце концов, меню, и оно даст вам ребенка.

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'));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...