在产品集中加载媒体图像的更快方法


23

TL; DR:如何在不加载整个产品的情况下加载产品图像/图库?

我想将图像加载到产品上。我在.phtml中做什么

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

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

这有效,但我加载了所有内容: $_popularCollection->addAttributeToSelect(*);

我尝试过,$_popularCollection->addAttributeToSelect('media_gallery'); 但是似乎没有用。

Answers:


22

addAttributeToSelect('media_gallery') 无法使用,因为media_gallery将来自复杂的逻辑。

通过加载完整的产品模型,您可以在循环中获得简单的media_gallery数据但是在这种情况下,它将占用大量内存。

使用media_gallery属性和afterload产品模型的后端模型

用于在没有全部产品加载的情况下获取media_gallery属性值(Mage :: getModel('catalog / product')-> load($ ProductID))

您可以使用 afterLoad(),使用此功能调用backend modelmedia_gallery eav attribute加载媒体图像。这比完整模型要快得多load(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/>";


}

1
是的,没错
janw 2015年

真好!它奏效了
Jitendra Mandloi

15

可接受的答案是可行的,但涉及到可能不需要所有产品属性时将它们加载到内存中。

要采取更多的外科手术方法(在1.9.2.2 CE中进行测试)

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

这样,您仅加载media_gallery属性本身。


比接受的答案好得多的解决方案
SeStro

5

我知道这个问题很旧,而且已经有了正确的答案,但是推荐另一种对社区有用的方法也不错: $_product->getMediaGalleryImages()

你可以试试:

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

摘自:https : //stackoverflow.com/questions/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
好发现!但是,我必须指出,以上+ amit-bera描述的解决方案明显更快,并且占用的内存和数据库更少。[编辑:+ aaron-bonner的方法实际上甚至更快。]
泰勒(Tyler)V.

不,这是一个错误的答案。您不能以这种方式加载产品上的特定数据,它只能在产品上调用beforeLoad()和afterLoad(),并且不会更改模型上已经存在的数据,因为数据库调用不会从此函数返回任何信息。查看Mage_Core_Model_Abstract和Mage_Core_Model_Resource_Db_Abstract上的load()函数定义。您在这里所做的几乎只是该产品的全部负载。
OddBrew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.