Mengelompokkan Hasil Tabel Super melalui Array Multidimensi Ranting
Saya mencoba untuk mengulang melalui array Tabel Super dan hasil kelompok berdasarkan kategori ('kontribusi'). Saya sudah cukup jauh tetapi saya kesulitan membuat array di Twig yang memberi saya apa yang saya butuhkan (saya menemukan array asosiatif sangat rumit di Twig setelah menggunakan PHP begitu lama ...).
Mengatur kontribusi bekerja. Sepertinya saya tidak bisa menulis aturan penggabungan dengan benar sehingga setiap kontributor bergabung ke dalam perannya masing-masing. Langkah selanjutnya adalah menggabungkan daftar nama untuk keluaran selanjutnya ...
Di sinilah saya saat ini terjebak:
{% 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 %}
Larik yang dihasilkan akan terlihat seperti (dengan setiap larik digabungkan sebagai daftar yang dipisahkan koma):
{% set featuredContributors = {
Editor: 'Person One, Person Two',
Writer: 'Person Three, Person Four',
Other Role: 'Person Five',
} %}
Adakah cara yang lebih mudah untuk melakukan ini? PHP melalui Ekstensi Ranting? : D
Jawaban
Untuk mengelompokkan array, gunakan filter grup atau filter indeks Craft , lalu untuk menggabungkan item array dengan koma gunakan filter join Twig .
Sesuatu seperti ini mungkin yang Anda cari (saya juga telah menambahkan eager loading untuk meningkatkan kinerja, dan saya menggunakan filter peta sebagai cara yang lebih bersih untuk mengatur array, meskipun Anda dapat menggunakan loop bersarang jika Anda merasa lebih mudah untuk membaca):
{% 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>