Raggruppamento dei risultati della Super Table tramite Twig Multidimensional Array
Sto cercando di scorrere un array di Super Table e raggruppare i risultati in base a una categoria ("contributo"). Sono andato abbastanza lontano, ma ho difficoltà a creare un array in Twig che mi dia ciò di cui ho bisogno (trovo gli array associativi molto ingombranti in Twig dopo aver usato PHP per così tanto tempo ...).
L'impostazione del contributo funziona. Non riesco a scrivere correttamente la regola di unione, quindi ogni collaboratore si fonde nel rispettivo ruolo. Il prossimo passo sarebbe quindi unire l'elenco dei nomi per un ulteriore output ...
Qui è dove sono attualmente bloccato:
{% 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 %}
L'array risultante dovrebbe apparire come (con ogni array unito come un elenco separato da virgole):
{% set featuredContributors = {
Editor: 'Person One, Person Two',
Writer: 'Person Three, Person Four',
Other Role: 'Person Five',
} %}
C'è un modo più semplice per farlo? PHP tramite un'estensione Twig? : D
Risposte
Per raggruppare gli array, usa il filtro di gruppo o il filtro di indice di Craft , quindi per unire gli elementi dell'array con virgole usa il filtro di unione di Twig .
Qualcosa del genere potrebbe essere quello che stai cercando (ho anche aggiunto il caricamento desideroso per migliorare le prestazioni e ho usato il filtro della mappa come un modo più pulito per organizzare l'array, anche se potresti usare un ciclo nidificato se lo trovi più facile leggere):
{% 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>