Как получить доступ к полевым данным в Twig?

15

У меня есть поле списка для пользовательского типа блока, который выглядит следующим образом:

left|Align left
right|Align right

Я могу получить доступ к ключу в Twig, выполнив что-то вроде этого:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

Однако, если я сделаю простое сравнение, то получится FALSE.

{{ kint(content.field_align == 'right') }}

Следующий код возвращается TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

Существует ли более короткая версия для получения «настоящей» строки, чтобы я мог использовать строковые фильтры Twigs и поддерживать ее в чистоте?

estrar
источник
Связанный: drupal.stackexchange.com/a/228393/15055
leymannx

Ответы:

16

content содержит массивы рендеринга на основе настроенных форматеров.

Если вы хотите получить доступ к фактическим значениям, вы хотите получить доступ к ним через объект сущности. Как правило, это уже доступно для вашего шаблона, например node. Для вашего случая это немного особенное, потому что block_content визуализируется в содержимом блока без собственного шаблона, поэтому вы должны сделать его доступным самостоятельно yourtheme_preprocess_block($variables)следующим образом:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Затем вы можете получить доступ к значению поля с помощью block_content.field_name.property. Так что в вашем случае block_content.field_align.value. Это свойство предназначено valueдля большинства типов полей, для ссылок вы можете использовать либо target_idидентификатор, либо entityобъект ссылочной сущности. Да, вы можете напрямую обращаться к этим полям, но всегда проверяйте, существует ли ссылка, иначе вы можете получить фатальные ошибки или исключения. Например, чтобы получить доступ к метке ссылки на термин, вы можете получить к ней доступ как block_content.field_tags.entity.name.value.

Если вы не укажете поле delta, по умолчанию оно будет первым. Если вы хотите получить доступ к другой дельте, вы можете использовать entity.field_name.1.valueи так далее. Вы также можете зациклить их.

Все это отображается непосредственно в PHP, вы также можете сделать это $block_content->field_tags->entity->name->valueв preprocess и других местах, где у вас есть block_content.

Berdir
источник
Спасибо за Ваш ответ! Поскольку я делаю это из шаблона блочной ветки, где объект узла недоступен (подраздел «Классный»), нужно ли мне предварительно обрабатывать значения и вводить их каким-либо образом?
Эстрар
Извините, я пропустил часть block_content. Обновил ответ.
Бердир
Отлично! Я мог бы получить значения, сделав это: block_content.field_name.value Спасибо, что помогли мне понять!
Эстрар
6

Вот альтернативный, единственный шаблонный способ, который позволяет вам визуализировать массив рендеринга и проверить его значение (позволяет проверять переменную, как если бы вы ее печатали, потому что печать в Drupal 8 Twig автоматически рендерит переменные, которые являются массивами рендеринга):

{{ kint(content.field_align|render == 'right') }}

Или другой вариант, чтобы сохранить дополнительный рендер, если вы печатаете переменную позже:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}
Cottser
источник
Очень полезно и полезно знать! Спасибо за вклад.
Эстрар
2

В этом случае вы можете использовать модуль Twig Field Value . Это позволяет получать частичные данные из массивов рендеринга полей. Например content.field_name | field_value -get значение поля. Вы можете использовать его в заявлении IF

Андрей Козориз
источник