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

Таблица 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,
    которая содержит информацию о модулях и темах
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить