Як зробити пропозицію щодо гачка теми для блоків відповідно до регіону?


14

Оскільки в Drupal 8 неможливо із умовами іменування шаблонів завантажувати певний шаблон шаблону відповідно до регіону, в який він розміщений ( "Розмітка блоку в регіоні та шаблон шаблону блоку в регіоні видалена" ). Але мені потрібно мати різні html для блоків, якщо вони розміщені у певному регіоні. Як я це досягну?

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

Відповіді:


20

Ви можете отримати регіон, якщо отримаєте Block Entity.

.модуль або .тематичний файл

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: Випадок модуля титульної сторінки_manager.


Майже ідеально. Вам потрібно додати isset (), щоб переконатися, що #id насправді є. Наприклад, якщо ви використовуєте page_manager і розміщуєте там блоки, то у вас не буде #id.
Бердір

@Berdir спасибі;). Я думаю, що в цьому випадку isset()це не потрібно, тому що якщо його немає #id, то він переходить NULLу ::loadфункцію і просто повертається NULL. Зрештою, $blockє NULLі нічого не станеться. Випробувано в моїй програмі Dev env Drupal 8.0.4 - page_manager-1.0-alpha23 (ніколи не використовував цей модуль раніше).
Вагнер

Так, потрібен isset (). доступ до ключа масиву, який не існує, призводить до повідомлення PHP. Перевірте свої журнали, і ви побачите. Я б рекомендував завжди розроблятись із відображенням помилок на багатослівному, що є типовим для наведеного прикладу settings.php.
Бердір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.