Matrixフィールドを含むエントリからすべてのイメージを取得する方法

私は、すべてのエントリーを引っ張って、その中のイメージを見つけて、そのイメージを使ったエントリーへのリンクと共にそれらを表示するフォトギャラリーを持っています。
それ以外は、ブロックタイプのinsertedImageとimageという名前のアセットフィールドを持つextendedContentという名前のマトリックスフィールドにあるものを引き出しません。
私が使用しているコードの簡略化されたバージョンは次のとおりです。

{% set content = craft.entries({
    section: 'news,information,events',
    with: ['imageGallery','extendedContent.insertedImage:image']
}) %}

{% paginate craft.assets.relatedTo(content).order('elements.dateCreated desc').kind('image').limit(25) as pageInfo, usedPhotos %}

{# Loop through the array of assets #}
{% for imageGallery in usedPhotos %}  
    

    {# find all entries related to this asset #}
    {% set entry = craft.entries.relatedTo(imageGallery).order('title') %}
        {% for entry in entry %}
            {{ entry.title }}
        {% endfor %}  

{% endfor %}

追加:私は問題を推測しているのは、マトリックスフィールドの画像の関係がエントリではなく、それが入っているブロックであるということです。
それは私が欲しいものをすることができないということですか?

ベストアンサー

私は小枝に良い解決策があるとは思わないが、あなたはPHPでエントリを取得することができます。

まず、すべての使用済み資産IDを取得する必要があります。したがって、 relations
テーブルで、2つのフィールドとセクションIDを持つエントリのすべての使用済みアセットをチェックインします

public function getAllAssetsRelatedToEntries(){
   //list the ids of the sections, so you need the id of news, information and events
    $sectionIds = [2, 7];
   //id of your insertedImage field
    $fieldIdMatrixContent = 6;
   //id of your imageGallery field
    $fieldIdImageGallery = 7;

   //fetches all assets that have a relation in the matrix field
    $imagesFromMatrixContent =  craft()->db->createCommand()
        ->select('craft_relations.targetId')
        ->from('relations')
        ->join('matrixblocks', 'craft_matrixblocks.id = craft_relations.sourceId')
        ->join('entries', 'craft_entries.id = craft_matrixblocks.ownerId')
        ->where('craft_relations.fieldId = :fieldId', ['fieldId' => $fieldIdMatrixContent])
        ->andWhere(['in', 'craft_entries.sectionId', $sectionIds])
        ->queryColumn();

   //fetches all assets that are related with the ImageGallery Field
    $imagesFromNormalField = craft()->db->createCommand()
        ->select('craft_relations.targetId')
        ->from('relations')
        ->where('craft_relations.fieldId = :fieldId', ['fieldId' => $fieldIdImageGallery])
        ->join('entries', 'craft_entries.id = craft_relations.sourceId')
        ->andWhere(['in', 'craft_entries.sectionId', $sectionIds])
        ->queryColumn();

    return array_unique(array_merge($imagesFromMatrixContent,$imagesFromNormalField));
}

これにより、すべてのIDの配列が返されます。したがって、必要に応じて改ページやその他のクエリを作成したり、並べ替え順序を変更したり、その他の条件を含めることができます

{% set allAssetIds = craft.pFplugin.getAllAssetsRelatedToEntries() %}
{% paginate craft.assets.id(allAssetIds).kind('image').limit('30') as pageInfo, usedPhotos %}

次のステップは、各資産のエントリを検索することです

public function getAllEntriesForAsset($assetId)
{
   //list the ids of the sections, so you need the id of news, information and events
    $sectionIds = [2, 7];
   //id of your insertedImage field
    $fieldIdMatrixContent = 6;
   //id of your imageGallery field
    $fieldIdImageGallery = 7;

    $entryIdsFromMatrix = craft()->db->createCommand()
        ->select('craft_matrixblocks.ownerId')
        ->from('relations')
        ->join('matrixblocks', 'craft_matrixblocks.id = craft_relations.sourceId')
        ->where('craft_relations.targetId = :assetId', ['assetId' => $assetId])
        ->join('entries', 'craft_entries.id = craft_matrixblocks.ownerId')
        ->andWhere('craft_relations.fieldId = :fieldId', ['fieldId' => $fieldIdMatrixContent])
        ->andWhere(['in', 'craft_entries.sectionId', $sectionIds])
        ->queryColumn();

    $entryIdsImageGallery = craft()->db->createCommand()
        ->select('craft_relations.sourceId')
        ->from('relations')
        ->where('craft_relations.targetId = :assetId', ['assetId' => $assetId])
        ->join('entries', 'craft_entries.id = craft_relations.sourceId')
        ->andWhere(['in', 'craft_entries.sectionId', $sectionIds])
        ->andWhere('craft_relations.fieldId = :fieldId', ['fieldId' => $fieldIdImageGallery])
        ->queryColumn();

    return array_unique(array_merge($entryIdsFromMatrix,$entryIdsImageGallery));
}

あなたのテンプレート

{% set entriesForAsset = craft.pFplugin.getAllEntriesForAsset(asset.id) %}
{% for entry in craft.entries().id(entriesForAsset).order('title') %}
    {{ entry.id }} {{ entry.title }}
{% endfor %}

全体としては、このように見えるかもしれません。私はちょうどページネーションを使用しませんでした

{% set allAssetIds = craft.pFplugin.getAllAssetsRelatedToEntries() %}
{% for asset in craft.entries.id(allAssetIds).find() %}
    {{ asset.id }} {{ asset.title }}
    Entries for Image
{% set entriesForAsset = craft.pFplugin.getAllEntriesForAsset(asset.id) %} {% for entry in craft.entries().id(entriesForAsset).order('title') %} {{ entry.id }} {{ entry.title }} {% endfor %} {% endfor %}

返信を残す

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