Рейтинг:3

Как я могу создать массив рендеринга, результатом которого будет строка, а не объект Drupal\Core\Render\Markup?

флаг in

я хотел бы использовать Твиг Твик друпал_просмотр() для отображения представления в моем шаблоне абзаца. У меня есть пара полей ссылок на сущности в абзаце, и мне нужны идентификаторы ссылочных сущностей, переданные в качестве аргументов контекстного фильтра.

я построил Строка контекстного фильтра средство форматирования поля для форматирования строки контекстного фильтра в надежде, что ее можно будет передать непосредственно в качестве значения аргумента. Форматтер вернется все если поле ссылки пусто, в противном случае оно вернет идентификаторы ссылочных объектов в виде строки с разделителями И/ИЛИ, например. 1,2,3 для И или 1+2+3 для ИЛИ.

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

{% set arg1 = content.field_arg1|рендеринг %}
{% set arg2 = content.field_arg2|рендеринг %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Но это не работает!

Вместо строк мои переменные arg на самом деле Друпал\Ядро\Визуализация\Разметка объекты, поэтому аргументы не передаются в представление правильно.

После исследования я обнаружил, что могу обойти эту проблему, отфильтровав переменные arg с помощью php-фильтра, который возвращает строку. Например, использование фильтра обрезки работает:

{% set arg1 = content.field_arg1|рендеринг|обрезка %}
{% set arg2 = content.field_arg2|рендеринг|обрезка %}

{{ drupal_view('my_view', 'my_display', arg1, arg2) }}

Если возможно, я хотел бы построить массив рендеринга, который не требует каких-либо причудливых действий в шаблоне для передачи значений в друпал_просмотр() функция. т.е. массив рендеринга, где я могу передать content.field_arg1 или же content.field_arg|рендеринг непосредственно в качестве аргументов. Это возможно?

Массивы рендеринга, которые я пробовал, не работали:

$inline_template = [
  '#type' => 'inline_template',
  '#template' => '{{ contextual_filter_string }}', // здесь также пробовали |trim filter
  '#контекст' => [
    'contextual_filter_string' => '1+2+3',
  ],
];

$разметка = [
  '#разметка' => '1+2+3',
];

$plain_text = [
  '#plain_text' => '1+2+3',
];

Примечание. В приведенных выше массивах рендеринга не показаны метаданные кеша (теги) для сущностей, на которые есть ссылки в поле.

Да, есть альтернативные способы получить значения этих полей и передать их в друпал_просмотр(), однако это не то, о чем этот вопрос. Я хотел бы использовать средство форматирования поля для возврата массива рендеринга (я думаю, мне нужно вернуть массив рендеринга), в результате чего строка готова для передачи непосредственно в друпал_просмотр(). Это позволяет мне настроить формат аргумента в пользовательском интерфейсе, не касаясь кода. Подозреваю, что это невозможно.

Некоторые альтернативные подходы, которые я рассматривал:

  • Я мог бы предварительно обработать свой абзац и добавить эти строки фильтра в $переменные множество.
  • Я мог бы создать свою собственную функцию ветки для генерации этих строк контекстного фильтра.
  • Я мог бы получить значения непосредственно из объекта в моем шаблоне, например. para.field_arg1.target_id как ответил Лес Лим, но это не работает для полей с несколькими значениями.

Редактировать: Кажется, что это невозможно, поэтому примите ответ Леса Лима как лучшую альтернативу.

4uk4 avatar
флаг cn
Для PHP см. https://drupal.stackexchange.com/questions/207699/how-to-get-an-array-of-referenced-entity-ids-from-an-entity-reference-field. Если вы используете текущую версию Drupal Twig 2.14, это также возможно в Twig. См. https://twig.symfony.com/doc/2.x/filters/column.html.
Les Lim avatar
флаг us
Я отредактировал свой ответ, а затем обновил его, чтобы увидеть ваше дополнение к вопросу внизу. Я не уверен, что у меня есть прямой ответ для вас; Я думаю, что вы обнаруживаете, что система форматирования полей не предназначена для использования так, как вы пытаетесь ее использовать. Предполагается, что он должен возвращать отфильтрованную/экранированную HTML-разметку, а не необработанные неэкранированные строки, которые вы хотели бы использовать в качестве аргумента представления.
sonfd avatar
флаг in
@LesLim - Да, спасибо, у меня тоже такое впечатление. Я действительно хотел, чтобы форматер работал чисто, потому что его было бы так легко настроить и повторно использовать без особых знаний PHP или Twig. Ваши правки полезны, хотя в конечном итоге они не отвечают на мой вопрос.
Les Lim avatar
флаг us
@ 4k4 Спасибо за совет о фильтре столбцов Twig! Я снова отредактировал свой ответ.
Рейтинг:7
флаг us

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

Вместо использования визуализированного вывода поля, который вы получаете с элементами в {{ содержание }} массив, вам, вероятно, следует использовать необработанные значения непосредственно из сущности.Необработанные значения, скорее всего, будут тем, что ваши аргументы Views ищут в первую очередь.

В Drupal 8/9, если необработанный объект доступен для шаблона Twig (и он предназначен для шаблонов Paragraph), вы можете использовать нотацию Entity API для получения точных необработанных значений из вашего объекта:

{% set arg1 = para.field_arg1.target_id %}
{% set arg2 = para.field_arg2.target_id %}

Дополнение для необходимости объединения нескольких необработанных значений поля

Перечитав вопрос, я понимаю, что вам нужны все необработанные значения из поля, объединенного строкой. Модуль contrib Twig Field Value предоставляет удобные общие инструменты именно для этой цели. В этом случае вы должны использовать его field_raw фильтр:

{% set arg1 = content.field_arg1|field_raw('target_id')|safe_join('+') %}
{% set arg2 = content.field_arg2|field_raw('target_id')|safe_join(',') %}

Изменить: объединить несколько необработанных значений поля без значения поля Twig (спасибо 4k4 за подсказку)

На самом деле вам не нужно значение поля Twig, чтобы получить target_id значения из поля с несколькими значениями — вы можете извлечь несколько значений из необработанного поля объекта, используя встроенный в Twig столбец фильтр.

{% set arg1 = para.field_arg1|column('target_id')|safe_join('+') %}
{% set arg2 = para.field_arg2|column('target_id')|safe_join(',') %}
sonfd avatar
флаг in
Бросьте `|default('all')` в конце, и вы даже можете получить `all` в качестве значения, если поле пусто.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.