Medya görüntülerini ürün koleksiyonuna yerleştirmenin daha hızlı yolu


23

TL; DR : Ürün resimlerini / galerisini tüm ürünü yüklemeden nasıl yüklerim?

Görüntüleri bir ürüne yüklemek istiyorum. .Phtml'de ne yapıyorum?

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

Block sınıfında ne yapıyorum:

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

Bu işe yarıyor Ama ben her şeyi yüklüyorum: $_popularCollection->addAttributeToSelect(*);

Denedim $_popularCollection->addAttributeToSelect('media_gallery'); Ama işe yaramadı.

Yanıtlar:


22

addAttributeToSelect('media_gallery') media_gallery karmaşık bir mantıktan gelecek gibi çalışmıyor.

Tam ürün modelini yükleyerek döngü içinde kolayca media_galleryveri alabilirsiniz Ancak bu durumda çok fazla bellek harcar.

media_galleryÖzniteliğin ve afterloadürün modelinin Backend modelini kullanın

Tam ürün yükü olmadanmedia_gallery özellik değeri elde etmek için (Mage :: getModel ('catalog / product') -> load ($ ProductID)) .

Sen kullanabilirsiniz afterLoad()Bu işlev çağrısı kullanarak, backend modelbir media_gallery eav attributeyük medya görüntüsü. Bu tam modelden çok daha hızlı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
Evet işe yaradı
janw

Güzel! işe yaradı
Jitendra Mandloi

15

Kabul edilen cevap işe yarar, ancak gerekli olmadıklarında tüm ürün niteliklerini belleğe yüklemeyi içerir.

Biraz daha cerrahi bir yaklaşım için (1.9.2.2 CE'de test edilmiştir)

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

Bu şekilde yalnızca media_gallery özniteliğini yüklersiniz.


Kabul edilen cevaplardan çok daha iyi bir çözüm
SeStro

5

Sorunun eski olduğunu ve zaten doğru bir cevabı olduğunu biliyorum, ancak topluma yararlı olabilecek başka bir yöntem önermek kötü değil: Önce $_product->getMediaGalleryImages()

Deneyebilirsin:

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

Alınan: /programming/7890616/get-product-media-gallery-images-f----product-collection-in-magento#23804663


1
Güzel bul! Bununla birlikte, yukarıda + amit-bera tarafından açıklanan çözümün önemli ölçüde daha hızlı ve daha az hafıza ve veritabanı yoğun olduğunu belirtmeliyim. [Düzenleme: + aaron-bonner yaklaşımı aslında daha da hızlı.]
Tyler V.

Hayır. Bu kötü bir cevap. Bir ürüne belirli verileri bu şekilde yükleyemezsiniz, yalnızca üründen önceLoad () ve afterLoad () öğesini çağırır ve model üzerinde zaten var olan verileri değiştirmez, çünkü veritabanı çağrısı bu işlevden hiçbir şey döndürmez . Mage_Core_Model_Abstract ve Mage_Core_Model_Resource_Db_Abstract üzerindeki load () işlev tanımına bakın. Burada yaptığınız şey neredeyse ürünün tam bir yükü.
OddBrew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.