我想向用户编辑页面添加一个选项卡,即user/%/edit/foo
使用 twitter 模块作为模型。在使用调试器进行大量探索和单步调试之后,我意识到我需要hook_user
在我的模块中添加一个函数,以便%user_category
菜单路由器路径的部分能够工作。
它现在按预期运行,但我对我刚刚做了什么并没有真正的了解,也没有在任何地方找到好的解释。
谁能给我解释一下它是关于什么的?
我想向用户编辑页面添加一个选项卡,即user/%/edit/foo
使用 twitter 模块作为模型。在使用调试器进行大量探索和单步调试之后,我意识到我需要hook_user
在我的模块中添加一个函数,以便%user_category
菜单路由器路径的部分能够工作。
它现在按预期运行,但我对我刚刚做了什么并没有真正的了解,也没有在任何地方找到好的解释。
谁能给我解释一下它是关于什么的?
如果给定一个不存在的类别,则 user_category_loads 将失败,这发生在 user/uid/edit/not_a_category,并且它将该类别传递给 user/uid/edit/is_a_category 进行访问检查,因此对这些类别的访问设置为 false,所以 bam , 不稳定的菜单:'(。
当您使用%user_category
它时,意味着user_category_load
使用该参数(uid)调用该函数。
该功能在用户模块中定义。这些函数用作验证,如果 False 它返回 FALSE,它将导致 404,但如果它返回其他内容,例如用户对象,则将传递给为该 url 运行的任何回调函数/表单。
在您的情况下,您可能会使用更简单的user_load%user
来代替,并且您不需要做所有额外的事情来通过。user_category_load
user_category_load
两件事也是如此。
经过多次试验和错误,我能够使用如下代码让一个页面作为user/%/edit
路径的子节点工作:
<?php
/**
* Implementation of hook_menu().
*/
function noc_profile_privacy_menu() {
return array(
'user/%user_category/edit/privacy' => array(
'title' => 'Portfolio privacy',
'page callback' => 'drupal_get_form',
'page arguments' => array('noc_profile_privacy_form', 1),
'access callback' => 'content_profile_page_access',
'access arguments' => array('profile', 1),
'type' => MENU_LOCAL_TASK,
'load arguments' => array('%map', '%index'),
),
);
}
/**
* Implementation of hook_user().
*/
function noc_profile_privacy_user($op, &$edit, &$account, $category = NULL) {
if ($op === 'categories') {
return array(array(
'name' => 'privacy',
'title' => t('Profile privacy'),
'weight' => 0,
));
}
}
请注意,'name'
我在 hook_user() 中返回的键与user/%user/category/edit
我的 hook_menu() 定义中的键相同。我相信这是关键。如果您省略该项目,您也会收到一个错误'load arguments'
,而该值正是该值。
'privacy'
所以我相信在我的情况下用户类别是什么-edit
菜单项定义路径中的位。
这是不必要的并发症吗?是的,看起来是这样。
编辑:我看到我的同事 hefox 在回答这个问题时打败了我。如果没有 Fox 的帮助,我将无法弄清楚这一切,这对 Fox 来说是如此疯狂的道具。