Iterasi melalui beberapa bidang konten nilai dalam template Twig


23

Saya perlu mengendalikan rendering field_admin_tagsbidang dalam node.html.twigtemplat.

Ini bekerja:

  • {{ content.field_admin_tags }} - Memberikan semuanya (label + semua nilai bidang)
  • {{ content.field_admin_tags.0 }} - Memberikan hanya nilai pertama di bidang, dan tidak ada label

MASALAH: Saya tidak memiliki kendali atas markup yang mengelilingi tag, mis <ul><li>...</li></ul>.

Jadi ide saya adalah untuk beralih di atas render array .

Tapi itu TIDAK berhasil:

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

Saya mendapatkan: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Saya pikir saya mengulangi kunci / nilai array render vs item di dalam bidang (jika saya mencetak "X" di setiap loop, saya mendapatkan 20 X sementara saya hanya memiliki dua atau tiga nilai di bidang ini) .

Saya ingin iterate atas content.field_admin_tags.0, content.field_admin_tags.1, dll

Adakah cara untuk memperbaikinya? Terima kasih.


1
Masalah pada do drupal.org/node/2776307
gagarine

Jawaban:


15

Anda bisa memperbaiki ini di ranting bidang. Di sana Anda dapat menggunakan loop yang ada untuk beralih item item:

node.html.twig

{{ content.field_admin_tags }}

bidang - bidang-admin-tags.html.twig

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

Contoh ini menggantikan <div>dengan <ul>. Jangan menghapus {{ attributes }}atau memintas templat bidang, lihat Apa yang dapat merusak quickedit, dan bagaimana cara memperbaikinya?


Ini disebut dari templat induk dengan{{ content.field_admin_tags }}
aydow

23

Setuju dengan 4k4 templat bidang adalah tempat terbaik, jika Anda benar-benar menginginkannya dalam templat entitas (misal simpul), Anda dapat melakukan sesuatu seperti ini:

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

Tapi jujur ​​saya pikir itu agak jelek, templat bidang adalah tempat yang tepat.


1
Setuju, ini agak jelek. ;) Terima kasih atas cuplikan kode.
AngularChef

Berfungsi sempurna dengan berbagai jenis
undangan

11

Jika Anda, seperti saya, sedang mencari cara untuk beralih melalui paragraf pada templat ranting sebuah simpul, berikut ini cara melakukannya:

Misalkan Anda memiliki simpul dengan bidang paragraf multinilai, sehingga editor konten dapat membuat beberapa paragraf dan Anda ingin mengulangi setiap paragraf pada templat ranting node (misalnya untuk menambahkan pembungkus di sekitar setiap paragraf):

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

UPDATE: Saya perlu menemukan cara lain untuk mencetak semua paragraf tanpa menggunakan konten. Variabel konten berisi semua yang Anda atur di bagian 'Kelola tampilan' dari node, tetapi metode pekerjaan saya saat ini adalah untuk tidak pernah menggunakan 'Kelola tampilan' atau tata letak karena Anda benar-benar dapat mengakses semua data dalam file ranting node, dan hampir semua pengaturan yang akan Anda lakukan pada 'Kelola tampilan', seperti menerapkan gaya gambar, atau pengaturan format tanggal, ... dapat Anda lakukan langsung di ranting.

Bagi saya ini adalah keuntungan karena saya tahu bahwa semua yang saya lihat berasal dari file ranting, dan saya tidak perlu mencari beberapa pengaturan bidang yang tidak jelas yang dapat menambah kelas di suatu tempat. Jadi semua yang saya lihat berasal dari hanya satu tempat (file ranting node) dan bukan kombinasi dari file ranting dan layar tampilan kelola.

Bagaimanapun, dengan menggunakan modul Twig Tweak yang mengagumkan, berikut adalah cara mencetak bidang paragraf multi nilai dalam file ranting simpul tanpa harus menggunakan variabel konten:

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

1

Saya telah menemukan #itemsproperti itu berguna ketika membangun loop dengan panjang yang tidak diketahui di 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

Jika Anda ingin menempatkan pembungkus tambahan di sekitar bidang di dalam bidang paragraf atau karena alasan tertentu nilai bidang referensi paragraf tertentu, Anda dapat melakukan hal berikut:

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

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

{% endfor %}

Dengan melakukan {{kint(content.paragraph_field_name[key])}}, Anda akan melihat bahwa bidang dapat diakses di dalam bagian ['#paragraph'] dari array.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.