Отображение связанных записей на странице категории, отфильтрованной по другому полю категории

Aug 20 2020

У меня есть конструкция под названием «Печи». Каждая запись имеет два поля категории «fuelType» и «output».

  • Категории видов топлива = «Дровяное», «Многотопливное», «Газовое» и «Электрическое».
  • Категории мощности = «4кВт», «6кВт», «8кВт», «10кВт»,

В шаблоне страницы категории следующий простой код дает мне правильные записи на основе поля «fuelType» ... например, при просмотре страницы «Дровяные печи» он показывает мне дровяные печи.

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

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

Но теперь мне нужно также петли через «выход» группы категорий так что я получаю что - то вроде следующего:

ВСЕ дровяные печи

Вступительный текст

начало цикла

  • Печи 4кВт

  • Плита_4кВт_но.1

  • Плита_4кВт_но.2

  • Плита_4кВт №3

  • Печи 6кВт

  • Плита_6кВт_No.1

  • Плита_6кВт_No.2

  • Печи 8кВт

  • Плита_8кВт_No.1

  • Плита_8кВт_No.2

  • Плита_8кВт №3

  • Stove_8kW_No.4

...и так далее....

конец цикла

Это вообще возможно? В качестве альтернативы, могу ли я использовать отдельные входные запросы, используя отдельные ярлыки категории «выход»?

Большое спасибо

Ответы

1 JamesSmith Aug 20 2020 at 02:20

Обычно для этого используется групповой фильтр. В зависимости от того, что вам нужно вывести, не забудьте также использовать активную загрузку для повышения производительности.

{% 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 %}

РЕДАКТИРОВАТЬ: альтернативный ответ ниже, позволяющий использовать правильный порядок категорий в соответствии с порядком структуры панели управления.

Примечание: для этого подхода требуется плагин 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 %}