2011-11-30 63 views
1

我正在開發一個新模塊,並在我的hook_menu_alter()中需要檢測當前正在查看的節點。Drupal hook_menu_alter當前節點問題

而不是使用arg(1)從url中獲取節點ID,我發現我可以使用 menu_get_object()。

下面的代碼工作在我hook_init(),但不會在hook_menu_alter():

$node = menu_get_object(); 
dpm($node); 

任何人都可以提供一些洞察爲什麼不工作,如何讓hook_menu_alter當前節點信息來源( )?

謝謝。

回答

2

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); 
} 
+0

此解決方案是否適用於Drupal 6? – sisko

+0

是的代碼實際上在這個特定問題Drupal 6和Drupal 7之間是完全一樣的 – Clive

+0

原諒我,如果我很厚,但我實現了這兩個功能,並沒有效果。訪問http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/6,我發現沒有匹配的hook_page_alter函數。我只是看着不完整的文檔,並在我的代碼中做錯了什麼? – sisko