Php Drupal挂钩\u菜单\u更改当前节点问题
我正在开发一个新模块,在我的hook_menu_alter()中,我需要检测当前正在查看的节点 我发现我可以使用 菜单获取对象() 以下代码在我的hook\u init()中工作,但在hook\u菜单\u alter()中不工作: 有人能提供一些关于为什么这不起作用以及如何在hook_menu_alter()中获取当前节点信息的见解吗Php Drupal挂钩\u菜单\u更改当前节点问题,php,drupal,drupal-6,module,nodes,Php,Drupal,Drupal 6,Module,Nodes,我正在开发一个新模块,在我的hook_menu_alter()中,我需要检测当前正在查看的节点 我发现我可以使用 菜单获取对象() 以下代码在我的hook\u init()中工作,但在hook\u菜单\u alter()中不工作: 有人能提供一些关于为什么这不起作用以及如何在hook_menu_alter()中获取当前节点信息的见解吗 谢谢。缓存了hook\u menu、hook\u menu\u alter等的输出,因此只有在清除缓存时才会调用这些函数,而不是每次加载页面时。如果你想一想,如果
谢谢。缓存了
hook\u menu
、hook\u menu\u alter
等的输出,因此只有在清除缓存时才会调用这些函数,而不是每次加载页面时。如果你想一想,如果在每一个页面上重新构建菜单,那么网站的性能就会受到很大的影响
因此,当调用hook\u menu\u alter
时(不会从节点页面调用),就不会有menu\u get\u object()
节点提供给您。处理这些事情的方法是在菜单项的页面/访问回调中:
function mymodule_menu_alter(&$items) {
$items['some/path']['page callback'] = 'mymodule_page_callback';
}
function mymodule_page_callback() {
// This is a live page so menu_get_object() is now available
$node = menu_get_object();
}
根据您的评论,我认为您试图基于某些标准拒绝对特定节点的访问。为此,您需要为已经存在的节点/%
菜单路径实现自己的访问回调。大概是这样的:
function mymodule_menu_alter(&$items) {
$items['node/%node']['access callback'] = 'mymodule_access_callback';
}
function mymodule_access_callback($node) {
if ($node->type == 'group') {
if (some_function_that_determines_access($node)) {
return TRUE;
}
return FALSE;
}
return node_access('view', $node);
}
这个解决方案适用于Drupal 6吗?是的,Drupal 6和Drupal 7之间针对这个特定问题的代码实际上完全相同。如果我很胖,请告诉我,但我实现了这两个函数,但没有效果。访问时,我发现没有匹配的hook\u page\u alter函数。我只是在看不完整的文档并在代码中出错了吗???非常抱歉,应该是
hook\u menu\u alter()
我把自己弄糊涂了:)我已经在回答中解决了。谢谢你的耐心和帮助,但我已经将$items['some/path']['page callback']设置为false。我开发这个模块是为了帮助有机团体解决一个问题。我发现一个组的成员可以发布到该组以及他们不属于的组中。这一切都是为了限制会员的发帖。因此,现在我可以通过$items[“node/add/page]['access callback']=FALSE禁用“create post”链接。下一步是检测当前节点类型,如果它恰好是一个组,则使用OG函数检查当前用户是否为成员。第一个参数是GroupID
function mymodule_menu_alter(&$items) {
$items['node/%node']['access callback'] = 'mymodule_access_callback';
}
function mymodule_access_callback($node) {
if ($node->type == 'group') {
if (some_function_that_determines_access($node)) {
return TRUE;
}
return FALSE;
}
return node_access('view', $node);
}