ทำซ้ำผ่านฟิลด์เนื้อหาค่าหลายค่าในเทมเพลต 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.

ฉันคิดว่าฉันวนซ้ำคีย์ / ค่าของเรนเดอร์เรนเดอร์ vs รายการที่อยู่ในสนาม (ถ้าฉันพิมพ์ "X" ในแต่ละลูปฉันจะได้ 20 X ในขณะที่ฉันมีค่าสองหรือสามค่าในฟิลด์นี้เท่านั้น) .

ผมอยากจะย้ำกว่าcontent.field_admin_tags.0, content.field_admin_tags.1ฯลฯ

ความคิดวิธีการแก้ไขปัญหานี้? ขอบคุณ


1
ปัญหาในการทำdrupal.org/node/2776307
กาการีน

คำตอบ:


15

คุณสามารถแก้ไขได้ในกิ่งก้านสาขา คุณสามารถใช้การวนซ้ำที่มีอยู่เพื่อวนซ้ำไอเท็มฟิลด์:

node.html.twig

{{ content.field_admin_tags }}

สนาม - สนามผู้ดูแลระบบ tags.html.twig

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

ตัวอย่างเช่นนี้แทนที่ด้วย<div> <ul>อย่าลบ{{ attributes }}หรือข้ามเทมเพลตฟิลด์ดู สิ่งที่สามารถหยุดด่วนได้และฉันจะแก้ไขได้อย่างไร


สิ่งนี้ถูกเรียกจากแม่แบบด้วย{{ content.field_admin_tags }}
aydow

23

เห็นด้วยกับ 4k4 เทมเพลตฟิลด์เป็นสถานที่ที่ดีที่สุดถ้าคุณต้องการเทมเพลตเอนทิตี้ (เช่นโหนด) คุณสามารถทำสิ่งนี้:

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

แต่โดยสุจริตฉันคิดว่ามันน่าเกลียดนิดหน่อยเทมเพลตฟิลด์เป็นสถานที่ที่เหมาะสม


1
ตกลงมันน่าเกลียดนิดหน่อย ;) ขอขอบคุณสำหรับข้อมูลโค้ด
AngularChef

ทำงานได้อย่างสมบูรณ์แบบกับการเข้าร่วมประเภทต่างๆ
Christophe CARON

11

หากคุณชอบฉันกำลังมองหาวิธีการย้ำผ่านย่อหน้าในแม่แบบกิ่งไม้ของโหนดนี่คือวิธีที่จะทำ:

สมมติว่าคุณมีโหนดที่มีฟิลด์ย่อหน้าหลายค่าดังนั้นตัวแก้ไขเนื้อหาสามารถสร้างหลายย่อหน้าและคุณต้องการวนซ้ำแต่ละย่อหน้าบนเทมเพลตกิ่งไม้โหนด (ตัวอย่างเช่นการเพิ่ม wrapper รอบแต่ละย่อหน้า):

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

UPDATE: ฉันต้องการค้นหาวิธีอื่นในการพิมพ์ย่อหน้าทั้งหมดโดยไม่ต้องใช้เนื้อหา ตัวแปรเนื้อหามีทุกสิ่งที่คุณตั้งค่าในส่วน 'จัดการจอแสดงผล' ของโหนด แต่วิธีการทำงานปัจจุบันของฉันคือไม่ใช้ 'จัดการจอแสดงผล' หรือรูปแบบเนื่องจากคุณสามารถเข้าถึงข้อมูลทั้งหมดในไฟล์กิ่งโหนดและเกือบทั้งหมด การตั้งค่าที่คุณจะทำใน 'จัดการการแสดงผล' เช่นการใช้รูปแบบภาพหรือการตั้งค่ารูปแบบวันที่ ... คุณสามารถทำโดยตรงในกิ่ง

สำหรับฉันนี่เป็นข้อได้เปรียบเพราะฉันรู้ว่าทุกสิ่งที่ฉันเห็นมาจากไฟล์กิ่งไม้และฉันไม่จำเป็นต้องมองหาการตั้งค่าเขตข้อมูลที่คลุมเครือซึ่งอาจเพิ่มคลาสได้ ทุกอย่างที่ฉันเห็นมาจากที่เดียว (ไฟล์ twig nodes) และไม่ใช่การรวมกันของไฟล์ twig และหน้าจอแสดงผลที่จัดการ

อย่างไรก็ตามโดยใช้โมดูล Twig Tweak ที่ยอดเยี่ยมนี่คือวิธีการพิมพ์ฟิลด์วรรคค่าหลายค่าในไฟล์ twig ของโหนดโดยไม่ต้องใช้ตัวแปรเนื้อหา:

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

1

ฉันพบว่า#itemsคุณสมบัตินี้มีประโยชน์เมื่อสร้างลูปที่มีความยาวไม่ทราบในทวิก:

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

ถ้าคุณต้องการวาง wrapper เพิ่มเติมรอบ ๆ ฟิลด์ภายในฟิลด์ย่อหน้าหรือต้องการค่าฟิลด์การอ้างอิงย่อหน้าเฉพาะด้วยเหตุผลบางอย่างคุณสามารถทำสิ่งต่อไปนี้:

{% 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'] เป็นส่วนหนึ่งของอาร์เรย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.