製品コレクションにメディア画像をロードするより高速な方法


23

TL; DR:製品全体をロードせずに製品画像/ギャラリーをロードするにはどうすればよいですか?

製品に画像をロードしたい。.phtmlで行うこと

$_popularCollection = $this->getPopularCollection();
foreach ($_popularCollection as $_product):
    // the rest
    $mediaGallery = $_product->getMediaGalleryImages();
endforeach;
//the rest

Blockクラスで行うこと:

public function getPopularCollection() {
    // http://magento.stackexchange.com/q/5838/3089

    // no category
    if ( is_null( $this->getCategoryId() ) )
        return false;

    /** @var Mage_Catalog_Model_Category $category */
    $category = Mage::getModel('catalog/category')->load( (int)$this->getCategoryId() );

    /** @var Mage_Catalog_Model_Resource_Product_Collection $_popularCollection */
    $_popularCollection = Mage::getModel('catalog/product')->getResourceCollection();
    $_popularCollection->addAttributeToSelect('*');
    $_popularCollection->setStoreId(Mage::app()->getStore()->getId());
    $_popularCollection->addCategoryFilter($category);

    return $_popularCollection;
}

これは動作しますが、すべてをロードします: $_popularCollection->addAttributeToSelect(*);

試しました$_popularCollection->addAttributeToSelect('media_gallery'); が、うまくいかないようです。

回答:


22

addAttributeToSelect('media_gallery') media_galleryは複雑なロジックに由来するため、機能していません。

完全な製品モデルをロードすることで、ループ内で簡単なmedia_galleryデータを取得できますが、この場合、大量のメモリが必要になります。

media_gallery属性およびafterload製品モデルのバックエンドモデルを使用する

取得するためのmedia_gallery属性値を完全な製品のロードなし ( - >負荷($のProductID)メイジ:: getModel( 'カタログ/製品'))

メディアイメージを読み込むafterLoad()この関数呼び出しbackend modelを 使用して、を使用できます media_gallery eav attribute。これはフルモデルよりもはるかに高速ですload(Mage::getModel('ctalog/product')->load($ProductID))

foreach($his->getPopularCollection() as $product){
    $attributes = $product->getTypeInstance(true)->getSetAttributes($product);
    $media_gallery = $attributes['media_gallery'];
    $backend = $media_gallery->getBackend();
    $backend->afterLoad($product); 
    $mediaGallery = $product->getMediaGalleryImages();
        /* get Image one by  using loop*/
        foreach ($product->getMediaGalleryImages() as $image) {
        echo ($image->getUrl());
        }     

echo "<br/>..........................................<br/>";


}

1
はい、うまく
いきました-Janw

いいね!それが働いた
Jitendra Mandloi

15

受け入れられた答えは機能しますが、おそらく不要な製品属性をすべてメモリにロードする必要があります。

(1.9.2.2 CEでテスト済み)少しだけ外科的なアプローチを取るには

$attributeCode = 'media_gallery';
$attribute = $product->getResource()->getAttribute($attributeCode);
$backend = $attribute->getBackend();
$backend->afterLoad($product);

この方法では、media_gallery属性自体のみをロードします。


それは受け入れられた答えよりもはるかに優れたソリューションです
-SeStro

5

私は質問が古く、すでに正しい答えを持っていることを知っていますが、コミュニティに役立つ別の方法を推奨することは悪くありません。 $_product->getMediaGalleryImages()

あなたが試すことができます:

$_product->load('media_gallery');//load media gallery attributes
$mediaGallery = $_product->getMediaGalleryImages();

から取得:https : //stackoverflow.com/questions/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
素敵な発見!ただし、上記の+ amit-beraで説明したソリューションは非常に高速であり、メモリとデータベースの使用量が少ないことを指摘する必要があります。[編集:+ aaron-bonnerによるアプローチは実際にはさらに高速です。]
タイラーV.

いいえ、これは悪い答えです。この方法で特定のデータを製品にロードすることはできません。製品でbeforeLoad()およびafterLoad()を呼び出すだけで、データベース呼び出しはこの関数から何も返さないため、モデル上の既存のデータは変更しません。 。Mage_Core_Model_AbstractおよびMage_Core_Model_Resource_Db_Abstractのload()関数の定義を見てください。ここで行っていることは、製品のほぼ全負荷です。
OddBrew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.