Drupal菜单系统 - 向下输出一级树

时间:2009-12-03 18:36:33

标签: drupal menu tree

我一直在阅读Drupal中的各种菜单功能,但是有很多,我已经达到了完全混乱和绝望的程度......希望这里的一个聪明人可以帮助我......

基本上,我的菜单有四个级别。我正在尝试创建一个从第二级输出的树。

所以,菜单看起来像这样:LEVEL ONE>分段A>分段I> Sublevel a

我正在尝试以Sublevel A开头输出菜单树 (即,Sublevel A> Sublevel I> Sublevel a)

但是,不能为我的生活弄清楚如何做到这一点......我试着简单地获得Sublevel A菜单的mlid(在这种情况下为69),然后

<?php print theme_menu_tree(69); ?>

但它打印出'69'。根本不是我所期待的......

任何人都知道如何做到这一点?

3 个答案:

答案 0 :(得分:13)

Menu Block模块将完全满足您的需求。 (它使用与上面提到的自定义函数类似的逻辑)。

答案 1 :(得分:11)

我总是想知道为什么在核心中没有这个功能,但是afaik没有。

所以看起来我们需要自己滚动,走一个完整的菜单树,直到找到我们需要的子树:

/**
 * Extract a specific subtree from a menu tree based on a menu link id (mlid)
 *
 * @param array $tree
 *   A menu tree data structure as returned by menu_tree_all_data() or menu_tree_page_data()
 * @param int $mlid
 *   The menu link id of the menu entry for which to return the subtree
 * @return array
 *   The found subtree, or NULL if no entry matched the mlid
 */
function yourModule_menu_get_subtree($tree, $mlid) {
  // Check all top level entries
  foreach ($tree as $key => $element) {
    // Is this the entry we are looking for?
    if ($mlid == $element['link']['mlid'])  {
      // Yes, return while keeping the key
      return array($key => $element);
    }
    else {
      // No, recurse to children, if any
      if ($element['below']) {
        $submatch = yourModule_menu_get_subtree($element['below'], $mlid);
        // Found wanted entry within the children?
        if ($submatch) {
          // Yes, return it and stop looking any further
          return $submatch;
        }
      }
    }
  }
  // No match at all
  return NULL;
}

要使用它,首先需要使用menu_tree_page_data()menu_tree_all_data()来获取整个菜单的树,具体取决于您的需要(查看差异的API定义)。然后根据mlid提取所需的子树。然后可以通过menu_tree_output()

将此子树渲染为HTML
$mlid = 123; // TODO: Replace with logic to determine wanted mlid
$tree = menu_tree_page_data('navigation'); // TODO: Replace 'navigation' with name of menu you're interested in
// Extract subtree
$subtree = yourModule_menu_get_subtree($tree, $mlid);
// Render as HTML menu list
$submenu = menu_tree_output($subtree);

免责声明:我不确定这是否是一个好的/正确的方法 - 这只是我在完成与OP相同的程序后提出的解决方案,即阅读整个菜单模块的功能,总是想知道我是否错过了明显的某个地方...

答案 2 :(得分:1)

仍然在定制功能的道路上......今天 - 为什么寻找完全不同的东西 - 我发现另一位同事面临同样的问题,并提出了另一种解决方案。

原帖是here。以下是那里的代码片段的c&amp; p。

// will return all menu items under "administration".
print theme('menu_tree_by_path','admin');

// will return links to all node submission forms
print theme('menu_tree_by_path','node/add');

// return the correct menu array by path
function menu_get_mid_by_path($path) {
// oddly, menu_get_item accepts a path, but returns the parent id.
  $menu = menu_get_item(null, $path);
  if (isset($menu['children'])) {
// so we have to extract the mid for theme_menu_tree from one of the child items
    if ($pid = end($menu['children'])) {
      $menu = menu_get_item($pid);
      return $menu['pid'];
    }
  }
}

//theme the crap out of it
function theme_menu_tree_by_path($path) {
  if ($mid = menu_get_mid_by_path($path)) {
    return theme('menu_tree', $mid);
  }
}