Более быстрый способ загрузки изображений мультимедиа в коллекцию товаров

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'); но это не похоже на работу.

janw
источник

Ответы:

22

addAttributeToSelect('media_gallery') не работает, так как media_gallery будет исходить из сложной логики.

Вы можете легко получить media_galleryданные внутри цикла , загрузив полную модель продукта, но в этом случае потребуется много памяти.

Использовать внутреннюю модель media_galleryатрибута и afterloadмодели продукта

Для получения media_galleryзначения атрибута без полной загрузки продукта (Mage :: getModel ('catalog / product') -> load ($ 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
Да, это сработало
Janw
хороший! это сработало
Джитендра Мандлой
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();

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

Андрес Рохас Орозко
источник
1
Хорошая находка! Однако я должен отметить, что решение, описанное выше + amit-bera, значительно быстрее и требует меньше памяти и базы данных. [Редактировать: Подход + Аарон-Боннер на самом деле даже быстрее.]
Тайлер В.
Нет, это плохой ответ. Вы не можете загружать определенные данные о продукте таким образом, он просто вызывает beforeLoad () и afterLoad () для продукта и не изменяет уже существующие данные в модели, потому что вызов базы данных ничего не возвращает из этой функции. , Посмотрите определение функции load () для Mage_Core_Model_Abstract и Mage_Core_Model_Resource_Db_Abstract. То, что вы делаете здесь, это почти полная загрузка продукта.
OddBrew