Drupal模块嵌套菜单项

Dan*_*ton 3 drupal module menu 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(
  //...
);
Run Code Online (Sandbox Code Playgroud)

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

  • MyModule的
    • MenuItem1
    • 子菜单
      • SubMenuItem1

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

  • MyModule的
    • MenuItem1
    • SubMenuItem1
    • 子菜单

我究竟做错了什么?

*编辑:一个错字(我已修复)导致SubMenu是一个单独的元素而不是一个子元素MyModule.不过,我仍然不明白为什么SubMenuItem1不渲染下SubMenu.

Hen*_*pel 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()功能.您可能还想阅读何时以及如何使用menu_links.