【问题标题】:Help for custom menu自定义菜单帮助
【发布时间】:2011-04-16 15:34:38
【问题描述】:

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 文件中。希望我只是在做一些愚蠢的事情,非常感谢任何帮助。甚至只是向我指出一个干净地执行此操作的模块作为示例,谢谢。我确实查看了示例项目,但在添加指向我的新菜单的链接方面却一无所获。

【问题讨论】:

    标签: drupal drupal-modules drupal-7


    【解决方案1】:

    $items 的内容传递给menu_save() 不起作用,因为menu_save() 只接受包含menu_nametitledescription 的数组。 你在$items中使用的是一个数组,描述了一个模块实现的菜单回调,所有模块实现的菜单回调的定义并没有保存在“menu_custom”(来自menu_save()的表)中,而是被缓存了在 Drupal 缓存表中。

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

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

    【讨论】:

    • 哇,我还没有尝试使用您的指导来修复我的代码。但这非常有用,非常感谢。感觉我对 drupal 菜单系统有了更好的理解。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多