Меню в Drupal: практический пример для сайта
Соберём меню в Drupal 10.3 и 11.x для шапки сайта: добавим пункты через админку, настроим вложенность и разберём вариант через собственный модуль. Отдельно проверим права, кэш и типичные ошибки.

В Drupal 10.3 и 11.x меню можно собрать без кода за 10–15 минут, но первый рабочий вариант часто ломается на вложенности, правах доступа и кэше. Ниже соберём меню сайта с пунктами «Каталог», «Доставка» и «Контакты», а затем сравним настройку через админку с меню, объявленным в собственном модуле.
Что должно получиться
В примере используется стандартное меню Main navigation. В нём будут три ссылки:
- «Каталог» — страница или раздел с товарами;
- «Доставка» — отдельная внутренняя страница;
- «Контакты» — страница с реквизитами и формой связи.
«Доставка» и «Контакты» можно оставить верхними пунктами. Если у каталога есть разделы «Одежда» и «Аксессуары», они станут дочерними ссылками «Каталога». Для работы нужны учётная запись с правом управлять меню и доступ к сайту на Drupal 10.3 или 11.x. Названия кнопок могут немного отличаться у разных тем и сборок Drupal.
Меню в Drupal — это не просто список ссылок. У каждого пункта есть маршрут, родитель, вес и проверка доступа, поэтому визуальная ошибка часто начинается не в шаблоне, а в конфигурации.
Подходы: админка, модуль или готовая навигация темы
Для обычных страниц достаточно админки. Код оправдан, когда ссылка должна поставляться вместе с модулем, иметь собственный маршрут или автоматически появляться после установки функциональности. Третий вариант — меню, которое выводит сама тема или конструктор, — удобен для быстрых лендингов, но хуже переносится между темами.
| Подход | Когда выбирать | Цена решения |
|---|---|---|
| Админка Drupal | Контент-менеджер добавляет страницы и разделы | Быстро, но ссылки нужно поддерживать вручную |
| Собственный модуль | Пункт связан с маршрутом и функциональностью модуля | Нужны YAML-файлы, код и очистка кэша |
| Настройки темы или конструктора | Нужно быстро собрать визуальную навигацию | Меньше контроля над доступом и переносимостью |
В практическом проекте начинайте с админки. Если ссылка должна существовать только вместе с конкретным модулем, переносите её в код. Инвалидация кэша меню — отдельная тема; здесь достаточно понимать, как принудительно увидеть изменённую структуру.
Вариант 1. Собираем меню через админку
Шаг 1. Создайте страницы
Откройте Content → Add content и создайте материалы «Каталог», «Доставка» и «Контакты». Сохраните каждый материал. Для страниц, которые должны быть доступны из меню, проверьте, что публикация включена.
Drupal назначит материалу внутренний путь вроде /node/15. Для посетителей лучше использовать понятный адрес. В поле URL alias укажите, например, /catalog, /delivery и /contacts, если такие адреса ещё не заняты.
Проверка: откройте каждый адрес в отдельной вкладке без режима редактирования. Страница должна открываться для обычного посетителя.
Шаг 2. Откройте управление Main navigation
Перейдите в Structure → Menus. Найдите Main navigation и нажмите Edit menu или ссылку с похожим названием. Затем выберите Add link.
Заполните форму для первого пункта:
- Menu link title: Каталог;
- Link: внутренний путь
/catalog; - Enabled: включён;
- Show as expanded: выключен, если у каталога пока нет дочерних пунктов;
- Weight: 0.
Не вставляйте в поле Link полный URL сайта, если ссылка ведёт на страницу этого же Drupal-сайта. Внутренний путь проще переносить между доменами и окружениями.
Проверка: после сохранения пункт «Каталог» появится в списке Main navigation.
Шаг 3. Добавьте остальные ссылки и расставьте порядок
Повторите действие для «Доставки» и «Контактов». В поле Parent link оставьте значение верхнего уровня. Для порядка используйте вес или перетащите строки мышью, если интерфейс показывает маркеры перетаскивания.
Меньший вес обычно поднимает пункт выше, но окончательный порядок задаётся всей структурой меню и настройками темы. После изменения порядка нажмите Save внизу страницы.
Проверка: обновите главную страницу и убедитесь, что пункты идут в ожидаемой последовательности. Проверяйте меню в режиме инкогнито, если вы вошли под администратором.
Шаг 4. Сделайте вложенные пункты
Создайте ссылки «Одежда» и «Аксессуары». В поле Parent link выберите «Каталог». Если хотите показать дочерние пункты сразу, включите Show as expanded у «Каталога». Некоторые темы всё равно показывают вложенные ссылки только после наведения или нажатия — это уже поведение темы, а не структуры Drupal.
Проверка: в списке меню дочерние пункты должны быть визуально смещены вправо относительно «Каталога». На сайте проверьте десктопное и мобильное меню.
Вариант 2. Добавляем ссылку из собственного модуля
Этот способ нужен, когда пункт меню должен поставляться вместе с кодом. Например, модуль создаёт страницу «Доставка» и одновременно добавляет ссылку на неё. Ниже пример для Drupal 10.3 и 11.x. Машинное имя модуля — site_menu.
Файл описания модуля
Создайте файл site_menu.info.yml в каталоге modules/custom/site_menu:
name: Site menu
type: module
description: 'Adds a delivery page to the main menu.'
package: Custom
core_version_requirement: '^10.3 || ^11'
В YAML не добавляйте лишние пробелы перед ключами. В частности, type, description и core_version_requirement должны находиться на одном уровне.
Маршрут страницы
Создайте site_menu.routing.yml:
site_menu.delivery:
path: '/delivery'
defaults:
_controller: '\Drupal\site_menu\Controller\SiteMenuController::delivery'
_title: 'Delivery'
requirements:
_permission: 'access content'
Теперь добавьте контроллер в файл src/Controller/SiteMenuController.php:
<?php
namespace Drupal\site_menu\Controller;
use Drupal\Core\Controller\ControllerBase;
final class SiteMenuController extends ControllerBase {
public function delivery(): array {
return [
'content' => [
'#markup' => $this->t('Delivery information'),
],
];
}
}
Для реального сайта вместо простого текста лучше вернуть render array с полями или отдельным шаблоном. Здесь контроллер нужен только для воспроизводимого примера.
Описание пункта меню
Создайте site_menu.links.menu.yml рядом с файлом модуля:
site_menu.delivery:
title: 'Delivery'
description: 'Information about delivery'
route_name: site_menu.delivery
menu_name: main
weight: 10
После включения модуля очистите кэш через административную страницу Configuration → Development → Performance или штатным инструментом, который используется в вашем окружении. Затем откройте /delivery и главную страницу.
Проверка: маршрут должен вернуть страницу с текстом «Delivery information», а пункт «Delivery» должен появиться в Main navigation. Если страница открывается, но ссылки в меню нет, сначала проверьте имя файла и значение menu_name: main.
Что ломается чаще всего
Пункт сохранён, но на сайте его нет
Проверьте, что ссылка включена, у неё правильное родительское меню, а тема действительно выводит Main navigation. Затем очистите кэш. Администратор может видеть пункт, который скрыт для анонимного пользователя из-за проверки доступа к целевому маршруту.
Открывается страница 404
В админке путь должен начинаться с косой черты, например /contacts. Проверьте, что материал опубликован, псевдоним не изменился, а маршрут из модуля совпадает с route_name. Для ссылки на внешний сайт используйте полный URL, но не смешивайте его с внутренним путём.
Вместо страницы появляется 403
Код 403 означает отказ в доступе. Проверьте разрешения роли и значение _permission в маршруте. Не выдавайте всем посетителям административные разрешения ради одной ссылки: исправлять нужно доступ к маршруту.
После изменения YAML ничего не меняется
Drupal кэширует определения маршрутов и меню. Очистите кэш после изменения .routing.yml, .links.menu.yml и файла описания модуля. Если ошибка сохраняется, проверьте синтаксис YAML и журнал сообщений в разделе Reports → Recent log messages.
Когда выбирать каждый подход
Используйте админку, если пункты меняются вместе с контентом и их редактируют менеджеры. Это самый короткий путь для «Каталога», «Доставки» и «Контактов». Собственный модуль выбирайте, если маршрут является частью функциональности и должен автоматически появляться после установки модуля.
Настройки темы подходят для визуального поведения: раскрытия мобильного меню, расположения кнопки и оформления. Не переносите туда бизнес-логику и контроль доступа. Права должны проверяться Drupal на маршруте, а не только скрытием пункта в шаблоне.
Что проверить перед публикацией
- открывается ли каждый пункт для анонимного посетителя;
- не ведут ли ссылки на старый
/node/..., если для страницы уже создан псевдоним; - видны ли дочерние пункты на мобильном экране;
- не дублируются ли одинаковые ссылки в Main navigation и меню темы;
- что происходит с пунктом, если пользователь не имеет доступа к целевой странице;
- очищен ли кэш после изменений в YAML или структуре меню.
Что делать дальше
После сборки меню настройте человекочитаемые URL и проверьте их в отчётах веб-сервера или аналитики. Для кодового варианта добавьте автоматическую проверку маршрута и разрешений в тестовое окружение, прежде чем включать модуль на рабочем сайте. Если меню стало большим, отдельно изучите управление локализацией ссылок и поведение конкретной темы Drupal, не смешивая эти задачи со структурой меню.
Термин: render array — структурированный массив Drupal, из которого система собирает HTML. В контроллере лучше возвращать render array, а не склеивать полный HTML вручную: так сохраняются кеширование, темы и дополнительные настройки вывода.
Тест и проверочная: Быстрые ответы с объяснением, почему остальные варианты неверны
Спросить за 10 ₽Источники: Working with menus in Drupal, Providing module-defined menu links
Частые вопросы
Как добавить пункт меню без программирования?
Почему пункт меню виден администратору, но не обычному посетителю?
Что делать, если после изменения YAML Drupal показывает старое меню?
Можно ли сделать вложенное меню в Drupal?
Что делать, если у меня Drupal 9 или другая версия Drupal 10?
Нужно ли добавлять ссылку в меню кодом, если страницу создаёт модуль?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.