Cara lebih cepat untuk memuat gambar media dalam koleksi produk

23

TL; DR : Bagaimana cara memuat gambar / galeri produk tanpa memuat seluruh produk?

Saya ingin memuat gambar pada suatu produk. Apa yang saya lakukan di .phtml

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

Apa yang saya lakukan di kelas Blok:

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;
}

Ini berfungsi Tapi saya memuat semuanya: $_popularCollection->addAttributeToSelect(*);

Saya sudah mencoba $_popularCollection->addAttributeToSelect('media_gallery'); tetapi sepertinya tidak berhasil.

janw
sumber

Jawaban:

22

addAttributeToSelect('media_gallery') tidak berfungsi karena media_gallery akan berasal dari logika yang rumit.

Anda bisa mendapatkan media_gallerydata yang mudah di dalam di loop dengan memuat model produk lengkap Tetapi akan membutuhkan banyak memori dalam kasus ini.

Gunakan model Backend dari media_galleryatribut & afterloadModel produk

Untuk mendapatkan media_gallerynilai atribut tanpa memuat produk lengkap (Mage :: getModel ('katalog / produk') -> memuat ($ ProductID)) .

Anda dapat menggunakan afterLoad(), menggunakan panggilan fungsi ini backend modeluntuk media_gallery eav attributememuat gambar media. Ini jauh lebih cepat daripada model penuhload(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/>";


}
Amit Bera
sumber
1
Ya yang bekerja
janw
bagus! itu berhasil
Jitendra Mandloi
15

Jawaban yang diterima berfungsi, tetapi melibatkan memuat semua atribut produk ke dalam memori padahal mungkin tidak diperlukan.

Untuk mengambil pendekatan yang sedikit lebih bedah (diuji pada 1.9.2.2 M) lakukan

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

Dengan cara ini Anda hanya memuat atribut media_gallery itu sendiri.

Aaron Bonner
sumber
Ini solusi yang jauh lebih baik daripada jawaban yang diterima
SeStro
5

Saya tahu pertanyaannya sudah lama dan sudah memiliki jawaban yang benar, tetapi tidak buruk untuk merekomendasikan metode lain yang dapat berguna bagi masyarakat: Sebelumnya $_product->getMediaGalleryImages()

Anda dapat mencoba:

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

Diambil dari: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663

Andres Rojas Orozco
sumber
1
Temuan yang bagus! Namun, saya harus menunjukkan bahwa solusi yang dijelaskan oleh + amit-bera di atas secara signifikan lebih cepat dan lebih sedikit memori dan database intensif. [Sunting: Pendekatan oleh + aaron-bonner sebenarnya lebih cepat.]
Tyler V.
Tidak, ini jawaban yang buruk. Anda tidak dapat memuat data tertentu pada suatu produk dengan cara ini, ia hanya memanggil beforeLoad () dan afterLoad () pada produk, dan tidak mengubah data yang sudah ada pada model karena panggilan basis data tidak akan mengembalikan apa pun dari fungsi ini . Lihatlah definisi fungsi load () pada Mage_Core_Model_Abstract dan Mage_Core_Model_Resource_Db_Abstract. Apa yang Anda lakukan di sini hanyalah muatan penuh produk.
OddBrew