Afficher les entrées associées sur une page de catégorie filtrée par un autre champ de catégorie

Aug 20 2020

J'ai une structure appelée "poêles". Chaque entrée a deux champs de catégorie «fuelType» et «output».

  • Catégories de type de combustible = «bois», «multicombustible», «gaz» et «électrique».
  • Catégories de sortie = '4kW', '6kW', '8kW', '10kW',

Sur le modèle de page de catégorie, le code simple suivant me donne les entrées correctes basées sur le champ «fuelType» ... par exemple, lorsque vous consultez la page «Bois», il me montre les poêles à bois.

{% set entries = craft.entries.relatedTo(category).all() %}

{% for entry in entries %}
    <a href="{{ entry.url }}">{{ entry.title }}</a><br>
{% endfor %}

Mais je dois maintenant aussi parcourir le groupe de catégories `` sortie '' pour obtenir quelque chose comme ce qui suit:

TOUS les poêles à bois

Texte d'introduction

boucle de début

  • Poêles 4 kW

  • Stove_4kW_No.1

  • Stove_4kW_No.2

  • Stove_4kW_No.3

  • Poêles 6 kW

  • Stove_6kW_No.1

  • Poêle_6kW_No.2

  • Poêles 8 kW

  • Stove_8kW_No.1

  • Stove_8kW_No.2

  • Stove_8kW_No.3

  • Poêle_8kW_No.4

...etc....

boucle de fin

Est-ce seulement possible? Sinon, pourrais-je extraire des requêtes d'entrée individuelles en utilisant les slugs de catégorie de «sortie» individuels?

Merci beaucoup

Réponses

1 JamesSmith Aug 20 2020 at 02:20

Vous utiliseriez généralement le filtre de groupe pour cela. En fonction de ce que vous devez générer, veillez également à utiliser le chargement hâtif pour améliorer les performances.

{% set groupedEntries = craft.entries.with(['yourOutputCatFieldHandle']).relatedTo(category).all()|group('yourOutputCatFieldHandle[0].title') %}

{% for cat, entries in groupedEntries %}
    <h3>{{ cat }}</h3>
    <ul>
        {% for entry in entries %}
            <li><a href="{{ entry.url }}">{{ entry.title }}</a></li>
        {% endfor %}
    </ul>
{% endfor %}

EDIT: réponse alternative ci-dessous pour permettre d'utiliser le bon ordre des catégories selon l'ordre de la structure du panneau de contrôle.

Remarque: cette approche nécessite le plugin supersort .

{# ======================================
First, fetch entries related to this category,
then group the array by each category's
`lft` structure position, then sort the array
by those keys with supersort's ksort function
========================================= #}

{% set groupedEntries = craft.entries.with([
        'yourOutputCatFieldHandle'
    ])
    .relatedTo(category)
    .all()|group('yourOutputCatFieldHandle[0].lft')|supersort('ksort')
%}

{# ======================================
Next, create a hash map of those categories so we can
match up the `lft` left structure position
with the category's title later.
(google "Nested Sets" if you're really bored)
========================================= #}

{% if groupedEntries|length %}
    {% set catTitlesMap = craft.categories.group('yourOutputCatGROUPHandle').all()|group('lft') %}
{% endif %}

{# ======================================
Finally, loop through the grouped array,
matching up the accessory's `lft` position
with the hash map to get the right title...
========================================= #}

{% for cat, entries in groupedEntries %}
    <h3>{{ catTitlesMap[cat][0].title }}</h3>
    <ul>
        {% for entry in entries %}
            <li><a href="{{ entry.url }}">{{ entry.title }}</a></li>
        {% endfor %}
    </ul>
{% endfor %}