Вы здесь

Мини-сниппет, вывод secondary menu, drupal 8

Мы привыкли в drupal6/7 что можно выводить ссылки второго уровня как отдельное меню, что называлось secondary menu.

Небольшой сниппет как получить желаемое на D8:

в yourtheme.theme:

/**
 * Implements hook_preprocess_HOOK().
 */

function yourtheme_preprocess_page(&$variables) {
  $secondary_menu = _render_secondary_menu('main');
  $variables['secondary_menu'] = $secondary_menu;
}

/*
 * Helper function for generate secondary menu items;
 */

function _render_secondary_menu($menu_name) {
  $menu_tree = \Drupal::menuTree();
  // Build the typical default set of menu tree parameters.
  $parameters = $menu_tree->getCurrentRouteMenuTreeParameters($menu_name);
  if(count($parameters->activeTrail) > 1) {
    $parameters->minDepth = 2;
    // Load the tree based on this set of parameters.
    $tree = $menu_tree->load($menu_name, $parameters);
    // Transform the tree using the manipulators you want.
    $manipulators = array(
      // Only show links that are accessible for the current user.
      array('callable' => 'menu.default_tree_manipulators:checkAccess'),
      // Use the default sorting of menu links.
      array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'),
    );
    $tree = $menu_tree->transform($tree, $manipulators);
    // Finally, build a renderable array from the transformed tree.
    $menu = $menu_tree->build($tree);
    return  array('#markup' => drupal_render($menu));
  }
}

в page.html.twig

{{ secondary_menu }}

не забываем сбросить кэш если у нас не dev mode.

1
5
07.03.2016 - 16:32

Комментарии

Аватар пользователя Chi
Chi – 07.03.2016 - 17:32

Можно с помощью блока выводить.

/**
 * Implements hook_preprocess_page().
 */
function yourtheme_preprocess_page(&$variables) {
  $block = \Drupal\block\Entity\Block::load('bartik_main_menu');
  $variables['secondary_menu'] = \Drupal::entityTypeManager()
    ->getViewBuilder('block')
    ->view($block);
}
Аватар пользователя adubovskoy
adubovskoy – 19.05.2016 - 12:21

Сам код актуален, но там пример как получить и отрисовать меню, другая задача решается.

Аватар пользователя Анатолий Полицын
Анатолий Полицын – 10.09.2016 - 00:41

Я по другому переписал параметры:

 $keyarray = array_slice($parameters->activeTrail, -2, 1);
 $key = array_shift($keyarray);
 $parameters->excludeRoot();
 $parameters->setRoot($key);

Тогда будут выводиться элементы только из текущей ветки меню, даже если другие будут в этот момент тоже раскрыты.