如何获得drupal中某个父母下面的所有菜单项?

时间:2010-04-26 20:53:11

标签: drupal menu

我真的只需要某个菜单项下面第一级的mlid和标题文本。这就是我现在正在做的事情。 (它有效,但我怀疑可能有更多的drupal-y方式。):

/**
 * 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 个答案:

答案 0 :(得分:24)

实际上,使用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()也会检查与访问或翻译相关的限制,因此您只能获得用户真正应该看到的内容。

答案 1 :(得分:17)

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 :(得分:3)

您是否查看了Menu block模块?有关此模块的更多详细信息(来自其项目页面):

  

...你有没有使用主题上的主菜单和辅助菜单链接功能,并想知道“我该如何显示比这更深的菜单项?”

     

嗯,这就是这个模块的作用。它提供可配置的菜单树块,从任何级别的菜单开始。还有更多!

     

因此,如果您只使用主题的主菜单链接功能,则可以添加和配置“主菜单(级别2+)”块。一旦您进入主菜单的某个页面,该块就会出现,并显示主菜单的第二级(和更深层)的菜单树,并在您遍历树时展开。您还可以限制菜单树的深度(例如“主菜单(级别2-3)”)和/或展开所有子子菜单(例如“主菜单(扩展级别2 +)”)。

答案 3 :(得分:1)

这是一个辅助函数,用于返回菜单的整个子树,从指定的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();
}

答案 4 :(得分:0)

我用这个: 只需添加您的路径并最终添加菜单,它就会为您提供孩子。

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

}