Drupal模块嵌套菜单项

时间:2009-12-04 00:33:47

标签: drupal menu module submenu

在为模块实现hook_menu时,我试图将一些项目放入子菜单。

到目前为止,我有类似的东西

$items['MyModule'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/MenuItem1'] = array(
  //...
);

$items['MyModule/SubMenu'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/SubMenu/SubMenuItem1'] = array(
  //...
);

我希望SubMenu显示为MyModule菜单的子菜单,以及SubMenuItems显示在该子菜单下。这是Drupal API文档中描述的默认行为。

  • MyModule的
    • MenuItem1
    • 子菜单
      • SubMenuItem1

但是,所有项目都会显示在MyModule菜单下。

  • MyModule的
    • MenuItem1
    • SubMenuItem1
    • 子菜单

我做错了什么?

*编辑:一个拼写错误(我已修复)导致SubMenu成为一个单独的元素,而不是MyModule的子元素。我仍然不明白为什么SubMenuItem1不会在SubMenu下呈现。

2 个答案:

答案 0 :(得分:6)

我无法重现您的问题 - 使用菜单层次结构,所有条目都按预期顺序显示在导航菜单下并嵌套。

您是否(从重新)尝试过干净状态(即卸载了模块并且菜单项已经消失)?为了解释我为什么这么说,我必须详细说明一下:

Drupal 6将菜单定义存储分成两个表。有menu_router表,它存储通过hook_menu()定义的路径<>回调关系。 这不会定义任何“真实”菜单条目(如菜单菜单,例如导航菜单)。它只定义Drupal内部菜单结构,它与显示的菜单无关,但是只有回调函数的映射路径的内部层次结构!

然后有menu_links表,它存储在各种可显示菜单(例如导航,主链接等)下出现的“真实”菜单条目。那里的条目还通过为每个条目存储“父菜单id”(plid),指向父条目,或者为顶级条目存储0来定义嵌套顺序。

现在,只要您通过hook_menu()定义路径/回调组合,Drupal就会将该条目放入menu_router表中。如果您将其定义为MENU_NORMAL_ITEMMENU_SUGGESTED_ITEM,Drupal将另外尝试在menu_links表中创建一个条目。 如果该路径的条目已经存在,Drupal将不会更改其在层次结构中的位置,因为它假定用户故意移动它。您应该考虑通过以下方式创建此menu_link条目hook_menu()作为一个方便的补充,可以省去你通过下面提到的功能明确添加它们的麻烦,但机制不是很灵活,并试图不干扰现有的配置(否则手动编辑的菜单会不断得到每次重建菜单缓存时重新排序。)

因此,您应该再次尝试,同时确保您的路径中没有任何路径在`menu_links'表中有现有条目。

为了在安装模块时提供正确的默认菜单(并且为了更好地控制发生的事情),您应该查看menu_link_save()menu_link_maintain()函数。您可能还想阅读When and how to use menu_links

答案 1 :(得分:0)

hook_menu实际上并不是设置权重的地方,我确信它可以在那里完成,但你会发现只需创建一个普通的菜单项并将其拖到管理员的菜单对话框中就可以节省一吨麻烦和痛苦。

据我所知,原因是菜单层次结构部分是通过加权系统而不是您设置的路径来确定的。惯例肯定决定了人们如何设置他们的路径,但只是在admin / monkey上制作一个普通的菜单项并不会自动将猴子项目放入管理菜单中。