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 .

Philipp Michael
quelle

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.

Vagner
quelle
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