Таблица menu_links
Таблица menu_links является центральным хранилищем всех пунктов меню в Drupal. Она содержит как системные меню (например, Main navigation, Administration), так и пользовательские. Структура таблицы позволяет строить сложные иерархические меню с неограниченным уровнем вложенности.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
mlid |
serial |
Уникальный идентификатор пункта меню (Menu Link ID). Первичный ключ таблицы. |
id |
varchar(255) |
Машинное имя (идентификатор) пункта меню, обычно генерируется модулем, который создал ссылку. Должно быть уникальным. |
menu_name |
varchar(32) |
Машинное имя меню, к которому принадлежит ссылка (например, main, admin, footer). Связь с таблицей menu_tree.
|
plid |
int |
Идентификатор родительского пункта меню (Parent Menu Link ID). Равен 0, если ссылка находится на верхнем уровне.
|
link_path |
varchar(255) |
Внутренний путь Drupal или внешний URL, на который ведет пункт меню (например, node/1, https://example.com).
|
router_path |
varchar(255) |
Путь маршрутизатора, используемый для генерации ссылки и проверки доступа. Для внешних ссылок значение равно .
|
link_title |
varchar(255) |
Заголовок (анкор) ссылки, который отображается пользователю. |
options |
blob |
Сериализованный массив дополнительных параметров для ссылки (атрибуты HTML, классы, query-параметры и т.д.). |
module |
varchar(255) |
Имя модуля, который несет ответственность за этот пункт меню (например, system, user, menu).
|
hidden |
smallint |
Флаг, указывающий, скрыта ли ссылка. 0 - отображается, 1 - скрыта в меню, но доступна по прямому URL.
|
external |
smallint |
Флаг, указывающий, является ли ссылка внешней. 0 - внутренний путь Drupal, 1 - внешний URL.
|
has_children |
smallint |
Флаг, указывающий, есть ли у данного пункта меню дочерние элементы. 0 - нет детей, 1 - есть дети.
|
expanded |
smallint |
Флаг, указывающий, должно ли меню быть развернуто, если данный пункт является родительским. 0 - свернуто, 1 - развернуто.
|
weight |
int |
Вес пункта меню, определяющий его порядок относительно других пунктов на том же уровне иерархии. Меньшее значение означает более высокое положение. |
depth |
smallint |
Уровень вложенности пункта меню. 1 - корневой уровень, 2 - первый уровень вложенности и т.д.
|
customized |
smallint |
Флаг, указывающий, был ли пункт меню кастомизирован пользователем. 0 - системная ссылка, 1 - создана или изменена пользователем.
|
p1 |
int |
Первая часть материализованного пути (используется для оптимизации запросов на выборку дерева меню). Равна mlid корневого предка.
|
p2 |
int |
Вторая часть материализованного пути. Равна mlid предка на втором уровне.
|
p3 |
int |
Третья часть материализованного пути. Равна mlid предка на третьем уровне.
|
p4 |
int |
Четвертая часть материализованного пути. Равна mlid предка на четвертом уровне.
|
p5 |
int |
Пятая часть материализованного пути. Равна mlid предка на пятом уровне.
|
p6 |
int |
Шестая часть материализованного пути. Равна mlid предка на шестом уровне.
|
p7 |
int |
Седьмая часть материализованного пути. Равна mlid предка на седьмом уровне.
|
p8 |
int |
Восьмая часть материализованного пути. Равна mlid предка на восьмом уровне.
|
p9 |
int |
Девятая часть материализованного пути. Равна mlid предка на девятом уровне.
|
updated |
int |
Временная метка (timestamp) последнего обновления записи. |
Как это работает
Drupal строит меню, выбирая данные из таблицы menu_links и упорядочивая их по полям menu_name, plid, weight и link_title. Поля p1 - p9 (материализованный путь) оптимизируют запросы для построения древовидной структуры, так как позволяют быстро найти всех потомков определенного корневого элемента.
Пункты меню могут быть двух типов: системные (созданные модулями через hook_menu()) и пользовательские (добавленные через административный интерфейс). Системные ссылки обычно имеют customized = 0, а пользовательские - customized = 1.
При отрисовке меню система проверяет доступ пользователя к каждому пункту. Для внутренних ссылок (external = 0) проверка осуществляется на основе пути маршрутизатора (router_path). Ссылки, к которым у пользователя нет доступа, не отображаются.
Иерархия меню строится на основе связи plid (родительский ID). Если у пункта plid = 0, он считается корневым. Если plid ссылается на mlid другого пункта, то первый является дочерним по отношению ко второму.
Пример SQL-запроса
Выбрать все пункты главного меню с их детьми можно запросом:
SELECT m1.link_title AS Parent, m2.link_title AS Child, m2.link_path
FROM menu_links m1
RIGHT JOIN menu_links m2 ON m1.mlid = m2.plid
WHERE m2.menu_name = 'main'
ORDER BY m1.weight, m2.weight;
Смотрите также
-
таблицу
menu_tree,
которая хранит определения меню -
таблицу
menu_router,
которая содержит информацию о маршрутах -
таблицу
url_alias,
которая хранит псевдонимы путей -
таблицу
system,
которая содержит информацию о модулях и темах