Таблица 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,
которая кэширует построенные деревья меню