Drupal hook_menu_alter当前节点问题


Drupal hook_menu_alter current node issues

我正在开发一个新的模块,在我的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);
}