Jak zrobić sugestię haka motywu dla bloków według regionu?

14

Od Drupala 8 przy konwencjach nazewnictwa szablonów nie jest możliwe ładowanie określonego szablonu bloku zgodnie z regionem, w którym jest on umieszczony ( „Usunięto znaczniki bloku dla regionu i usunięto szablon matrycy dla regionu ). Ale muszę mieć inny HTML dla bloków, jeśli są umieszczone w określonym regionie. Jak to osiągnąć?

Myślałem o użyciu MYMODULE_theme_suggestions_block_alter, ale nie wiem, jak uzyskać bieżący region.

Philipp Michael
źródło

Odpowiedzi:

20

Możesz uzyskać region, jeśli otrzymasz Block Entity.

Plik .module lub .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;
}

Edycja 1: Okładka skrzynki modułu page_manager.

Vagner
źródło
Prawie idealnie. Musisz dodać isset (), aby upewnić się, że #id naprawdę tam jest. Na przykład, jeśli użyjesz page_manager i umieścisz tam bloki, nie będziesz miał #id.
Berdir,
@Berdir dzięki;). Myślę, że w tym przypadku isset()nie jest to wymagane, ponieważ jeśli nie ma #id, to przechodzi NULLdo ::loadfunkcji i po prostu wraca NULL. W końcu $blockjest NULLi nic się nie wydarzy. Testowane w moim dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (nigdy wcześniej nie korzystałem z tego modułu).
Vagner,
Tak, isset () jest wymagane. dostęp do klucza tablicy, który nie istnieje, powoduje powiadomienie PHP. Sprawdź swoje dzienniki, a zobaczysz. Polecałbym zawsze rozwijać z wyświetlaniem błędów na pełnym, co jest domyślnym przykładem podanego przykładowego pliku settings.php.
Berdir