Modo più rapido per caricare immagini multimediali in una raccolta di prodotti


23

TL; DR : come posso caricare le immagini / la galleria del prodotto senza caricare l'intero prodotto?

Voglio caricare le immagini su un prodotto. Cosa faccio nel file .phtml

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

Cosa faccio nella classe 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;
}

Funziona, ma carico tutto: $_popularCollection->addAttributeToSelect(*);

Ho provato $_popularCollection->addAttributeToSelect('media_gallery'); Ma non sembra funzionare.

Risposte:


22

addAttributeToSelect('media_gallery') non funziona come media_gallery verrà dalla logica complicata.

Puoi ottenere facilmente i media_gallerydati all'interno del loop caricando il modello completo del prodotto ma in questo caso ci vorrà molta memoria.

Utilizzare il modello di media_galleryattributo Backend e il modello afterloaddel prodotto

Per ottenere il media_galleryvalore dell'attributo senza carico completo del prodotto (Mage :: getModel ('catalog / product') -> load ($ ProductID)) .

È possibile utilizzare afterLoad(), utilizzando questa chiamata backend modeldi funzione per media_gallery eav attributecaricare l'immagine multimediale. Questo è molto più veloce del modello completoload(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
Sì, ha funzionato
gennaio

simpatico! ha funzionato
Jitendra Mandloi

15

La risposta accettata funziona, ma comporta il caricamento di tutti gli attributi del prodotto in memoria quando forse non sono necessari.

Fare un approccio leggermente più chirurgico (testato in 1.9.2.2 CE)

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

In questo modo si carica solo l'attributo media_gallery stesso.


È una soluzione molto migliore della risposta accettata
SeStro

5

So che la domanda è vecchia e che ha già una risposta corretta, ma non è male raccomandare un altro metodo che può essere utile alla comunità: Prima $_product->getMediaGalleryImages()

Puoi provare:

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

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


1
Bella scoperta! Tuttavia, devo sottolineare che la soluzione descritta da + amit-bera sopra è significativamente più veloce e richiede meno memoria e database. [Modifica: l'approccio di + aaron-bonner è in realtà ancora più veloce.]
Tyler V.

No. Questa è una brutta risposta. Non è possibile caricare dati specifici su un prodotto in questo modo, chiama semplicemente beforeLoad () e afterLoad () sul prodotto e non modifica i dati già esistenti sul modello perché la chiamata al database non restituirà nulla da questa funzione . Guarda la definizione della funzione load () su Mage_Core_Model_Abstract e Mage_Core_Model_Resource_Db_Abstract. Quello che stai facendo qui è quasi un pieno carico del prodotto.
OddBrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.