2011-12-06 105 views
0

閱讀menu_tree_page_data()的文檔,在我看來,我應該能夠通過以下方式調用該函數來檢索我的主菜單的全部內容:menu_tree_page_data('main-menu')。由於參數2,$max_depth,默認爲NULL,這應遞歸通過所有級別。由於參數3 $only_active_trail默認爲FALSE,因此應檢索所有鏈接,而不僅僅是活動路徑上的鏈接。Drupal 7函數menu_tree_page_data工作不正常?

然而,在調用這個函數時,我最終得到了以下類型的樹數據。

第一級深度的所有鏈接。
第二級深度的所有鏈接。
只有第三級深度的活動鏈接。

這是怎麼回事?我也嘗試明確設置參數menu_tree_page_data('main-menu', 10, FALSE)只是爲了確保我不誤解默認行爲。我不得不編寫自己的函數來給我整個菜單,但它沒有主動路徑數據。現在,我發現自己處於一種混合兩種功能的情況,即創建一個帶有主動路徑信息的完整菜單樹,而且非常麻煩。如果一個解決方案正常工作會很好。

另外,是否有一種簡單的方法來確定給定菜單項的活動軌跡?如果是這樣,我只是將它添加到我已經有效的樹爬行器函數中,並稱它爲一天。

回答

2

我認爲這是與在menu_tree_page_data()靜態緩存問題。緩存ID使用(其中包括)$max_depth傳遞到函數MENU_MAX_DEPTH(以較小者爲準)構建。

由於MENU_MAX_DEPTH等於9,所以當您將10傳遞給函數時,它會自動重置爲9,並且緩存ID由此構建。如果另一個功能已經呼籲menu_tree_page_data()MENU_MAX_DEPTH$max_depth參數(它在一個Drupal頁面早些時候發生的),並與$only_active_trail設置爲TRUE那麼靜態緩存的數據將與積極跟蹤項目被退回。

認爲下面的工作:

drupal_static_reset('menu_tree_page_data'); 
$tree = menu_tree_page_data('main-menu'); 

如果沒有,你可能還需要清除緩存會針對與參與(_menu_build_tree())其他功能,所以試試這個:

drupal_static_reset('_menu_build_tree'); 
drupal_static_reset('menu_tree_page_data'); 
$tree = menu_tree_page_data('main-menu'); 

希望是有道理的,這是相當棘手的解釋:)