Como fazer uma sugestão de gancho de tema para blocos de acordo com a região?


14

Como o Drupal 8, nas convenções de nomenclatura de modelos, não é possível carregar um modelo de bloco específico de acordo com a região em que ele é colocado ( "Removido o recurso de marcação por bloco por região e modelo de bloco por região removido" ). Mas eu preciso ter html diferente para blocos se colocado em uma determinada região. Como eu faço isso?

Pensei em usar MYMODULE_theme_suggestions_block_alter, mas não sei como obter a região atual.

Respostas:


20

Você pode obter a região se obtiver a Entidade de bloco.

arquivo .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;
}

Edição 1: Capa do módulo page_manager.


Quase perfeito. Você precisa adicionar um isset () para garantir que o #id esteja realmente lá. Por exemplo, se você usar o page_manager e colocar blocos lá, não terá um #id.
Berdir

@Berdir obrigado;). Eu acho que, neste caso, isset()não é necessário, porque se não houver um #id, ele passa NULLa ::loadfuncionar e basta retornar NULL. No final, $blocké NULLe nada vai acontecer. Testado no meu ambiente de desenvolvimento Drupal 8.0.4 - page_manager-1.0-alpha23 (nunca usei este módulo antes).
Vagner

Sim, isset () é necessário. acessar uma chave de matriz que não existe resulta em um aviso do PHP. Verifique seus logs e você verá. Eu recomendaria sempre desenvolver com a exibição de erros detalhada, que é o padrão do exemplo settings.php fornecido.
Berdir
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.