帮助自定义菜单

时间:2011-04-16 15:34:39

标签: drupal drupal-modules drupal-7

Drupal 7 hook_menu()令我困惑;我已经尝试了一切,但我似乎无法让它发挥作用。

我需要的是什么:在自定义模块中,我想创建一个新菜单,并添加四个指向该菜单的链接。这听起来很简单,但我很挣扎。我已经能够使用.install文件中的$ menu数组创建菜单了,但是向该菜单添加项目没有意义。

有效的代码:

$menu = array(
  'menu_name' => 'project-menu', 
  'title' => $t('Project Menu'), 
  'description' => 'Project Menu',
); 

menu_save($menu);

无效的代码:

$items = array();

$items['project-menu/%'] = array(
  'title' => 'Test Link',
  'page callback' => 'dc_project_page',
  'page arguments' => array(1),
  'access callback' => TRUE,
  'type' => MENU_LOCAL_TASK,
);

return $items;

这都在dc_project_menu()函数下的dc_project.install文件中。希望我只是做一些愚蠢的事情,任何和所有的帮助都非常感激。甚至只是向我指出一个干净利落的模块,谢谢。我确实看过这个示例项目,除了添加指向新菜单工作的链接之外,还没有得到任何东西。

1 个答案:

答案 0 :(得分:2)

传递menu_save() $items的内容不起作用,因为menu_save()仅接受包含menu_nametitle和{{1}的数组}。 你在description中使用的是一个描述模块实现的菜单回调的数组,所有模块实现的菜单回调的定义都没有保存在“menu_custom”中($items使用的表格) )但是被缓存在Drupal缓存表中。

如果您尝试更改另一个模块定义的菜单回调,那么您应该实现hook_menu_alter();否则,如果您只想定义模块的菜单回调,则应实现hook_menu()

钩子实现(menu_save()hook_menu())必须位于模块文件中(在您的情况下,在dc_project.module中),而不是在dc_project.install中。 Drupal在正常加载启用的模块时不会加载安装文件;它在更新(或安装)模块时加载安装文件,但在其他情况下不加载它 使用hook_menu_alter()保存菜单的代码可以在安装文件中,hook_install()hook_update_N()的实现中。它也可以用于hook_enable()的实施;在这种情况下,代码(在启用模块时执行)应首先验证菜单是否尚未添加。 (menu_save()hook_enable()应放在安装文件中。)