2011-05-05 53 views
9

任何人都可以给我一个关于如何加载产品的媒体库和集合的暗示。 我得到的集合是这样的:如何将产品媒体库与集合一起加载?

$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()); 
} 

但getMediaGalleryImages()返回null。我知道我可以分别加载每个产品$product = Mage::getModel('catalog/product')->load($product->getId()),但我想避免这种情况,因为这会造成不必要的工作量。

谢谢!

回答

-6

这里是将媒体库添加到集合的函数:

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

一个例子它的用法如下:

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

而且.....我每天都讨厌magento论坛的蹩脚迁移。 – janw 2015-04-29 14:29:22

+5

http://web.archive.org/web/20120514004308/http://www.magentocommerce.com/boards/viewthread/17414/P0/ – 2015-05-06 14:23:23

+2

下次发布剪辑...链接现已停止。 – 2015-10-02 18:18:31

1

你将不得不使用:

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

参考http://www.magentocommerce.com/boards/viewthread/29639/

+6

它加载整个产品。是的,它可以工作,但需要很多时间和记忆。 – 2013-05-15 08:27:15

+0

你推荐的解决方案是什么? – Darren 2013-05-15 23:14:59

18

如果有人在找这个另一种方法,我发现这个工作(只在一个情况下,所以没有保证!):

一定要做到$collection->addAttributeToSelect(’image’);第一,然后通过收集产品循环时,做:

$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 

不知道是否所有这一切都是必要的,但我很匆忙。在我的特殊情况下,我试图使用$product->getImageUrl();来获取图像的URL,这种方法对我有用。

希望它可以帮助别人。

+9

**关于性能的重要提示:**'afterLoad()'实际上相当快。获得$后端不是。所有产品的$ backend变量实际上应该是相同的,所以它可以被缓存。 – Alex 2013-02-04 16:57:24

+6

除了Alex的评论,我们发现'getSetAttributes($ product)'需要大约50ms才能加载。对我们来说这是一个问题,因为我们有很多产品加载,所以50ms是很重要的。如果您缓存(仅针对第一个产品运行它们)前3行而不仅仅是getBackend行,那么性能(至少对我们而言)显着增加。 – Luke 2013-07-12 09:14:57

1

试试这个

$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

我不得不这样做,最近同样的,最快的方法:

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

这是最有效的一个。 – zlik 2016-01-28 00:53:24

0

它可以直接在循环中使用:

 
foreach ($collection as $product) { 
    $product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product); 
    foreach ($product->getMediaGalleryImages() as $image) { 
     var_dump($image->debug()); 
    } 
} 
相关问题