Wie kann ich auf das Hauptmenü in template_preprocess_page zugreifen?

7

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?

Janey
quelle

Antworten:

8

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 ...)

Vagner
quelle
Ein Menü ist kein Block. Das Kernmenü-Modul bietet jedoch Block-Plugins für jedes Menü (oder ein Plugin mit Ableitungen).
mradcliffe
6

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 die Antwort von @ Berdir hier: https://drupal.stackexchange.com/a/153195/42650

mradcliffe
quelle
1
Dies sieht aus wie die Route, auf der ich gehen möchte, aber wenn ich die (print_r ($ link)) innerhalb dieser Schleife ausführe, erhalte ich ein völlig leeres Ergebnis. Gleiches passiert, wenn ich versuche, $ tree auszudrucken. Ich habe es doppelt überprüft und der Menüname ist korrekt und der Rest des Codes ist genau der gleiche. Ich führe dies in der Vorverarbeitungsseitenfunktion aus
Matt
1
Was ist mit var_dump($link); exit;?
mradcliffe
1
das gleiche Problem wie @Matt
GiorgosK