別のカテゴリフィールドでフィルタリングされたカテゴリページに関連エントリを表示する

Aug 20 2020

「ストーブ」という構造があります。各エントリには、2つのカテゴリフィールド「fuelType」と「output」があります。

  • 燃料タイプのカテゴリ= ''薪の燃焼 '、'マルチ燃料 '、'ガス 'および'電気 '。
  • 出力カテゴリ=「4kW」、「6kW」、「8kW」、「10kW」、

カテゴリページテンプレートでは、次の簡単なコードで「fuelType」フィールドに基づいて正しいエントリが表示されます。たとえば、「薪ストーブ」ページを表示すると、薪ストーブが表示されます。

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

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

しかし、次のようなものが得られるように、「output」カテゴリグループループする必要があります。

すべての薪ストーブ

イントロテキスト

ループを開始

  • 4kWストーブ

  • ストーブ_4kW_No.1

  • ストーブ_4kW_No.2

  • ストーブ_4kW_No.3

  • 6kWストーブ

  • ストーブ_6kW_No.1

  • ストーブ_6kW_No.2

  • 8kWストーブ

  • ストーブ_8kW_No.1

  • ストーブ_8kW_No.2

  • ストーブ_8kW_No.3

  • ストーブ_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 %}

編集:コントロールパネルの構造の順序に従って正しいカテゴリの順序を使用できるようにするための以下の代替回答。

注:このアプローチには、スーパーソートプラグインが必要です。

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