Afficher les entrées associées sur une page de catégorie filtrée par un autre champ de catégorie
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
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 %}