2011-05-05 59 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()); 
    } 
} 
相關問題