2009-12-04 129 views
3

在實現hook_menu模塊,我試圖把一些項目放到子菜單中。Drupal模塊嵌套菜單項

到目前爲止,我有這樣的事情

$items['MyModule'] = array(
    //... 
    'page callback' => 'system_admin_menu_block_page', 
    'file' => 'system.admin.inc', 
    'file path' => drupal_get_path('module','system'), 
); 

$items['MyModule/MenuItem1'] = array(
    //... 
); 

$items['MyModule/SubMenu'] = array(
    //... 
    'page callback' => 'system_admin_menu_block_page', 
    'file' => 'system.admin.inc', 
    'file path' => drupal_get_path('module','system'), 
); 

$items['MyModule/SubMenu/SubMenuItem1'] = array(
    //... 
); 

我希望SubMenu出現的,好了,一個子菜單的菜單MyModule,併爲SubMenuItems到子菜單下出現。這是Drupal API文檔中描述的默認行爲。

  • MyModule的
    • MenuItem1
    • 子菜單
      • SubMenuItem1

然而,所有項目的0出現菜單。

  • MyModule的
    • MenuItem1
    • SubMenuItem1
    • 子菜單

我在做什麼錯?

*編輯:一個錯字(我已經修復)導致SubMenu是一個單獨的元素,而不是MyModule的子元素。不過,我仍然不明白爲什麼SubMenuItem1不能在SubMenu下渲染。

+1

你在哪個Drupal版本?所有這些菜單條目都使用相同的回調嗎? (菜單處理用Drupal 6改變了一點) – 2009-12-04 12:59:04

+0

我使用的是Drupal 6,菜單條目使用不同的回調來顯示各種形式。 – 2009-12-04 21:51:02

+0

我在Drupal 7上遇到了同樣的問題......你是否知道問題出在哪裏? – 2013-04-26 17:17:50

回答

6

我無法重現您的問題 - 使用您的菜單層次結構,所有條目出現在導航菜單下的預期順序和嵌套。

你有沒有(重新)試圖從一個乾淨的狀態(也就是說,你的模塊卸載和菜單項不見了)?爲了解釋我爲什麼要這樣做,我必須詳細說明一下:

Drupal 6將菜單定義存儲分割爲兩個表格。有menu_router表,其中存儲路徑<>通過hook_menu()定義的回調關係。 這沒有定義任何「真實」菜單條目(如在菜單菜單中,例如導航菜單)。它只確定Drupal的內部菜單結構,它與顯示的菜單無關,但只與調用回調函數的映射路徑的內部層次結構有關!

然後是menu_links表,它存儲了在各種可顯示菜單(例如導航,主鏈接等)下出現的「真實」菜單條目。其中的條目還通過爲每個條目存儲「父菜單ID」(plid),指向父條目或爲頂層條目存儲0來定義嵌套順序。

現在,只要您通過hook_menu()定義路徑/回調組合,Drupal就會將該條目放入menu_router表中。如果將它們定義爲MENU_NORMAL_ITEMMENU_SUGGESTED_ITEM,則Drupal將另外嘗試在menu_links表中創建條目。 如果該路徑的條目已經存在,Drupal將不會改變其在層次結構中的位置,因爲它假定用戶有意移動它。您應該將這個menu_link條目創建爲hook_menu()作爲一個方便的附加項,它可以幫助您通過下面提到的功能顯式添加它們,但這種機制不是很靈活,並且不會干擾現有配置(否則手動編輯的菜單會不斷地在菜單緩存的每次重建時重新排序)。

因此,您應該再次嘗試,同時確保您的路徑中沒有任何路徑在`menu_links'表中具有現有條目。

爲了在安裝模塊時提供正確的默認菜單(以及更多控制發生什麼事情)的目標,您應該看看menu_link_save()menu_link_maintain()函數。您可能還想閱讀When and how to use menu_links

+1

+1」如果該路徑的條目已經存在,Drupal將不會改變其在層次結構中的位置,因爲它假定用戶有意移動它。「我認爲這正是發生的事情。事實上,重新安裝模塊顯示它確實創建了所需的默認菜單顯示。感謝有用的信息和有用的鏈接。 – 2009-12-08 22:22:47

0

hook_menu並不是真正的設置權重的地方,我相信它可以在那裏完成,但是你會發現只需創建一個正常的菜單項並將其拖拽到管理員菜單對話框中,就可以爲你節省一個噸的麻煩和痛苦。

據我所知,原因是菜單層次結構部分是通過加權系統而不是你設置的路徑來確定的。大會肯定會決定人們如何設定他們的路徑,但只是在管理員/猴子上製作正常的菜單項並不會自動將猴子項目放入管理菜單中。

+0

雖然不是絕對必要的,但我想在模塊的代碼中構建模塊的菜單,以便其他人可以安裝它並查看有用的默認菜單層次結構。 – 2009-12-04 21:53:48

+0

這裏的文檔[https://api.drupal.org/api/drupal/includes%21menu.inc/group/menu/7.x]表示它應該:'菜單系統聚合這些項目並確定菜單層次結構路徑。「 – commonpike 2017-12-20 21:59:11