Drupal 菜单系统 - 向下输出一棵树 [英] Drupal Menu System - Outputting a Tree One Level Down

查看:20
本文介绍了Drupal 菜单系统 - 向下输出一棵树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读 Drupal 中的各种菜单功能,但是太多了,我已经到了完全困惑和绝望的地步...希望这里的一位聪明人可以帮助我...

I've been reading through the various menu functions in Drupal, but there are sooo many, and I've reached a point of utter confusion and despair... Hoping one of the smarties here can help me out...

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

Basically, I have four levels to my menu. I'm trying to create a tree that outputs from the second level down.

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

So, the menu looks like this: LEVEL ONE > Sublevel A > Sublevel I > Sublevel a

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

I'm trying to output the menu tree beginning with Sublevel A (i.e., Sublevel A > Sublevel I > Sublevel a)

但是,我一生都无法弄清楚如何做到这一点...我尝试简单地获取 Sublevel A 菜单的 mlid(在本例中为 69),然后

But, can't for the life of me figure out how to do that... I tried simply getting the mlid of the Sublevel A menu (in this case 69), and then

<?php print theme_menu_tree(69); ?>

但它只是打印出69".完全不是我所期望的......

but it just prints out '69'. Not at all what I expected...

有人知道怎么做吗?

推荐答案

我一直想知道为什么在核心中没有这个功能,但 afaik 没有.

I always wondered why there is no function for this in core, but afaik there is none.

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

So it looks like we need to roll our own, walking a complete menu tree until we find the subtree we need:

/**
 * 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()一个>:

To use it, you first need to get the tree for the whole menu, using menu_tree_page_data() or menu_tree_all_data(), depending on what you need (check the API definitions for the difference). Then you extract the subtree you want, based on the mlid. This subtree can then be rendered into HTML via menu_tree_output():

$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 相同的程序后想出的解决方案,也就是说,通读整个菜单模块功能,总是想知道我是否遗漏了明显的地方......


Disclaimer: I am not sure if this is a good/proper way to do it - it is just the solution I came up with after going through the same procedure as the OP, that is, reading through the whole menu module functions, always wondering if I'm missing the obvious somewhere...

这篇关于Drupal 菜单系统 - 向下输出一棵树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆