Элементы вложенного меню модуля 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 появится под этим подменю. Это поведение по умолчанию, описанное в документации по Drupal API.

  • MyModule
    • MenuItem1
    • SubMenu
      • SubMenuItem1

Однако все элементы отображаются в меню MyModule.

  • MyModule
    • MenuItem1
    • SubMenuItem1
    • Подменю

Что я делаю неправильно?

* РЕДАКТИРОВАТЬ: опечатка (которую я исправил) привела к тому, что 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, в которой хранятся отношения обратного вызова пути ‹>, определенные через 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.

Чтобы обеспечить правильное меню по умолчанию при установке модуля (и для большего контроля над происходящим), вам следует заглянуть в _ 11_ и 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