Mostrar entradas relacionadas en una página de categoría filtradas por otro campo de categoría
Tengo una Estructura llamada "Estufas". Cada entrada tiene dos campos de categoría 'fuelType' y 'output'.
- Categorías de tipo de combustible = '' Leña ',' Combustible múltiple ',' Gas 'y' Eléctrico '.
- Categorías de salida = '4kW', '6kW', '8kW', '10kW',
En la plantilla de página de categoría, el siguiente código simple me da las entradas correctas basadas en el campo 'fuelType' ... por ejemplo, cuando veo la página 'Quema de leña', me muestra estufas de leña.
{% set entries = craft.entries.relatedTo(category).all() %}
{% for entry in entries %}
<a href="{{ entry.url }}">{{ entry.title }}</a><br>
{% endfor %}
Pero ahora también necesito recorrer el grupo de categorías de 'salida' para obtener algo como lo siguiente:
TODAS las estufas de leña
Texto de introducción
iniciar bucle
Estufas 4kW
Stove_4kW_No.1
Stove_4kW_No.2
Stove_4kW_No.3
Estufas 6kW
Estufa_6kW_No.1
Estufa_6kW_No.2
Estufas de 8kW
Estufa_8kW_No.1
Estufa_8kW_No.2
Estufa_8kW_No.3
Estufa_8kW_No.4
...y así....
bucle final
¿Es esto siquiera posible? Alternativamente, ¿podría tirar con consultas de entrada individuales utilizando las babosas de categoría de 'salida' individuales?
Muchas gracias
Respuestas
Por lo general, usaría el filtro de grupo para esto. Dependiendo de lo que necesite generar, asegúrese de utilizar también la carga ansiosa para mejorar el rendimiento.
{% 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 %}
EDITAR: respuesta alternativa a continuación para permitir el uso del orden de categoría correcto según el orden de estructura del panel de control.
Nota: este enfoque requiere el complemento 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 %}