Szybszy sposób ładowania obrazów multimedialnych do kolekcji produktów

23

TL; DR : Jak załadować zdjęcia / galerię produktu bez ładowania całego produktu?

Chcę załadować obrazy do produktu. Co robię w .phtml

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

Co robię w klasie 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;
}

To działa Ale ładuję wszystko: $_popularCollection->addAttributeToSelect(*);

Próbowałem $_popularCollection->addAttributeToSelect('media_gallery'); Ale to nie działa.

janw
źródło

Odpowiedzi:

22

addAttributeToSelect('media_gallery') nie działa, ponieważ media_gallery będzie pochodzić ze skomplikowanej logiki.

Możesz uzyskać łatwe media_gallerydane w pętli , ładując pełny model produktu. W tym przypadku zajmie to dużo pamięci.

Użyj modelu zaplecza media_galleryatrybutu i afterloadmodelu produktu

Aby uzyskać media_gallerywartość atrybutu bez pełnego ładowania produktu (Mage :: getModel („katalog / produkt”) -> load ($ ProductID)) .

Można użyć afterLoad(), za pomocą tego wywołania funkcji backend modelz media_gallery eav attributezaładować obraz mediów. Jest to znacznie szybsze niż pełny modelload(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
źródło
1
Tak to działało
janw
miły! zadziałało
Jitendra Mandloi
15

Przyjęta odpowiedź działa, ale wymaga załadowania wszystkich atrybutów produktu do pamięci, gdy być może są one niepotrzebne.

Aby zastosować nieco bardziej chirurgiczne podejście (testowane w 1.9.2.2 CE), wykonaj

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

W ten sposób ładujesz tylko sam atrybut media_gallery.

Aaron Bonner
źródło
To znacznie lepsze rozwiązanie niż zaakceptowana odpowiedź
SeStro
5

Wiem, że pytanie jest stare i już ma poprawną odpowiedź, ale nie jest źle polecać inną metodę, która może być przydatna dla społeczności: Przedtem $_product->getMediaGalleryImages()

Możesz spróbować:

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

Zaczerpnięte z: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663

Andres Rojas Orozco
źródło
1
Niezłe znalezisko! Muszę jednak zaznaczyć, że rozwiązanie opisane powyżej przez + amit-bera jest znacznie szybsze i wymaga mniej pamięci i bazy danych. [Edytuj: Podejście + Aarona-Bonnera jest nawet jeszcze szybsze.]
Tyler V.
Nie. To zła odpowiedź. Nie można w ten sposób załadować określonych danych do produktu, wywołuje on po prostu beforeLoad () i afterLoad () na produkcie i nie zmienia już istniejących danych w modelu, ponieważ wywołanie bazy danych nie zwróci niczego z tej funkcji . Spójrz na definicję funkcji load () w Mage_Core_Model_Abstract i Mage_Core_Model_Resource_Db_Abstract. To, co tu robisz, to prawie pełne obciążenie produktu.
OddBrew