我似乎无法弄清楚如何实现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;
}
答案 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函数中你有权访问节点信息。