Таблица menu_link_content
Таблица menu_link_content является основной таблицей для хранения пользовательских пунктов меню (тип сущности menu_link_content). Каждая запись в этой таблице представляет собой отдельный пункт, который может быть добавлен в любое меню, определенное в системе. Эти пункты меню управляются через административный интерфейс (Структура -> Меню) и, в отличие от пунктов меню, определяемых модулями (YAML-меню), могут быть легко изменены или удалены пользователем.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
id |
serial |
Первичный ключ, уникальный идентификатор (ID) пункта меню. |
revision_id |
int |
Внешний ключ, ссылающийся на menu_link_content_revision.mlid. Используется для системы ревизий, позволяющей отслеживать изменения пункта меню.
|
bundle |
varchar(255) |
Тип (бандин) пункта меню. По умолчанию используется значение menu_link_content. Позволяет при необходимости расширять функциональность через разные типы пунктов меню.
|
uuid |
varchar(128) |
Уникальный универсальный идентификатор (UUID) для данного пункта меню. Гарантирует уникальность в рамках всей системы, что важно для миграций и экспорта/импорта конфигурации. |
langcode |
varchar(12) |
Языковой код пункта меню (например, en, ru). Позволяет создавать многоязычные меню.
|
enabled |
int |
Флаг, указывающий, включен ли пункт меню. 1 - включен (отображается), 0 - отключен (не отображается).
|
title |
varchar(255) |
Заголовок (название) пункта меню, который отображается пользователям. |
description |
varchar(255) |
Описание пункта меню. Часто используется как текст всплывающей подсказки (title attribute) для ссылки. |
menu_name |
varchar(255) |
Машинное имя меню, в которое добавлен данный пункт (например, main, footer, account).
|
link__uri |
varchar(2048) |
URI ссылки пункта меню. Может быть внутренним (например, internal:/node/1, entity:node/1) или внешним (https://example.com).
|
link__title |
varchar(255) |
Текст ссылки. Обычно дублирует поле title, но может быть переопределен.
|
link__options |
blob |
Сериализованный массив дополнительных опций для ссылки, таких как атрибуты HTML, параметры запроса и т.д. |
external |
int |
Флаг, указывающий, является ли ссылка внешней. 1 - внешняя, 0 - внутренняя. Устанавливается автоматически на основе link__uri.
|
rediscover |
int |
Флаг, указывающий системе на необходимость "переоткрытия" пункта меню. Используется для динамически генерируемых пунктов меню. |
weight |
int |
Вес пункта меню, определяющий его положение относительно других пунктов в том же меню и на том же уровне вложенности. Меньшие значения выводятся первыми. |
expanded |
int |
Флаг, указывающий, должны ли дочерние пункты меню быть развернуты (видны) всегда, даже если родительский пункт не активен. 1 - развернут, 0 - свернут.
|
parent |
varchar(255) |
Идентификатор родительского пункта меню в формате menu_link_content:uuid. Определяет иерархию меню. Пустая строка означает, что пункт находится на верхнем уровне.
|
changed |
int |
Метка времени Unix, указывающая, когда запись была в последний раз изменена. |
default_langcode |
int |
Флаг, указывающий, является ли текущая запись переводом для языка по умолчанию. 1 - да, 0 - нет.
|
Как это работает
Когда администратор сайта добавляет новый пункт меню через интерфейс (например, в меню "Основное"), создается новая запись в таблице menu_link_content. Система заполняет такие поля, как title, link__uri, menu_name, weight и parent.
При построении меню для отображения на странице Drupal загружает все включенные (enabled = 1) пункты для конкретного menu_name. Затем система упорядочивает их по полю weight и строит иерархию на основе поля parent.
Пункты меню из этой таблицы могут быть переведены на разные языки, если включены соответствующие модули. Для каждого перевода создается отдельная запись, связанная с оригиналом через id и помеченная соответствующим langcode.
Важное отличие пользовательских пунктов меню (хранящихся в menu_link_content) от пунктов, определяемых модулями (в YAML-файлах), заключается в том, что первые могут быть изменены через UI и их данные хранятся в базе данных, в то время как вторые управляются кодом и могут быть переопределены в дочерней теме или модуле.
Пример SQL-запроса
Выбрать все включенные пункты меню "Основное" с их родительскими элементами можно следующим запросом:
SELECT
mlc.id,
mlc.title,
mlc.link__uri,
mlc.weight,
mlc.parent,
parent_menu.title AS parent_title
FROM menu_link_content mlc
LEFT JOIN menu_link_content_field_data parent_menu ON mlc.parent = CONCAT('menu_link_content:', parent_menu.uuid)
WHERE mlc.menu_name = 'main'
AND mlc.enabled = 1
ORDER BY mlc.weight ASC;
Смотрите также
-
таблицу
menu_link_content_data,
которая содержит данные полей для пунктов меню -
таблицу
menu_tree,
которая хранит оптимизированное дерево меню для быстрого построения -
таблицу
menu_link_content_revision,
которая хранит ревизии пунктов меню -
таблицу
menu_link_content_field_revision,
которая хранит ревизии данных полей пунктов меню