Продолжаю публиковать сниппеты кода для drupal 9, на этот раз несколько полезных вещей, связанных с рендерингом меню.
Рендер меню по известному id меню
Вы знаете идентификатор, вам нужен рендер:
1 2 3 4 5 6 7 |
use Drupal\Core\Menu\MenuTreeParameters; $menu_id = 'my-menu'; $menu_tree_parameters = new MenuTreeParameters(); $tree = \Drupal::menuTree()->load($menu_id, $menu_tree_parameters); $tree_array = \Drupal::menuTree()->build($tree); print render($tree_array); |
Рендер с использованием нужного шаблона
Вы хотите подменить шаблон при рендеринге, тогда его имя нужно указать перед выполнением функции render().
Но сначала нужно создать какой то кастомный шаблон. Дефолтовым считается шаблон /core/modules/system/templates/menu.html.twig, его можно использовать как отправную точку для ваших модификаций. Допустим, вы создали на его базе файл с именем menu—custom.html.twig, тогда предыдущая версия кода изменится следующим образом:
1 2 3 4 |
... // обратите внимание, что дефисы заменяются подчеркиванием $tree_array['#theme'] = 'menu__custom'; print render($tree_array); |
Использование active trail
Чтобы меню подсветило навигацию до текущей страницы, необходимо правильно подготовить параметры на этапе инициализации дерева меню.
Данные об активной цепочке в меню предоставляются службой ‘menu.active_trail‘.
1 2 3 4 5 6 7 8 9 10 11 |
$menu_id = 'my-menu'; // запрос к active trail $activeTrailService = \Drupal::service('menu.active_trail'); $trails = $activeTrailService->getActiveTrailIds($menu_id); // формируем меню $menu_tree_parameters = new MenuTreeParameters(); $menu_tree_parameters->setActiveTrail($trails); $tree = \Drupal::menuTree()->load($menu_id, $menu_tree_parameters); // билд и рендеринг $tree_array = \Drupal::menuTree()->build($tree); print render($tree_array); |