При работе с таксономией в Drupal нередко возникает потребность отображать термины по-разному в зависимости от контекста. Например, один и тот же термин в режиме teaser
должен выводиться компактно, а в режиме full
— с подробным описанием.
Если вы используете разные view mode для терминов таксономии, вполне логично захотеть разные Twig-шаблоны для каждого режима. Но есть нюанс: в отличие от сущностей node
, по умолчанию Drupal не предоставляет template suggestions для taxonomy_term
в зависимости от view mode.
Что Drupal делает по умолчанию
Когда Drupal рендерит термин таксономии, он ищет Twig-шаблон по следующим приоритетам:
taxonomy-term--[vocabulary].html.twig
— шаблон для словаря, напримерtags
;taxonomy-term.html.twig
— общий шаблон термина.
Однако, если термин отображается в режиме teaser
, full
, compact
и т.п. — это никак не влияет на шаблон, потому что suggestions для view mode не генерируются автоматически.
Как добавить template suggestions для view mode вручную
Чтобы шаблоны могли различаться в зависимости от view mode, добавим нужные подсказки в файл вашей темы (.theme
) через hook_theme_suggestions_taxonomy_term_alter()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function MYTHEME_theme_suggestions_taxonomy_term_alter( array &$suggestions, array $variables ) { if (!empty($variables['elements']['#view_mode'])) { $view_mode = $variables['elements']['#view_mode']; $term = $variables['elements']['#taxonomy_term']; $vocabulary = $term->bundle(); // Добавить шаблон по view mode $suggestions[] = 'taxonomy_term__' . $view_mode; // Добавить шаблон по словарю и view mode $suggestions[] = 'taxonomy_term__' . $vocabulary . '__' . $view_mode; } } |
После этого Drupal начнёт искать шаблоны:
taxonomy-term--teaser.html.twig
taxonomy-term--tags--teaser.html.twig
в зависимости от view mode и словаря.
Как это использовать
Допустим, вы хотите, чтобы термин из словаря topics
в режиме teaser
отображался особым образом. Создайте шаблон:
1 |
themes/custom/mytheme/templates/taxonomy-term--topics--teaser.html.twig |
Затем добавьте в него нужную разметку и логику. Например:
1 2 3 |
<div class="term term--teaser"> <h3>{{ term.name.value }}</h3> </div> |
На чаще всего копируют базовый шаблон и меняют его.
Нюансы
- Требуется очистка кэша после добавления хука:
drush cr
или через интерфейс. - Используйте двойное тире (
--
) в именах шаблонов, а не подчеркивания.
Хотя Drupal не предлагает template suggestions по view mode для taxonomy_term
из коробки, их можно легко добавить самостоятельно. Это делает темизацию терминов намного гибче и позволяет использовать все преимущества view mode, как у node
.