Вложенные пункты меню модуля Drupal - PullRequest
3 голосов
/ 04 декабря 2009

При реализации 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

Что я делаю не так?

* EDIT: опечатка (которую я исправил) привела к тому, что SubMenu был отдельным элементом, а не дочерним элементом MyModule. Я до сих пор не понимаю, почему SubMenuItem1 не рендерится под SubMenu, хотя.

Ответы [ 2 ]

6 голосов
/ 08 декабря 2009

Я не могу воспроизвести вашу проблему - используя вашу иерархию меню, все записи появляются под навигационным меню в ожидаемом порядке и во вложении.

Пробовали ли вы (пере) из чистого состояния (то есть, когда ваш модуль удален, а пункты меню пропали)? Чтобы объяснить, почему я спрашиваю об этом, я должен немного уточнить:

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 '.

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

0 голосов
/ 04 декабря 2009

hook_menu на самом деле не место для установки веса, я уверен, что это можно сделать там, но вы обнаружите, что просто создание обычного пункта меню и перетаскивание его на место в диалоге меню администратора поможет вам сэкономить массу хлопот и боли.

Причина, насколько я понимаю, в том, что иерархия меню определяется частично через систему весов, а не по заданному вами пути. Соглашение, безусловно, диктует, как люди устанавливают свой путь, но простое создание обычного пункта меню в admin / monkey не приводит к автоматическому вводу элемента обезьяны в меню администратора.

...