Wie erstelle ich einen Vorschlag für einen Themenhaken für Blöcke nach Region?


14

Seit Drupal 8 ist es mit Vorlagenbenennungskonventionen nicht möglich , eine bestimmte Blockvorlage entsprechend der Region zu laden, in der sie platziert ist ( "Block-Markup pro Region und Block-Templating-Funktion pro Region entfernt" ). Aber ich brauche ein anderes HTML für Blöcke, wenn ich es in einer bestimmten Region platziere. Wie mache ich das?

Ich habe überlegt, MYMODULE_theme_suggestions_block_alter zu verwenden, weiß aber nicht, wie ich die aktuelle Region abrufen soll .

Antworten:


20

Sie können eine Region erhalten, wenn Sie Block Entity erhalten.

.module oder .theme Datei

use Drupal\block\Entity\Block;

function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (!empty($variables['elements']['#id'])) {
    $block = Block::load($variables['elements']['#id']);
    $suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
  }
  /* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
  else if (isset($variables['elements']['#configuration']['region'])) {
    $suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
  }
  return $suggestions;
}

Edit 1: Cover page_manager Modul Fall.


Fast perfekt. Sie müssen ein isset () hinzufügen, um sicherzustellen, dass die #id wirklich vorhanden ist. Wenn Sie beispielsweise page_manager verwenden und dort Blöcke platzieren, haben Sie keine #ID.
Berdir

@Berdir danke;). Ich denke, dass in diesem Fall isset()nicht erforderlich ist, weil, wenn es keine gibt #id, dann übergeben, um NULLzu ::loadfunktionieren, und einfach zurückzukehren NULL. Am Ende $blockist NULLund wird nichts passieren. Getestet in meinem dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (habe dieses Modul noch nie benutzt).
Vagner

Ja, isset () ist erforderlich. Der Zugriff auf einen Array-Schlüssel, der nicht existiert, führt zu einem PHP-Hinweis. Überprüfen Sie Ihre Protokolle und Sie werden sehen. Ich würde empfehlen, immer mit Fehleranzeige auf verbose zu entwickeln, was die Standardeinstellung der mitgelieferten Beispieleinstellungen.php ist.
Berdir
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.