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文件中。希望我只是做一些愚蠢的事情,任何和所有的帮助都非常感激。甚至只是向我指出一个干净利落的模块,谢谢。我确实看过这个示例项目,除了添加指向新菜单工作的链接之外,还没有得到任何东西。
答案 0 :(得分:2)
传递menu_save() $items
的内容不起作用,因为menu_save()
仅接受包含menu_name
,title
和{{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()
应放在安装文件中。)