การจัดกลุ่มผลลัพธ์ Super Table ผ่าน Twig Multidimensional Array

Sep 18 2020

ฉันพยายามวนลูปอาร์เรย์ Super Table และผลลัพธ์กลุ่มตามหมวดหมู่ ('การมีส่วนร่วม') ฉันไปได้ไกล แต่ฉันกำลังดิ้นรนในการสร้างอาร์เรย์ใน Twig ที่ให้สิ่งที่ฉันต้องการ (ฉันพบว่าอาร์เรย์เชื่อมโยงยุ่งยากมากใน Twig หลังจากใช้ PHP มานาน ... )

การตั้งค่าการสนับสนุนทำงาน ดูเหมือนว่าฉันจะเขียนกฎการผสานไม่ถูกต้องดังนั้นผู้ร่วมให้ข้อมูลแต่ละคนจึงรวมเข้ากับบทบาทของตน ขั้นตอนต่อไปจากนั้นจะรวมรายชื่อเพื่อนำเสนอต่อไป ...

นี่คือที่ที่ฉันติดอยู่ในขณะนี้:

  {% set featuredContributors = [] %}

  {% for person in book.contributors.all() %}
    {% if person.featured == 1 %}
      {% set contribution = person.contribution.one().title %}
      {% set contributor = person.contributor.one().title %}
      {% set featuredContributors =
        featuredContributors |
          merge({
          (contribution): [contributor]
          })
      %}
    {% endif %}
  {% endfor %}

อาร์เรย์ผลลัพธ์ควรมีลักษณะดังนี้ (โดยแต่ละอาร์เรย์รวมเป็นรายการที่คั่นด้วยจุลภาค):

{% set featuredContributors = {
  Editor: 'Person One, Person Two',
  Writer: 'Person Three, Person Four',    
  Other Role: 'Person Five',    
} %}

มีวิธีที่ง่ายกว่านี้ไหม PHP ผ่าน Twig Extension? : ง

คำตอบ

1 JamesSmith Sep 18 2020 at 15:30

สำหรับการจัดกลุ่มอาร์เรย์ให้ใช้ตัวกรองกลุ่มของ Craft หรือตัวกรองดัชนีจากนั้นสำหรับการเข้าร่วมรายการอาร์เรย์ด้วยเครื่องหมายจุลภาคให้ใช้ตัวกรองการรวมของ Twig

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

{% set featuredPeopleGrouped = book.contributors
    .featured(1)
    .with(['contribution','contributor'])
    .all()|group('contribution[0]')
%}

<dl>
    {% for contributionType, rowData in featuredPeopleGrouped %}
        {% set contributors = rowData|map(row => row.contributor[0].title) %}
        <dt>{{ contributionType }}: </dt>
        <dd>{{ contributors|join(', ') }}</dd>
    {% endfor %}
</dl>