Comment faire une suggestion de crochet de thème pour les blocs selon la région?

14

Depuis Drupal 8, il n'est pas possible avec les conventions de dénomination de modèle de charger un modèle de bloc spécifique en fonction de la région dans laquelle il est placé ( "Marquage de bloc par région et fonctionnalité de modèle de bloc par région supprimés" ). Mais j'ai besoin d'avoir différents html pour les blocs s'ils sont placés dans une certaine région. Comment est-ce que j'accomplis ceci?

J'ai pensé à utiliser MYMODULE_theme_suggestions_block_alter mais je ne sais pas comment obtenir la région actuelle.

Philipp Michael
la source

Réponses:

20

Vous pouvez obtenir une région si vous obtenez une entité de blocage.

Fichier .module ou .theme

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 module case.

Vagner
la source
Presque parfait. Vous devez ajouter un isset () pour vous assurer que le #id est vraiment là. Par exemple, si vous utilisez page_manager et y placez des blocs, vous n'aurez pas de #id.
Berdir
@Berdir merci;). Je pense que dans ce cas isset()n'est pas nécessaire, car s'il n'y en a pas #id, alors il passe NULLà ::loadfonctionner, et revient simplement NULL. Au final, $blockc'est NULLet rien ne se passera. Testé dans mon dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (jamais utilisé ce module auparavant).
Vagner
Oui, isset () est requis. l'accès à une clé de tableau qui n'existe pas entraîne une notification PHP. Vérifiez vos journaux et vous verrez. Je recommanderais de toujours développer avec affichage d'erreur sur verbose, qui est la valeur par défaut de l'exemple settings.php fourni.
Berdir