多数のエントリをグループ化する

私は18000以上のエントリを持つデータをインポートしました。各ブランドに関連付けられた製品モデルのリストです。製品モデルはタイトルとして使用されており、ブランドフィールドはプレーンテキストです。

私はドロップダウンとして出力する必要がある約140のブランドがあります。

私はこの多くのエントリを出力することはできませんし、テンプレートをグループ化(および順序付け)しようとすると、ページがクラッシュします。

これは、ページをクラッシュさせなかった場合に動作するコードです(ページが読み込まれなくてもページをロードするのに数分かかるでしょう)。

{% set allEntries = craft.entries.section('solarWaterHeaterModels').order('brand asc').limit(null).find() %}

{% set allEntriesByBrand = allEntries|group('brand') %}

{% for brand, entriesInBrand in allEntriesByBrand %}

    {% for entry in entriesInBrand %}
        {% if loop.index == 1 %}
            
        {% endif %}
    {% endfor %}

{% endfor %}

誰もこれに近づく方法に関するいくつかのガイダンスを提供できますか?

どうもありがとう

ベストアンサー

まず、あなたのサンプルコードに基づいて、私は実際にエントリをループする必要はないと思います –
それらをブランド名にグループ化し、グループ化された配列のキーをループします(キーはブランド名になります) :

{% set brands = allEntries|group('brand')|keys %}

{% for brand in brands %}
     
{% endfor %}

これはわずかな最適化ですが、〜140のブランド名を印刷するために〜18kのエントリを引き出していますが、上記のようにサーバーがクラッシュしないかどうかはわかりません。理想的には別の戦略を使用するのが理想的です。

ちょっとPHPを書くのに苦労している人は、カスタムプラグインを足場に乗せることをお勧めします。
変数コンポーネントが含まれており、
variables/YourPluginHandleVariable.php
クラスに以下のようなコードを追加します:

public function getBrands()
{
    $query = craft()->db->createCommand();
    $query->selectDistinct('field_brand');
    $query->from('content');
    return array_filter($query->queryColumn());
}

あなたのテンプレートでは、次のように使います:

{% set brands = craft.yourPluginHandle.getBrands() %}

{% for brand in brands %}
     
{% endfor %}

yourPluginHandle
YourPluginHandleVariable
は、プラグインの実際のハンドルに置き換えてください。

上記のw/as +
18k行を実際にはテストしていないので、個別のselectクエリでも十分なパフォーマンスが得られない可能性があります。もちろん、結果を常にキャッシュできます。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です