Twig şablonundaki birden çok değer içerik alanını yineleyin


23

Şablondaki bir field_admin_tagsalanın oluşturulması üzerinde kontrol sahibi olmam gerekiyor node.html.twig.

Bu çalışıyor:

  • {{ content.field_admin_tags }} - Her şeyi verir (etiket + tüm alan değerleri)
  • {{ content.field_admin_tags.0 }} - Alandaki sadece ilk değeri verir, etiket içermez

SORUN: Etiketleri çevreleyen işaretleme üzerinde hiçbir kontrolüm yok, örneğin <ul><li>...</li></ul>.

Bu yüzden benim fikrim, render dizisini yinelemekti .

Ancak bu işe yaramaz:

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

Ben olsun: Exception: Object of type Drupal\node\Entity\Node cannot be printed.

Sanırım render dizisinin tuşlarının / değerlerinin alanın içindeki öğelere karşı değerlerini değiştirdiğimi düşünüyorum (her döngüde bir "X" basarsam, bu alanda sadece iki veya üç değerim varken 20 X alırım) .

Ben üzerinde yineleme istiyorum content.field_admin_tags.0, content.field_admin_tags.1vb

Bunun nasıl düzeltileceği hakkında bir fikrin var mı? Teşekkürler.


1
Do üzerine konu drupal.org/node/2776307
gagarine

Yanıtlar:


15

Bunu bir alan dalında düzeltebilirsiniz. Orada alan döngüsünü yinelemek için mevcut döngüyü kullanabilirsiniz:

node.html.twig

{{ content.field_admin_tags }}

Alan - Alan-admin-tags.html.twig

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

Bu örnek, yerine geçer <div>ile <ul>. {{ attributes }}Alan şablonunu kaldırmayın veya atlamayın, bkz. Quickedit'i ne kırabilir ve nasıl düzeltebilirim?


Buna ana şablondan çağrılır{{ content.field_admin_tags }}
aydow 12:18

23

4k4 ile anlaşın, alan şablonu en iyi yerdir, eğer varlık şablonunda (örn. Düğüm) gerçekten isterseniz, şöyle bir şey yapabilirsiniz:

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

Ama dürüst olmak gerekirse, biraz çirkin olduğunu düşünüyorum, alan şablonu doğru yer.


1
Kabul, biraz çirkin. ;) Yine de kod pasajı için teşekkürler.
AngularChef

Farklı türlerdeki kişilerle mükemmel çalışır
Christophe CARON

11

Benim gibi, bir düğümün dal şablonundaki paragraflarda yineleme yapmanın bir yolunu arıyorsanız, işte bunun nasıl yapılacağı:

Çok değerli bir paragraf alanı olan bir düğüme sahip olduğunuzu varsayalım, böylece bir içerik düzenleyicisi birden çok paragraf oluşturabilir ve düğümler dal şablonundaki her bir paragrafta yineleme yapmak istersiniz (örneğin, her paragrafın etrafına bir sarmalayıcı eklemek için):

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

GÜNCELLEME: Tüm paragrafları içerik kullanmadan yazdırmanın başka bir yolunu bulmam gerekiyordu. İçerik değişkeni, düğümün "Ekranı yönet" bölümünde ayarladığınız her şeyi içerir, ancak şu anki çalışma yöntemim, düğüm dal dosyasındaki tüm verilere ve neredeyse hepsine erişebildiğiniz için asla "Ekranı yönet" i veya düzenleri kullanmamaktır. Bir görüntü stili uygulamak veya bir tarih formatı ayarlamak gibi 'ekranı yönet' seçeneğinde yapacağınız ayarlar, doğrudan dalda yapabilirsiniz.

Benim için bu bir avantaj, çünkü gördüğüm her şeyin dal dosyasından geldiğini biliyorum ve herhangi bir yere sınıf ekleyebilecek belirsiz alan ayarlarına bakmam gerekmiyor. Gördüğüm her şey tek bir yerden (düğümler dal dosyası) geliyor ve dal dosyası ile yönetim ekranının bir birleşimi değil.

Her neyse, harika Twig Tweak modülünü kullanarak, içerik değişkenini kullanmak zorunda kalmadan bir düğümün dal dosyasında çok değerli bir paragraf alanını nasıl yazdıracağınız:

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

1

#itemsTwig'de bilinmeyen uzunlukta döngüler oluştururken yararlı olacağını özelliği buldum :

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

Paragraf alanı içindeki alanların etrafına ek sarmalayıcılar yerleştirmek veya belirli bir nedenle belirli bir paragraf referans alanı değerine ihtiyaç duymak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

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

{% endfor %}

Böylece {{kint(content.paragraph_field_name[key])}}, alanların dizinin ['#paragraph'] bölümünde erişilebilir olduğunu göreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.