2011-05-05 4 views
9

¿Alguien puede darme una pista sobre cómo cargar la galería de medios del producto junto con la colección? estoy recibiendo la colección de esta manera:¿Cómo cargar galería de medios de productos junto con la colección?

$collection = Mage::getModel('catalog/product')->getCollection() 
         ->addStoreFilter($storeId) 
         ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED); 
foreach ($collection as $product) { 
    var_dump($product->getMediaGalleryImages()); 
} 

Pero getMediaGalleryImages() devuelve null. Sé que puedo cargar cada producto por separado con $product = Mage::getModel('catalog/product')->load($product->getId()), pero quiero evitar esto, ya que causa una carga de trabajo innecesaria.

¡Gracias!

Respuesta

-6

Aquí es una función para añadir la galería de los medios de comunicación a una colección:

// Source: http://www.magentocommerce.com/boards/viewthread/17414/#t141830 

public function addMediaGalleryAttributeToCollection(Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection $_productCollection) { 
    $_mediaGalleryAttributeId = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'media_gallery')->getAttributeId(); 
    $_read = Mage::getSingleton('core/resource')->getConnection('catalog_read'); 

    $_mediaGalleryData = $_read->fetchAll(' 
     SELECT 
      main.entity_id, `main`.`value_id`, `main`.`value` AS `file`, 
      `value`.`label`, `value`.`position`, `value`.`disabled`, `default_value`.`label` AS `label_default`, 
      `default_value`.`position` AS `position_default`, 
      `default_value`.`disabled` AS `disabled_default` 
     FROM `catalog_product_entity_media_gallery` AS `main` 
      LEFT JOIN `catalog_product_entity_media_gallery_value` AS `value` 
       ON main.value_id=value.value_id AND value.store_id=' . Mage::app()->getStore()->getId() . ' 
      LEFT JOIN `catalog_product_entity_media_gallery_value` AS `default_value` 
       ON main.value_id=default_value.value_id AND default_value.store_id=0 
     WHERE (
      main.attribute_id = ' . $_read->quote($_mediaGalleryAttributeId) . ') 
      AND (main.entity_id IN (' . $_read->quote($_productCollection->getAllIds()) . ')) 
     ORDER BY IF(value.position IS NULL, default_value.position, value.position) ASC  
    '); 

    $_mediaGalleryByProductId = array(); 
    foreach ($_mediaGalleryData as $_galleryImage) { 
     $k = $_galleryImage['entity_id']; 
     unset($_galleryImage['entity_id']); 
     if (!isset($_mediaGalleryByProductId[$k])) { 
      $_mediaGalleryByProductId[$k] = array(); 
     } 
     $_mediaGalleryByProductId[$k][] = $_galleryImage; 
    } 
    unset($_mediaGalleryData); 
    foreach ($_productCollection as &$_product) { 
     $_productId = $_product->getData('entity_id'); 
     if (isset($_mediaGalleryByProductId[$_productId])) { 
      $_product->setData('media_gallery', array('images' => $_mediaGalleryByProductId[$_productId])); 
     } 
    } 
    unset($_mediaGalleryByProductId); 

    return $_productCollection; 
} 

Un ejemplo de su uso a continuación:

$products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*'); 
$this->addMediaGalleryToArray($products); 
+8

Y ..... todos los días odio aún más a la mierda de los foros de magento. – janw

+5

http://web.archive.org/web/20120514004308/http://www.magentocommerce.com/boards/viewthread/17414/P0/ –

+2

Publique un recorte la próxima vez ... El enlace ahora está muerto. –

1

usted va a tener que utilizar:

// Returns the Media Gallery Images 
Mage::getModel(’catalog/product’)->load(productid)->getMediaGalleryImages(); 

Referencia: http://www.magentocommerce.com/boards/viewthread/29639/

+6

Carga producto entero. Sí, funciona, pero lleva mucho tiempo y memoria. –

+0

¿Cuál es su solución recomendada? – Darren

18

En caso de que alguien está buscando otro enfoque en esto, he encontrado que esto funcione (en sólo un caso así que no hay garantías!):

Asegúrese de realizar $collection->addAttributeToSelect(’image’); en primer lugar, a continuación, cuando bucle a través de los productos colección, realice :

$attributes = $product->getTypeInstance(true)->getSetAttributes($product); 
$media_gallery = $attributes[’media_gallery’]; 
$backend = $media_gallery->getBackend(); 
$backend->afterLoad($product); //this loads the media gallery to the product object 

No estoy seguro de si todo esto es necesario, pero tengo prisa. En mi caso particular, estaba tratando de obtener la url de la imagen usando $product->getImageUrl(); y este enfoque funcionó para mí.

Espero que ayude a otra persona.

+9

** Nota importante sobre el rendimiento: ** El 'afterLoad()' es bastante rápido. Obtener el $ backend no es. La variable $ backend en realidad debería ser la misma para todos los productos, por lo que se puede almacenar en caché. – Alex

+6

Además del comentario de Alex, encontramos que 'getSetAttributes ($ product)' tarda alrededor de 50ms en cargarse. Para nosotros, esto es un problema porque tenemos muchos productos cargados, por lo que 50 ms es importante. Si almacena en caché (solo las ejecuta para el primer producto) las primeras 3 líneas en lugar de solo la línea 'getBackend', el rendimiento (al menos para nosotros) aumenta significativamente. – Luke

1

probar este

$collection = Mage::getModel('catalog/product')->getCollection() 
         ->addStoreFilter($storeId) 
         ->addAttributeToSelect(array('image', 'media_gallery')) 
         ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED); 
foreach ($collection as $product) { 
    var_dump($product->getMediaGallery()); 
} 
8

que tenía que hacer lo mismo recientemente, el método más rápido:

class My_Module_Block_Name extends Mage_Catalog_Block_Product_View_Abstract 
{ 

/** @var null|Mage_Catalog_Model_Resource_Eav_Attribute */ 
protected static $_mediaGalleryBackend = null; 

public function getGalleryImages() 
{ 
    $product = $this->getProduct(); 
    $this->_getBackend()->afterLoad($product); 
    $collection = $product->getMediaGalleryImages(); 

    return $collection; 
} 


/** 
* @return Mage_Catalog_Model_Resource_Eav_Attribute 
*/ 
protected function _getBackend() { 
    if (self::$_mediaGalleryBackend === null) { 

     $mediaGallery = Mage::getSingleton('eav/config') 
      ->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'media_gallery'); 

     self::$_mediaGalleryBackend = $mediaGallery->getBackend(); 
    } 

    return self::$_mediaGalleryBackend; 
} 

} 
+0

Este es el más efectivo. – zlik

0

Puede ser utilizado directamente en el bucle:

 
foreach ($collection as $product) { 
    $product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product); 
    foreach ($product->getMediaGalleryImages() as $image) { 
     var_dump($image->debug()); 
    } 
} 
Cuestiones relacionadas