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

6 php drupal module drupal-7 drupal-modules

我目前正在开发一个模块,通过url路径找出父菜单项,然后通过查找顶部父项显示该相关菜单的当前树结构,最重要的是仅显示该菜单中的菜单项和子菜单.

一个简单的解决方案是通过所有项目或包含所有项目作为键的数组进行foreach循环.

path = '/system/menu/submenu';
parent = 'system';
output = parent + parent submenus.
Run Code Online (Sandbox Code Playgroud)

"自定义菜单"中的所有菜单项:

- System
   - Menu wrapper
     - SubMenu 1A
     - SubMenu 2A
     - SubMenu 3A    
- Main
  - SubMenu 1B
  - SubMenu 2B
  - SubChildMenu 3B
Run Code Online (Sandbox Code Playgroud)

PHP代码应该返回:

- System
   - Menu wrapper
     - SubMenu 1A
     - SubMenu 2A
     - SubMenu 3A    
Run Code Online (Sandbox Code Playgroud)

我的代码(目前无效):

 $menu = menu_tree('my-custom-menu');
 return = theme('my_custom_menu', array('system' => $menu_tree));
Run Code Online (Sandbox Code Playgroud)

注意:这只需要php代码和php代码,所有其他模块不支持通过手动选择.内容通过块显示.

"对于导航,Drupal将通过menu_navigation_links调用menu_tree_page_data, 这只会返回一个级别的链接.您可以在此之前使用menu_main_menu,然后是template_preprocess_page(这是它最终作为page.tpl.php中的变量的方式). )

但是,如果你插入一个菜单作为块,menu_tree会调用menu_tree_page_data(它立即调用menu_tree_output,然后对数组进行一些额外的工作以进行最终标记.)两个运行完毕后,你可以将整个菜单树作为数组使用然后我浏览了一些自定义的PHP代码来遍历数组并将其呈现为HTML列表."

人们之前已经问过这个但是我已经尝试了他们的解决方案而没有成功可能的原因是这些问题是针对drupal 6.我正在使用drupal 7.

非常感谢您的帮助,谢谢......

相关问题:


将菜单树限制为第一级

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

https://drupal.stackexchange.com/questions/28654/how-to-display-submenus-separate-from-their-menu-tree-in-drupal-7

https://drupal.stackexchange.com/questions/30112/displaying-a-menus-child-links

Fel*_*Eve 3

您首先需要的是当前所在页面的 mlid:

$q = variable_get('site_frontpage', 'node') == $_GET["q"] ? '<front>' : $_GET["q"];
$current_menu_item = db_select('menu_links' , 'ml')
  ->condition('ml.link_path' , $q)
  ->fields('ml', array('mlid', 'plid'))
  ->execute()
  ->fetchAll();
Run Code Online (Sandbox Code Playgroud)

现在,如果该菜单项的 pld 为 0,则我们知道它是顶级菜单项,如果它不为 0,则我们需要获取父项。所以我们想要得到的树的顶部mlid是:

$top_level_mlid = $current_menu_item->plid == 0 ? $current_menu_item->mlid : $current_menu_item->plid;
Run Code Online (Sandbox Code Playgroud)

然后你需要加载完整的菜单:

$full_menu_items = menu_tree_all_data('main-menu');
Run Code Online (Sandbox Code Playgroud)

现在循环遍历所有菜单项并获取我们想要的部分:

foreach($full_menu_items as $menu_item) {
    if($menu_item['link']['mlid'] == $top_level_mlid) {
        $links = $menu_item['below'];
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

$links 现在包含您所在菜单特定部分的所有链接。

并将该数组作为菜单输出到页面上:

echo theme('links__system_secondary_menu', array(
    'links' => $links, 
    'attributes' => array(
        'id' => 'secondary-menu', 
        'class' => array('links', 'clearfix')), 
        'heading' => array(
            'text' => t('Secondary menu'), 
            'level' => 'h2', 
            'class' => array('element-invisible')
        )
));
Run Code Online (Sandbox Code Playgroud)