Agrupando resultados de Super Table por meio de Twig Multidimensional Array
Estou tentando percorrer uma matriz Super Table e agrupar resultados com base em uma categoria ('contribuição'). Eu fui muito longe, mas estou lutando para criar um array no Twig que me dê o que eu preciso (eu acho arrays associativos muito complicados no Twig depois de usar PHP por tanto tempo ...).
Definir a contribuição funciona. Eu simplesmente não consigo escrever a regra de mesclagem corretamente, então cada colaborador se mescla em suas respectivas funções. A próxima etapa seria juntar a lista de nomes para saída posterior ...
Aqui é onde estou atualmente preso:
{% 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 %}
A matriz resultante deve ser semelhante (com cada matriz unida como uma lista separada por vírgulas):
{% set featuredContributors = {
Editor: 'Person One, Person Two',
Writer: 'Person Three, Person Four',
Other Role: 'Person Five',
} %}
Há alguma maneira mais fácil de fazer isso? PHP por meio de uma extensão Twig? : D
Respostas
Para agrupar arrays, use o filtro de grupo ou filtro de índice de Craft e , para juntar os itens de array com vírgulas, use o filtro de junção do Twig .
Algo como isso pode ser o que você está procurando (também adicionei o carregamento ansioso para melhorar o desempenho e usei o filtro de mapa como uma maneira mais limpa de organizar o array, embora você possa usar um loop aninhado se achar mais fácil ler):
{% 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>