Manera más rápida de cargar imágenes de medios en una colección de productos

23

TL; DR : ¿Cómo cargo las imágenes / galería del producto sin cargar todo el producto?

Quiero cargar las imágenes en un producto. Lo que hago en el .phtml

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

Lo que hago en la clase 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;
}

Esto funciona Pero lo cargo todo: $_popularCollection->addAttributeToSelect(*);

Lo intenté $_popularCollection->addAttributeToSelect('media_gallery'); pero no parece funcionar.

janw
fuente

Respuestas:

22

addAttributeToSelect('media_gallery') no funciona ya que media_gallery vendrá de una lógica complicada.

Puede obtener media_gallerydatos fáciles dentro del bucle cargando el modelo de producto completo. Pero en este caso, necesitará mucha memoria.

Utilice el modelo de backend del media_galleryatributo y afterloaddel modelo del producto

Para obtener el media_galleryvalor del atributo sin la carga completa del producto (Mage :: getModel ('catalog / product') -> load ($ ProductID)) .

Puede usar afterLoad(), usando esta función, llamar backend modelpara media_gallery eav attributecargar la imagen multimedia. Esto es mucho más rápido que el 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
fuente
1
Sí, eso funcionó
enero
¡bonito! funcionó
Jitendra Mandloi
15

La respuesta aceptada funciona, pero implica cargar todos los atributos del producto en la memoria cuando tal vez sean innecesarios.

Para adoptar un enfoque un poco más quirúrgico (probado en 1.9.2.2 CE) hacer

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

De esta manera, solo carga el atributo media_gallery en sí.

Aaron Bonner
fuente
Es una solución mucho mejor que la respuesta aceptada
SeStro
5

Sé que la pregunta es antigua y que ya tiene una respuesta correcta, pero no está mal recomendar otro método que pueda ser útil para la comunidad: antes $_product->getMediaGalleryImages()

Puedes probar:

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

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

Andres Rojas Orozco
fuente
1
Buen hallazgo! Sin embargo, debo señalar que la solución descrita anteriormente por + amit-bera es significativamente más rápida y requiere menos memoria y uso intensivo de la base de datos. [Editar: El enfoque de + aaron-bonner es en realidad aún más rápido.]
Tyler V.
No. Esta es una mala respuesta. No puede cargar datos específicos en un producto de esta manera, solo llama a beforeLoad () y afterLoad () en el producto, y no cambia los datos ya existentes en el modelo porque la llamada a la base de datos no devolverá nada de esta función . Mire la definición de la función load () en Mage_Core_Model_Abstract y Mage_Core_Model_Resource_Db_Abstract. Lo que estás haciendo aquí es casi una carga completa del producto.
OddBrew