Как получить raw значение поля представления и перевод сущности title в Twig (Drupal)

Andy Wits Blog

Как получить raw значение поля представления и перевод сущности title в Twig (Drupal)

У меня была задача выводить в 1 view несколько полей из определённого типа материала. Точнее, это была страница, где во вкладках выводятся контакты офисов: город, адрес, телефон, карта и т.д.

Пришлось под дизайн делать свой twig. Тем более задача - использовать tailwind css. Я сделал шаблон views-view-list--MYVIEWNAME.html.twig в папке templates/views/

Так вот, я столкнулся с проблемой, описанной тут: Drupal.org Forum

То есть, когда я хочу вывести значение поля в шаблоне twig {{view.field.field_name.original_value}}, то получаю вместо нескольких городов офисов список по количеству материалов с одним городом. Что-то вроде: Лондон, Лондон, Лондон и т.д. А должно быть Лондон, Нью-Йорк, Амстердам и т.д.

Поиск в гугл почти ничего не дал, но натолкнул использовать другой способ поля: row.content['#row']._entity.fields.field.field_name.value

Кроме того пришлось посидеть с {{ dump(всякие-разные-варианты) }} И, о чудо, это работает!

Например, title можно выводить так: row.content['#row']._entity.fields.field.title.value

Например, можно вывести поля списком таким образом:

	<ul id="contacts-tabs-list" class="">

		{% for row in rows %}

			{% set field = row.content['#row']._entity.fields %}
			<li{{row.attributes.addClass('')}}>
				<button x-on:click="openTab = {{- field.nid.value -}}" :class="{ 'bg-lawsblue text-white': openTab === {{- field.nid.value -}}, 'bg-lawsgrey': openTab !== {{- field.nid.value -}} }" class="py-4 px-12 bg-lawsgrey hover:bg-lawsblue hover:text-white rounded">
					{{- field.title.value -}}
				</button>
			</li>
		{% endfor %}

	</ul>

Но тут возникает другая проблема - переводы entity не работают, если у вас мультиязычный сайт. Вот описание: Drupal StackExchange

Поэтому делаем так:

/**
 * Implements hook_preprocess_HOOK() for views_view_unformatted template.
 */
function MYTHEMENAME_preprocess_views_view_list__MYVIEWNAME(&$variables)
{
    $variables['lang'] = \Drupal::languageManager()->getCurrentLanguage()->getId();
}

и тогда меняем код так:


	<ul id="contacts-tabs-list" class="">

		{% for row in rows %}
			 {% set field = row.content['#row']._entity.translation(lang).fields %}
			<li{{row.attributes.addClass('')}}>
				<button x-on:click="openTab = {{- field.nid.value -}}" :class="{ 'bg-lawsblue text-white': openTab === {{- field.nid.value -}}, 'bg-lawsgrey': openTab !== {{- field.nid.value -}} }" class="py-4 px-12 bg-lawsgrey hover:bg-lawsblue hover:text-white rounded">
					{{- field.title.value -}}
				</button>
			</li>
		{% endfor %}

	</ul>

Вот теперь переводы работают!

Published on Jan 05 2025 at 5:15 am
Time to read 2 minute(s)
Categories
  • Web Development

Contact me on