尝试查看节点时,hook_menu_alter() 访问回调返回 TRUE 结果,结果出现在节点列表中



我似乎无法弄清楚如何实现hook_menu_alter()来控制对节点的访问。我从裸露的 Drupal 7 安装开始,创建了两个节点,并创建了一个仅包含以下代码的模块:

function mymodule_menu_alter(&$items){
    $items['node/2']['access callback'] = TRUE;
}

这应该模拟返回 TRUE 的实际回调函数,这是我开始的地方。但我试图在这里展示最简单的情况。

如果我将访问回调设置为"FALSE",它会按预期工作:我在节点/2 上收到"访问被拒绝"。但是,如果我将其设置为 TRUE,我不应该正常访问节点吗?相反,当我转到node/2时,我得到一个类似于(但不完全相同)默认首页的页面:节点预告列表(在本例中,显示我创建的两个节点)。

我已经清除了缓存(因为我知道hook_menu_alter()不是在每个页面视图上都调用,而是在清除缓存时调用)。我还重建了权限,但无济于事。我确定我在这里错过了一些愚蠢的东西,但我就是想不出来。

我也尝试了实际的回调:

function mymodule_menu_alter(&$items){
    $items['node/2']['access callback'] = 'mymodule_access_check';
}
function mymodule_access_check() {
    return TRUE;
}
node

/2 不是菜单项。节点的菜单项实际上是 node/%,因此要更改它的回调,您必须执行以下操作:

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_access_check';
}
function mymodule_access_check($op, $node) {
  if ($node->nid == 2 && $some_condition) {
    return TRUE;
  }
  else {
    return FALSE;
  }
}

注意 我在函数 args 中添加了$op(将是"view")和$node(将加载节点对象),因为它们将通过"访问参数"传递给它,因此在您的mymodule_access_check函数中您可以访问节点信息。

最新更新