hook_menu
,hook_menu_alter
等的輸出被高速緩存,因此只有在高速緩存被清除時纔會調用這些函數,而不是每個頁面加載。如果你仔細想想,如果菜單在每個頁面加載時都被重建,網站的性能將受到相當大的影響。
因此,當調用hook_menu_alter
(這不會來自節點頁面)時,menu_get_object()
沒有節點給你。處理這些事情的方式是在菜單項的尋呼/接入回調:
function mymodule_menu_alter(&$items) {
$items['some/path']['page callback'] = 'mymodule_page_callback';
}
function mymodule_page_callback() {
// This is a live page so menu_get_object() is now available
$node = menu_get_object();
}
從您的評論我想你想拒絕訪問基於某些標準的特定節點。爲此,您需要爲已有的node/%
菜單路徑實現自己的訪問回調。類似這樣的:
function mymodule_menu_alter(&$items) {
$items['node/%node']['access callback'] = 'mymodule_access_callback';
}
function mymodule_access_callback($node) {
if ($node->type == 'group') {
if (some_function_that_determines_access($node)) {
return TRUE;
}
return FALSE;
}
return node_access('view', $node);
}
此解決方案是否適用於Drupal 6? – sisko
是的代碼實際上在這個特定問題Drupal 6和Drupal 7之間是完全一樣的 – Clive
原諒我,如果我很厚,但我實現了這兩個功能,並沒有效果。訪問http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/6,我發現沒有匹配的hook_page_alter函數。我只是看着不完整的文檔,並在我的代碼中做錯了什麼? – sisko