如何加载产品媒体库以及集合?

Kar*_*fax 10 magento

任何人都可以给我一个关于如何加载产品的媒体库以及集合的提示.我收到这样的集合:

$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());
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

小智 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
Run Code Online (Sandbox Code Playgroud)

不确定是否所有这些都是必要的,但我很着急.在我的特殊情况下,我试图使用图像网址$product->getImageUrl();,这种方法对我有用.

希望它可以帮助别人.

  • **关于性能的重要说明:**`afterLoad()`实际上非常快.得到$后端不是.$ backend变量实际上应该对所有产品都相同,因此可以缓存它. (10认同)
  • 继Alex的评论之后,我们发现`getSetAttributes($ product)`需要大约50ms来加载.对我们来说,这是一个问题,因为我们有很多产品加载,因此50毫秒是重要的.如果你缓存(只为第一个产品运行它们)前3行而不仅仅是`getBackend`行,那么性能(至少对我们而言)显着增加. (6认同)

Pau*_*ang 9

我最近必须做同样的,最快的方法:

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

}
Run Code Online (Sandbox Code Playgroud)


Jas*_*ten -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;
}
Run Code Online (Sandbox Code Playgroud)

下面是它的用法示例:

$products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*');
$this->addMediaGalleryToArray($products);
Run Code Online (Sandbox Code Playgroud)

  • http://web.archive.org/web/20120514004308/http://www.magentocommerce.com/boards/viewthread/17414/P0/ (5认同)