Как сделать предложение по теме для блоков по регионам?

14

Начиная с Drupal 8, с соглашениями об именах шаблонов невозможно загрузить конкретный шаблон блока в соответствии с регионом, в котором он находится ( «Удалена разметка блоков для каждого региона и удалена функция шаблонов для каждого региона» ). Но мне нужно иметь другой HTML для блоков, если они размещены в определенном регионе. Как мне это сделать?

Я думал об использовании MYMODULE_theme_suggestions_block_alter, но я не знаю, как получить текущий регион.

Филипп Майкл
источник

Ответы:

20

Вы можете получить регион, если вы получите Block Entity.

.module или .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;
}

Редактировать 1: Обложка страницы модуля менеджера страниц.

Vagner
источник
Практически идеально. Вам нужно добавить isset (), чтобы убедиться, что #id действительно есть. Например, если вы используете page_manager и размещаете там блоки, то у вас не будет #id.
Бердир
@Бердир спасибо;). Я думаю, что в этом случае isset()не требуется, потому что, если нет #id, то он переходит NULLк ::loadфункции, и просто возвращается NULL. В конце концов, $blockэто NULLи ничего не произойдет. Протестировано в моей среде разработки. Drupal 8.0.4 - page_manager-1.0-alpha23 (этот модуль никогда раньше не использовался).
Вагнер
Да, isset () требуется. доступ к ключу массива, который не существует, приводит к уведомлению PHP. Проверьте свои журналы, и вы увидите. Я бы порекомендовал всегда разрабатывать с отображением ошибок в подробном виде, который является значением по умолчанию для предоставленного примера settings.php.
Бердир