Agrupando resultados de Super Table por meio de Twig Multidimensional Array

Sep 18 2020

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

1 JamesSmith Sep 18 2020 at 15:30

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>