НОВИНКА!
Занимательная математика от Трепачёва. Присоединяйтесь к нам!
59 of 182 menu

Таблица menu_tree

Таблица menu_tree является центральным хранилищем для всех пользовательских и системных меню в Drupal. Она использует материализованный путь (materialized_path) для эффективного представления иерархической структуры и быстрого поиска элементов меню.

Поля

Поле Тип данных Описание
mlid serial Уникальный идентификатор элемента меню (Menu Link ID). Первичный ключ таблицы.
id varchar(255) Машинное имя плагина меню, которое однозначно идентифицирует этот элемент. Формат: module_name:plugin_id.
menu_name varchar(32) Машинное имя меню, к которому принадлежит этот элемент (например, main, footer, account).
plid int Идентификатор родительского элемента меню (Parent Menu Link ID). Равен 0 для элементов верхнего уровня. Ссылается на menu_tree.mlid.
link_path varchar(255) Внутренний путь Drupal или внешний URL, на который ведет пункт меню (например, node/1, https://example.com).
router_path varchar(255) Путь маршрутизатора, используемый для генерации ссылки и проверки активного состояния. Для кастомных ссылок обычно равен link_path.
link_title varchar(255) Заголовок пункта меню, который отображается пользователям.
options blob Сериализованный массив опций ссылки, таких как атрибуты HTML, параметры запроса, фрагменты URL и т.д.
module varchar(255) Имя модуля, который предоставил этот элемент меню (например, system, user, custom).
hidden smallint Флаг, указывающий, скрыт ли элемент меню: 0 - видимый, 1 - скрытый.
external smallint Флаг, указывающий, является ли ссылка внешней: 0 - внутренняя, 1 - внешняя.
has_children smallint Флаг, указывающий, имеет ли элемент дочерние пункты: 0 - нет детей, 1 - есть дети.
expanded smallint Флаг, указывающий, должно ли меню быть развернуто по умолчанию: 0 - свернуто, 1 - развернуто.
weight int Вес элемента, определяющий его порядок относительно sibling-элементов. Элементы с меньшим весом показываются выше.
depth smallint Уровень вложенности элемента в иерархии меню. Корневые элементы имеют глубину 1.
customized smallint Флаг, указывающий, был ли элемент изменен пользователем: 0 - системный, 1 - кастомный.
p1 int Первый родитель в материализованном пути (mlid корневого предка).
p2 int Второй родитель в материализованном пути.
p3 int Третий родитель в материализованном пути.
p4 int Четвертый родитель в материализованном пути.
p5 int Пятый родитель в материализованном пути.
p6 int Шестой родитель в материализованном пути.
p7 int Седьмой родитель в материализованном пути.
p8 int Восьмой родитель в материализованном пути.
p9 int Девятый родитель в материализованном пути.
updated smallint Флаг, указывающий, требуется ли обновление элемента: 0 - актуальный, 1 - требует обновления.
materialized_path varchar(255) Материализованный путь, представляющий иерархию элемента в формате p1/p2/p3/.../mlid.

Как это работает

Drupal использует таблицу menu_tree для хранения всей иерархической структуры меню. Каждый элемент меню представлен записью в этой таблице, связанной с родительским элементом через поле plid.

Материализованный путь (materialized_path) и поля p1-p9 оптимизируют запросы для быстрого поиска всех потомков определенного элемента или построения полного дерева меню без рекурсивных SQL-запросов.

Когда пользователь изменяет структуру меню через административный интерфейс (перетаскивает элементы, изменяет родителя), Drupal пересчитывает материализованные пути и обновляет соответствующие поля для всех затронутых элементов.

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

Пример SQL-запроса

Получить все элементы главного меню с их полной иерархией можно следующим запросом:

SELECT mlid, link_title, link_path, depth, weight, materialized_path FROM menu_tree WHERE menu_name = 'main' ORDER BY p1, p2, p3, p4, p5, p6, p7, p8, p9, weight;

Найти все дочерние элементы определенного пункта меню:

SELECT mlid, link_title, link_path FROM menu_tree WHERE materialized_path LIKE '123/%' ORDER BY weight;

Смотрите также

  • таблицу menu_link_content,
    которая хранит контентные ссылки меню
  • таблицу menu_tree,
    которая содержит иерархическую структуру меню
  • таблицу router,
    которая хранит информацию о маршрутах системы
  • таблицу cache_menu,
    которая кэширует построенные деревья меню
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить