我正在开发一个新的模块,在我的hook_menu_alter()中,我需要检测当前正在查看的节点。
而不是使用arg(1)
从url获取节点id,我发现我可以使用menu_get_object () .
下面的代码在我的hook_init()中工作,但在hook_menu_alter()中不起作用:
$node = menu_get_object();
dpm($node);
谁能提供一些洞察为什么不工作,以及如何在hook_menu_alter()中获得当前节点信息?
谢谢。
hook_menu
, hook_menu_alter
等的输出被缓存,所以这些函数只会在缓存被清除时调用,而不是每次加载页面。如果您考虑一下,如果每次加载页面时都重新构建菜单,那么网站的性能将受到相当大的影响。
hook_menu_alter
时(它不会来自节点页),没有menu_get_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();
}
从你的评论中,我认为你试图根据某些标准拒绝访问特定节点。为此,您需要为已经存在的node/%
菜单路径实现自己的访问回调。像这样:
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);
}