it-swarm.com.de

Wie kann ich auf das Hauptmenü in template_preprocess_page zugreifen?

Ich möchte das Hauptmenü meiner Site mit template_preprocess_page () einer Variablen zuweisen, damit ich einfach so etwas wie {{main_menu}} In der Seitenvorlage verwenden kann. Irgendwelche Ideen, wie ich das machen würde, ohne das Menü einer Region zuweisen zu müssen?

7
Janey

Denken Sie daran, dass Ihr Menü ein Block sein kann. Um es zu rendern, müssen Sie nur die Ansicht in einer Vorverarbeitungsfunktion laden und abrufen.

THEME.theme Datei

use Drupal\block\Entity\Block;
function THEME_preprocess_page(&$variables) {
  $menu = Block::load('id_main_menu');
  $variables['main_menu'] = \Drupal::entityTypeManager()->getViewBuilder('block')->view($menu);
}

page.html.twig

...
{{main_menu}}
...

Achtung
Sie müssen Ihren Block 'main_menu' irgendwo erstellen (Modulinstallation, Blockstrukturseite ...)

8
Vagner

Ich empfehle nicht, ein paar Dinge im Thema hart zu codieren, da dies die Schwierigkeit erhöht, zu verstehen, was auf der Website für neue Entwickler vor sich geht, aber dies ist auf verschiedene Arten möglich. Es wäre besser, das Block- und Regionssystem zu verwenden.

Verwenden des Dienstes menu.link_tree, um von Grund auf neu zu erstellen

Es ist wichtig zu wissen, dass hierdurch Rohdaten abgerufen werden. Ohne Transformation des Menübaums wird keine Zugriffsprüfung durchgeführt. Dies mag in Ordnung sein, da ein Hauptmenü öffentlich sein sollte, aber das ist nicht unbedingt der Fall.

$menu_name = "main_menu"; // I think
$menu_tree = \Drupal::service('menu.link_tree');
$parameters = new \Drupal\Core\Menu\MenuTreeParameters();
$parameters
  ->setMaxDepth(1) // Or however far down the tree you want to go.
  ->onlyEnabledLinks()
  ->excludeRoot();
$tree = $menu_tree->load($menu_name, $parameters);
// $manipulators = [['callable' => 'menu.default_tree_manipulators::checkAccess']];
// $tree = $menu_tree->transform($tree, $manipulators);
foreach ($tree as $item) {
  /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
  $link = $item->link;
}

Programmgesteuerte Verwendung einer bekannten Blockinstanz

Siehe @ Berdirs Antwort hier: https://drupal.stackexchange.com/a/153195/4265

6
mradcliffe