Швидший спосіб завантаження медіа-зображень у колекцію продукту


23

TL; DR : Як завантажувати зображення / галерею продукту, не завантажуючи весь продукт?

Я хочу завантажити зображення на продукт. Що я роблю в .phtml

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

Що я роблю в класі Блок:

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'); але це, здається, не працює.

Відповіді:


22

addAttributeToSelect('media_gallery') не працює, оскільки media_gallery виходитиме із складної логіки.

Ви можете отримати прості media_galleryдані всередині циклу , завантаживши повну модель продукту, але в цьому випадку буде потрібно багато пам'яті.

Використовуйте модель media_galleryатрибута та afterloadмоделі продукту Backend

Отримання media_galleryзначення атрибута без повного завантаження продукту (Mage :: getModel ('каталог / продукт') -> завантаження ($ ProductID)) .

Ви можете використовувати afterLoad(), використовуючи цю функцію виклику backend modelз media_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
Так, це спрацювало
січень

приємно! це спрацювало
Джіттрендра Мандлой

15

Прийнята відповідь працює, але передбачає завантаження всіх атрибутів продукту в пам’ять, коли, можливо, вони є непотрібними.

Щоб скористатися трохи більш хірургічним підходом (тестували в 1.9.2.2 н.е.), робіть

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

Взято з: /programming/7890616/get-product-media-gallery-images-from-a-product-collection-in-magento#23804663


1
Приємна знахідка! Однак я мушу зазначити, що рішення, описане вище + amit-bera, значно швидше та менш об'єм пам'яті та бази даних. [Редагувати: Підхід + aaron-bonner насправді ще швидший.]
Тайлер В.

Ні. Це погана відповідь. Ви не можете завантажувати конкретні дані на продукт таким чином, він просто дзвонить до продукту передLoad () та afterLoad (), а також не змінює вже наявні дані в моделі, оскільки виклик бази даних нічого не поверне з цієї функції . Подивіться на визначення функції load () на Mage_Core_Model_Ab абстракт та Mage_Core_Model_Resource_Db_Ab Abstract. Що ви тут робите, це майже майже повне завантаження продукту.
OddBrew
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.