Maneira mais rápida de carregar imagens de mídia em uma coleção de produtos

23

TL; DR : Como carrego as imagens / galeria do produto sem carregar o produto inteiro?

Quero carregar as imagens em um produto. O que faço no .phtml

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

O que faço na 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;
}

Isso funciona, mas eu carrego tudo: $_popularCollection->addAttributeToSelect(*);

Eu tentei, $_popularCollection->addAttributeToSelect('media_gallery'); mas não parece funcionar.

janw
fonte

Respostas:

22

addAttributeToSelect('media_gallery') não está funcionando, pois media_gallery virá de lógica complicada.

Você pode obter media_gallerydados fáceis em loop carregando o modelo completo do produto. Mas, neste caso, será necessária muita memória.

Use o modelo de back-end do media_galleryatributo e afterloaddo modelo do produto

Para obter o media_galleryvalor do atributo sem carga total do produto (Mage :: getModel ('catalog / product') -> load ($ ProductID)) .

Você pode usar afterLoad(), usando esta chamada backend modelde função, para media_gallery eav attributecarregar a imagem de mídia. Isso é muito mais rápido que o modelo 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/>";


}
Amit Bera
fonte
1
Sim, isso funcionou
janw 30/04/2015
legais! ele trabalhou
Jitendra Mandloi
15

A resposta aceita funciona, mas envolve carregar todos os atributos do produto na memória quando talvez eles sejam desnecessários.

Para adotar uma abordagem um pouco mais cirúrgica (testada em 1.9.2.2 CE),

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

Dessa forma, você carrega apenas o próprio atributo media_gallery.

Aaron Bonner
fonte
É muito solução melhor do que resposta aceita
SeStro
5

Sei que a pergunta é antiga e que ela já tem uma resposta correta, mas não é ruim recomendar outro método que possa ser útil à comunidade: Antes $_product->getMediaGalleryImages()

Podes tentar:

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

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

Andres Rojas Orozco
fonte
1
Boa descoberta! No entanto, devo salientar que a solução descrita por + amit-bera acima é significativamente mais rápida e consome menos memória e banco de dados. [Edit: A abordagem por + Aaron-bonner é realmente ainda mais rápido.]
Tyler V.
Não. Esta é uma resposta ruim. Você não pode carregar dados específicos em um produto dessa maneira, apenas chama beforeLoad () e afterLoad () no produto e não altera os dados já existentes no modelo porque a chamada do banco de dados não retornará nada dessa função . Observe a definição da função load () em Mage_Core_Model_Abstract e Mage_Core_Model_Resource_Db_Abstract. O que você está fazendo aqui é apenas quase uma carga completa do produto.
OddBrew