it-swarm.com.de

So erstellen Sie eine benutzerdefinierte Vorlage Twig Vorlage für Menüblock

Ich verwende einen Menüblock, um einen Abschnitt meines Hauptmenüs in eine Region auszugeben, damit ich auf jeder Seite ein Untermenü vom Typ "In diesem Abschnitt" haben kann.

Leider kann ich in menu.html.twig keinen Weg finden, um festzustellen, mit welcher Wiedergabe von "main_menu" ich arbeite. (beide haben den gleichen "Menünamen") Ich möchte das Markup für den Menüblock anpassen, aber nicht für mein Hauptmenü.

Eine ähnliche Frage wurde hier gestellt: Zusätzliche twig Vorschläge für Menüs in Drupal 8

Ich verstehe die vorgeschlagene Antwort nicht ganz. Gibt es eine Möglichkeit, eine Klasse zu erweitern, um eine andere Twig Vorlage) aufzurufen? Gibt es einen Haken, den ich vermisse?

2
Greg

Ok, ich glaube ich habe die Antwort gefunden. Kristian Kaa beantwortet es auf seinem Blog hier: http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion

Grundsätzlich verwenden Sie 2 Vorverarbeitungsfunktionen wie folgt:

/**
 * Implements hook_preprocess_block().
 */
function mymodule_preprocess_block(&$variables) {
  $variables['content']['#attributes']['block'] =    $variables['attributes']['id'];
}

/**
 * Implements hook_theme_suggestions_HOOK_alter().
 */
function mymodule_theme_suggestions_menu_alter(array &$suggestions, array $variables) {
  // Remove the block and replace dashes with underscores in the block ID to
  // use for the hook name.
  if (isset($variables['attributes']['block'])) {
    $hook = str_replace(array('block-', '-'), array('', '_'),    $variables['attributes']['block']);
    $suggestions[] = $variables['theme_hook_original'] . '__' . $hook;
  }
}

Dadurch wird die Block-ID als neuer Vorschlag für einen Themen-Hook hinzugefügt. Vielen Dank an Kristian.

4
Greg

FWIW, ich bin auf ein Problem gestoßen, als ich die Antwort von Greg verwendet habe, bei der ich Fehler über $variables['attributes']['id'] ohne die "id" -Taste. Um dies zu beheben, habe ich eine Überprüfung hinzugefügt, um sicherzustellen, dass dieser Schlüssel gesetzt ist.

/**
 * Implements hook_preprocess_block().
 * http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
 */
function THEMENAME_preprocess_block(&$variables) {
  if(isset($variables['attributes']['id'])) {
    $variables['content']['#attributes']['block'] = $variables['attributes']['id'];
  }
}
1
Amazing Rando