Ітерація через поле змісту з декількома значеннями у шаблоні Twig


23

Мені потрібно взяти контроль над візуалізацією field_admin_tagsполя в node.html.twigшаблоні.

Це РОБОТА:

  • {{ content.field_admin_tags }} - Відображає все (мітка + усі значення поля)
  • {{ content.field_admin_tags.0 }} - Показує лише перше значення в полі, а не мітку

ПРОБЛЕМА: Я не контролюю розмітку навколо тегів, наприклад <ul><li>...</li></ul>.

Тож моя ідея полягала в перегляді масиву візуалізації .

Але це НЕ працює:

{% for tag in content.field_admin_tags %}
  {{ tag }}
{% endfor %}

Я отримую: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Я думаю, що я повторюю ключі / значення масиву візуалізації проти елементів всередині поля (якщо я роздруковую "X" у кожному циклі, я отримую 20 X, тоді як у мене є лише два-три значення в цьому полі) .

Я хотів би перебрати content.field_admin_tags.0, content.field_admin_tags.1і т.д.

Будь-яка ідея, як це виправити? Спасибі.


1
Питання про зроби drupal.org/node/2776307
gagarine

Відповіді:


15

Це можна виправити в польовій гілочці. Там ви можете використовувати існуючий цикл для перегляду елементів поля:

node.html.twig

{{ content.field_admin_tags }}

field - field-admin-tags.html.twig

<ul{{ attributes }}>
  {% for item in items %}
    <li>{{ item.content }}</li>
  {% endfor %}
</ul>

Цей приклад замінює <div>на <ul>. Не видаляйте {{ attributes }}та не обминайте шаблон поля, див. Що може порушити швидке редагування та як це виправити?


Це називається із батьківського шаблону з{{ content.field_admin_tags }}
1818

23

Погодьтеся з 4k4, шаблон поля - найкраще місце, якщо ви дійсно хочете його в шаблоні сутності (наприклад, вузол), ви можете зробити щось подібне:

{% for key, item in content.field_tags if key|first != '#' %}
  <div class="item-{{ key + 1 }}">{{ item }}</div>
{% endfor %}

Але чесно кажучи, я думаю, що це трохи некрасиво, шаблон поля - це правильне місце.


1
Домовились, це трохи некрасиво. ;) Дякую за фрагмент коду, хоча.
AngularChef

Прекрасно працює з різними типами антитела
Крістоф КАРОН

11

Якщо ви, як і я, шукаєте спосіб перебору абзаців на шаблоні гілочок вузла, ось як це зробити:

Припустимо, у вас є вузол з багатозначним полем абзацу, тому редактор вмісту може створювати кілька абзаців, і ви хочете повторити кожен абзац на шаблоні гілочок вузлів (наприклад, додати обгортку навколо кожного абзацу):

{% for key,value in node.my_paragraph_field.value %}
    {{ content.my_paragraph_field[key] }}
{% endfor %}

ОНОВЛЕННЯ: Мені потрібно було знайти інший спосіб надрукувати всі абзаци без використання вмісту. Змінна зміст містить усе, що ви налаштували у розділі "Керування дисплеєм" вузла, але мій поточний метод роботи - ніколи не використовувати "Керування дисплеєм", ані макети, оскільки ви фактично можете отримати доступ до всіх даних у файлі гілки вузла, і майже до всіх налаштування, які ви робили в "Керуванні дисплеєм", наприклад, застосуванні стилю зображення або встановлення формату дати, ... ви можете робити безпосередньо в гілочку.

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

У будь-якому випадку, використовуючи дивовижний модуль Twig Tweak, ось як надрукувати поле з великим значенням абзацу у файлі гілочки вузла, не використовуючи змінну вмісту:

{% for item in node.field_paragraphs %}
    {{ drupal_entity('paragraph', item.target_id) }}
{% endfor %}

1

Я знайшов #itemsвластивість корисною для створення циклів невідомої довжини в Twig:

print number of values within field:
{{ content.field_admin_tags['#items']|length }}

---

{# remember length in variable (minus 1 because it starts from 0): #}
{% set numTagsIndex = content.field_admin_tags['#items']|length - 1 %}

{# loop until the max value is reached: #}
{% for i in 0..numTagsIndex %}
  {{ content.field_admin_tags[i] }}
{% endfor %}

0

Якщо ви хочете розмістити додаткові обгортки навколо полів всередині абзацу або вам потрібні певні значення опорного поля абзацу, ви можете зробити наступне:

{% for key,value in node.paragraph_field_name.value %}

<div class="example-wrapper">
{{ content.paragraph_field_name[key]['#paragraph'].field_content.value }}
</div>

{% endfor %}

Роблячи це {{kint(content.paragraph_field_name[key])}}, ви побачите, що поля доступні всередині ['#paragraph'] частини масиву.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.