より多くのイメージを行列ブロックにロードする

私はチームと呼ばれる行列ブロックを持っています。チームブロックには、すべての企業のヘッドショットを持つ資産フィールドがあります。しかし、30枚以上の画像がありますが、デザインには6枚の画像が表示され、次に6枚の画像が表示されます。

しかし、私はマトリックスブロック内でこれをどうやって実現するのかよく分かりません。他の場所で見た例はすべてページとセクションです。しかし、私はちょうど行列ブロック内から画像をロードする必要があります。

以下は画像のための私のコードです。助けてもらえますか?

{% for headshot in block.headshots %}
{% if headshot | length %} {%
set transformedImages = craft.imager.transformImage(headshot, [ {
width: 180, ratio: 4/5 }, ], { format: 'jpg', allowUpscale: false,
mode: 'crop', jpegQuality: 80, position: headshot.focalPoint,
interlace: true } ) %} {% set tabletl =
craft.imager.transformImage(headshot, [ { width: 142, ratio: 4/5 },
], { format: 'jpg', allowUpscale: false, mode: 'crop', jpegQuality:
80, position: headshot.focalPoint, interlace: true } ) %} {% set
tabletp = craft.imager.transformImage(headshot, [ { width: 230,
ratio: 4/5 }, ], { format: 'jpg', allowUpscale: false, mode:
'crop', jpegQuality: 80, position: headshot.focalPoint, interlace:
true } ) %} {% set mobile = craft.imager.transformImage(headshot, [
{ width: 360, ratio: 4/5, jpegQuality: 65 }, ], { format: 'jpg',
allowUpscale: false, mode: 'crop', position: headshot.focalPoint,
interlace: true } ) %} {% if headshot.altTag|length %}{{ headshot.altTag }}{% else %}{{ headshot.title }}{% endif %} {% endif %} <div
class="team__headshots-overlay"> <div
class="team__headshots-captions">

{{ headshot.title }}

{{ headshot.jobTitle }}

</div> </div>

 
{% endfor %}
ベストアンサー

あなたの block.headshots
はすべての画像の配列ではないので、あなたがそれを使って正しく動作するためには何をしているのかを理解する必要があります。

block.headshots and all other relations (Matrix
elements, images, category links…) are all
elementCriteriaModels so instead of having an array of
objects – your block.headshots is just a single object
that has an iterator interface.

だから、 {%}をヘッドフォンでblock.headshots%}で実行すると、
.find()関数が実行され、配列が返されます。
残念ながら私は現在自分のコンピュータにはないので、正確なコードを提供できないので、次のような構文が間違っているかもしれませんが、
craft.entries.find()でエントリを検索する方法を知っていれば、 ここをクリックして修正することができます。 a href =
“https://craftcms.com/docs/templating/elementcriteriamodel” rel =
“nofollow noreferrer”> elementCriteriaModel 。コードは次のようになります

{block.headshots.find({limit:10})のヘッドショット%%}

ページ(エントリ)、アセット、マトリックスブロック、セクション、カテゴリなどを検索している場合は問題ありません。Craftは常に同じで、ループするとすぐに実行されるelementCriteriaModelを構築します。

編集:あなたのコントローラは、このように見える資産を読み込む

public function actionLoadAssets(){
    $this->requireAjaxRequest();
    $response = array(
        'success'   => false,
        'message'   => ''
    );

   //config how many entries should be loaded
    $config = craft()->globals->getSetByHandle('config');
    $limit = $config['countReloadImages'];
   //offset.. how many did we load already
    $offset = craft()->request->getPost('offset');
   //which block is it
    $matrixIndex = craft()->request->getPost('matrixIndex');
   //entryId
    $entryId = craft()->request->getPost('entryId');

    if($entry = craft()->elements->getElementById($entryId)){
       //search for the correct field -> we just insert an offset
       //this is untested, maybe you have to play around with the correct number
       //I'm not sure if you can just send the id of the matrixfield and use 'id' => $matrixIndex
       //you could to try it out...
        $matrix = $entry->team->find([
            'offset'    => $matrixIndex
        ]);
        $html = '';
        if($matrix && ($assets = $matrix->headshot->find(['offset' => $offset, 'limit' => $limit]))){
           //build a template to render the images, you'll return the html
            $html = $this->renderTemplate('some tempalte here', array(
                'asset' => $assets
            ));
        }
       //you could include your logic if you found less entries than configured ($limit) and return a "hide reload button"
        $response['html'] = $html;
        $response['success'] = true;
    }else{
        $response['message'] = Craft::t('could not find entry with Id ' . $entryId);
    }

    return $response;
}

Edit2:私はより良い解決策を見つけました:

public function actionLoadMore(){
    $criteria = craft()->elements->getCriteria(ElementType::Asset);
   //id of your field headtshot
    $field = craft()->fields->getFieldById(5);

    $criteria->relatedTo = array(
        'sourceElement' => //your matrix ID,
        'field'         => $field->id
    );
    $criteria->offset = //your offset;
    $criteria->limit = //your limit;
    $assets = $criteria->find();

   //render template -> return html look at the first example
}

返信を残す

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