Come fare un suggerimento di hook a tema per i blocchi in base alla regione?


14

Dal momento che Drupal 8 non è possibile con le convenzioni di denominazione dei modelli caricare un modello di blocco specifico in base alla regione in cui è inserito ( "Markup dei blocchi per regione e funzione di modello di blocco per regione rimossa" ). Ma ho bisogno di avere HTML diversi per i blocchi se inseriti in una determinata regione. Come posso farlo?

Ho pensato di utilizzare MYMODULE_theme_suggestions_block_alter ma non so come ottenere la regione corrente.

Risposte:


20

È possibile ottenere la regione se si ottiene Entità blocco.

File .module o .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;
}

Modifica 1: Cover case case_manager.


Quasi perfetto. Devi aggiungere un isset () per assicurarti che #id sia davvero lì. Ad esempio, se usi page_manager e inserisci dei blocchi, non avrai un #id.
Berdir,

@Berdir grazie;). Penso che in questo caso isset()non sia richiesto, perché se non ce n'è uno #id, passa NULLalla ::loadfunzione e ritorna NULL. Alla fine, $blockè NULLe non succederà nulla. Testato in my dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (non avevo mai usato questo modulo prima).
Vagner,

Sì, è richiesto isset (). l'accesso a una chiave di array che non esiste provoca un avviso PHP. Controlla i tuoi registri e vedrai. Vorrei raccomandare di sviluppare sempre con visualizzazione dell'errore su verbose, che è l'impostazione predefinita dell'esempio settings.php.
Berdir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.