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.

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/>";


}

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.