Drupal модул вложени елементи от менюто

При внедряването на hook_menu за модул се опитвам да поставя някои елементи в подменю.

Досега имам нещо такова

$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 да се появи под това подменю. Това е поведението по подразбиране, описано в документацията за API на Drupal.

  • MyModule
    • MenuItem1
    • SubMenu
      • SubMenuItem1

Всички елементи обаче се появяват под менюто MyModule.

  • MyModule
    • MenuItem1
    • Елемент от подменю 1
    • Подменю

какво правя грешно

*РЕДАКТИРАНЕ: Правописна грешка (която поправих) накара SubMenu да бъде отделен елемент, а не дъщерен елемент на MyModule. Все още обаче не разбирам защо SubMenuItem1 не се изобразява под SubMenu.


person Dan Burton    schedule 04.12.2009    source източник
comment
На коя версия на Drupal сте? И всички тези записи в менюто ще използват ли едно и също обратно извикване? (Обработката на менютата се промени малко с Drupal 6)   -  person Henrik Opel    schedule 04.12.2009
comment
Използвам Drupal 6 и записите в менюто използват различни обратни извиквания за показване на различни форми.   -  person Dan Burton    schedule 05.12.2009
comment
Имам същия проблем с Drupal 7... разбрахте ли какъв е проблемът?   -  person Nate Starner    schedule 26.04.2013


Отговори (2)


Не мога да възпроизведа вашия проблем - използвайки вашата йерархия на менюто, всички записи се показват под менюто за навигация в очаквания ред и вложени.

Опитвали ли сте (повторно) от чисто състояние (т.е. с деинсталиран модул и изчезнали записи в менюто)? За да обясня защо питам това, трябва да разясня малко:

Drupal 6 раздели хранилището на дефинициите на менюто на две таблици. Има таблица menu_router, която съхранява отношенията path‹>callback, дефинирани чрез hook_menu(). Това не дефинира никакъв „истински“ запис в менюто (както в менюто на менюто, напр. менюто за навигация). То дефинира само вътрешната структура на менюто на Drupal, която няма нищо общо с показаните менюта, но само с вътрешната йерархия на картографиране на пътища към функции за обратно извикване!

След това има таблица menu_links, която съхранява „истинските“ записи в менюто, както се появяват под различните менюта за показване (напр. навигация, първични връзки и т.н.). Записите там също така определят реда на влагане, като съхраняват „идентификатор на родителско меню“ (plid) за всеки запис, сочещ към родителския запис или 0 за запис от най-високо ниво.

Сега всеки път, когато дефинирате комбинации път/обратно извикване чрез hook_menu(), Drupal просто поставя този запис в таблицата menu_router. Ако ги дефинирате като MENU_NORMAL_ITEM или MENU_SUGGESTED_ITEM, Drupal допълнително ще се опита да създаде запис в таблицата menu_links. Ако вече съществува запис за този път, Drupal няма да промени разположението му в йерархията, тъй като предполага, че потребител го е преместил нарочно. Трябва да мислите за това menu_link създаване на запис от hook_menu() като за удобство добавяне, което може да ви спести неприятностите при изричното им добавяне чрез функциите, споменати по-долу, но механизмът не е много гъвкав и се опитва да не пречи на съществуващите конфигурации (в противен случай ръчно редактираното меню постоянно ще се пренарежда при всяко повторно изграждане на кеша на менюто ).

Така че трябва да опитате отново, като се уверите, че никой от вашите пътища няма съществуващ запис в таблицата `menu_links'.

За вашата цел да предоставите правилно меню по подразбиране при инсталиране на вашия модул (и за повече контрол върху случващото се), трябва да погледнете в menu_link_save() и menu_link_maintain() функции. Може също да искате да прочетете Кога и как да използвате menu_links.

person Henrik Opel    schedule 08.12.2009
comment
+1 Ако вече съществува запис за този път, Drupal няма да промени разположението му в йерархията, тъй като предполага, че потребител го е преместил нарочно. Мисля, че точно това се случваше. Преинсталирането на модула разкри, че той всъщност създава желания дисплей на менюто по подразбиране. Благодаря за полезната информация и полезните връзки. - person Dan Burton; 09.12.2009

hook_menu всъщност не е мястото за задаване на тегло, сигурен съм, че може да се направи там, но ще откриете, че просто създаването на нормален елемент от менюто и плъзгането му на място в диалоговия прозорец на менютата на администратора ще ви спести много проблеми и болка.

Причината, както разбирам, е, че йерархията на менютата се определя отчасти чрез система за претегляне, а не от зададения от вас път. Конвенцията със сигурност диктува как хората определят своя път, но самото създаване на нормален елемент от менюто в admin/monkey не поставя маймунски елемент в менютата на администратора автоматично.

person Chuck Vose    schedule 04.12.2009
comment
Въпреки че не е абсолютно необходимо, бих искал да структурирам менюто на модула в рамките на кода на модула, така че другите да могат да го инсталират и да видят полезна йерархия на менюто по подразбиране. - person Dan Burton; 05.12.2009
comment
документацията тук [ api.drupal.org/ api/drupal/includes%21menu.inc/group/menu/7.x ] казва, че трябва: The menu system aggregates these items and determines the menu hierarchy from the paths. - person commonpike; 21.12.2017