1

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

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

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

如果我将访问回调设置为“FALSE”,它会按预期工作:我在 node/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;
}
4

1 回答 1

2

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 (将是“视图”)和 $node (将加载节点对象),因为它们将通过“访问参数”传递给它,所以在你的 mymodule_access_check 函数中你可以访问节点信息。

于 2012-06-14T07:15:59.883 回答