hook_menu_alter()访问回调返回TRUE会导致尝试查看节点时的节点列表

时间:2012-06-06 22:29:37

标签: drupal-7

我似乎无法弄清楚如何实现hook_menu_alter()来控制对节点的访问。我从一个简单的Drupal 7安装开始,创建了两个节点,并创建了一个只有这个代码的模块:

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

这应该模拟一个返回TRUE的实际回调函数,这是我开始的地方。但我想在这里展示最简单的案例。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

node / 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;
  }
}

注意我将$ op(将是'view')和$ node(将加载节点对象)添加到函数args中,因为它们将通过'access arguments'传递给它,所以在你的mymodule_access_check函数中你有权访问节点信息。