Drupal 7 尝试查看节点时,hook_menu_alter()access回调将在节点列表中返回TRUE结果

Drupal 7 尝试查看节点时,hook_menu_alter()access回调将在节点列表中返回TRUE结果,drupal-7,Drupal 7,我似乎不知道如何实现hook\u menu\u alter()来控制对节点的访问。我从一个裸Drupal 7安装开始,创建了两个节点,并创建了一个只包含以下代码的模块: function mymodule_menu_alter(&$items){ $items['node/2']['access callback'] = TRUE; } 这应该模拟一个返回TRUE的实际回调函数,这就是我开始的地方。但我想在这里展示一个最简单的例子 如果我将访问回调设置为“FALSE”,它将按预

我似乎不知道如何实现hook\u menu\u alter()来控制对节点的访问。我从一个裸Drupal 7安装开始,创建了两个节点,并创建了一个只包含以下代码的模块:

function mymodule_menu_alter(&$items){
    $items['node/2']['access callback'] = TRUE;
}
这应该模拟一个返回TRUE的实际回调函数,这就是我开始的地方。但我想在这里展示一个最简单的例子

如果我将访问回调设置为“FALSE”,它将按预期工作:我在node/2上获得“access denied”。但是如果我将其设置为TRUE,我是否应该获得对节点的正常访问权限?相反,当我转到node/2时,我得到一个与默认首页类似(但不完全相同)的页面:一个节点摘要列表(在本例中,显示了我创建的两个节点)

我已经清除了缓存(因为我知道不会在每个页面视图上调用hook\u menu\u alter(),而是在清除缓存时调用)。我也重建了权限,但没有用。我肯定我错过了一些愚蠢的东西,但我就是想不起来

我还尝试了一次实际的回调:

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

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

/**
 * 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(将是loaded node object),因为它们将通过'access arguments'传递给它,所以在mymodule_access_check函数中,您可以访问节点信息