getgalleryimages возвращает Null на домашней странице Magento

magento.stackexchange https://magento.stackexchange.com/questions/5998

  •  16-10-2019
  •  | 
  •  

Вопрос

Мы расширили слайдер домашней страницы для клиента, чтобы они могли иметь продукты в этом пространстве.

В рамках этого есть три слота изображения, где мы хотим получить основное изображение продуктов, а затем два изображения из медиа -галереи (в идеале случайно, но не конец света, если от ID).

Чтобы лучше понять, пожалуйста, посмотрите скриншот того, что у нас есть до сих пор:-

featprodslider

Мы создаем коллекцию для этого модуля, используя следующее:-

$featured_products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->AddAttributeToFilter('featured', array('eq' => 1));

Получение основного изображения продукта не является проблемой, он отлично работает со следующим:-

<img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'small_image')->resize(225); ?>" alt="<?php echo $this->stripTags($this->getImageLabel($product, 'small_image'), null, true) ?>" />

И достаточно просто, чтобы все три слота изображения использовали это основное изображение, как показано на изображении выше.

Однако когда мы пытаемся позвонить в GetGalleryRyImage, это всегда возвращается NULL (Пример, например):-

<?php if (count($this->getGalleryImages()) > 0): ?>
<?php foreach ($this->getGalleryImages() as $_image): ?>
<img class="gallery" src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(100); ?>" width="100" height="100" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
<?php endforeach; ?>
<?php endif; ?>

Пожалуйста, может кто -нибудь посоветовать лучшим подходом, чтобы вызвать изображения галереи на домашней странице. Есть ли что -то, что мы можем включить в сборку коллекции, или нам нужно добавить наблюдателя.

Заранее спасибо.

Это было полезно?

Решение 3

Мы решили это в конце getMediaGalleryImages.

Код, с которым мы пошли в конце концов:-

<div class="images">
    <?php $_images = Mage::getModel('catalog/product')->load($product->getId())->getMediaGalleryImages(); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>

И здесь мы загружаем медиа -изображения продукта и гарантируем, что мы показываем только 3 для 3 слотов, которые у нас есть в слайдере продукта. Заинтересовано, хотя, если бы лучший подход был достигнут с вашим ответом @marius.

Другие советы

Я думаю, что основной вопрос здесь в том, что такое тип $this в вашем контексте. Это простой блок, это нормально, чтобы вернуть null Если метод не существует в блоке.
На другом представлении .... Вот как вы можете получить изображения, связанные с продуктом, предполагая переменную $_product является экземпляром самого продукта:

$gallery = $_product->getMediaGalleryImages();

Так что в вашем случае вам может понадобиться что -то подобное:

<?php foreach ($featured_products as $_product)  : ?>
     <?php if (count($_product->getGalleryImages()) > 0): ?>
         <?php foreach ($_product->getGalleryImages() as $_image): ?>
             <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($_product, 'thumbnail', $_image->getFile())->resize(100); ?>" width="100" height="100" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
         <?php endforeach; ?>
     <?php endif; ?>
<?php endforeach;?>

@zigojacko @marius Недавно я пришел в ситуацию, когда мне нужно получить все изображения Media Gallery из коллекции продуктов, не загружая модель продукта снова, поскольку он увеличит время выполнения и использует дополнительную память. Поэтому я провел исследования и разработки и нашел использование решения ниже линии, прежде чем GetMediagalereryImages на продуктах, которые вы загружали в коллекции.

$product->load('media_gallery');

Проверьте фрагменты кода ниже:

$products = Mage::getModel("catalog/product")->getCollection();
$galleryImagesLink = [];
$product->load('media_gallery');
$_images = $product->getMediaGalleryImages();
foreach ($_images as $image) {
    $galleryImagesLink[] = Mage::getModel('catalog/product_media_config')->getMediaUrl($image->getFile());
}

Zigojacko Просил лучший подход его рабочего кода

Вот это: нет необходимости загружать полный продукт

<div class="images">
    <?php $_images = $product->load('media_gallery')->getMediaGalleryImages(); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>

Старый вопрос, но общая проблема ... так что, возможно, это помогает другим пользователям

Более того, напишите свой собственный метод, чтобы получить значения media_gallery, поэтому запрос будет обрабатываться любезно быстрее. Что-то вроде этого...

protected $_resource = null;

public function getResource()
{
    if (is_null($this->_resource)) {
        $this->_resource = Mage::getSingleton('core/resource');
    }
    return $this->_resource;
}

protected function _getMediaPosition($valueId)
{
    $data = array();
    $readConnection = $this->getResource()->getConnection('core_read');
    $query = $readConnection->select()
        ->from($this->getResource()->getTableName('catalog_product_entity_media_gallery_value'))
        ->where('value_id = ?', $valueId);
    $results = $readConnection->fetchAll($query);
    if (! empty($results)) {
        $data = $results[0];
    }

    return $data;
}

public function getMediaGalleryImages($productId)
{
    $data = array();
    $gallery = array();

    $readConnection = $this->getResource()->getConnection('core_read');
    $query = $readConnection->select()
        ->from($this->getResource()->getTableName('catalog_product_entity_media_gallery'))
        ->where('entity_id = ?', $productId);
    $results = $readConnection->fetchAll($query);

    if (! empty($results)) {
        foreach ($results as $mediaGalleryRow) {
            $gallery[] = array_merge($mediaGalleryRow, $this->_getMediaPosition($mediaGalleryRow['value_id']));
        }
    }

    foreach ($gallery as $i => $element) {
        if ($element['disabled'] == 1) {
            continue;
        }

        $obj = new Varien_Object();
        $obj->setFile($element['value']);
        $data[$element['position'] . '_' . $i] = $obj;
    }

    ksort($data);
    return $data;
}

Итак, после добавления этого кода в ваш блок, код шаблона будет

<div class="images">
    <?php $_images = $this->getMediaGalleryImages($product->getId()); ?>    
    <?php if($_images){?>            
        <?php $i=0; foreach($_images as $_image) if ($i++ < 5) { $i++; ?>
            <img class="gallery" src="<?php echo $this->helper('catalog/image')->init($product, 'thumbnail', $_image->getFile())->resize(255); ?>" alt="<?php echo $this->htmlEscape($_image->getLabel());?>" title="<?php $this->htmlEscape($_image->getLabel());?>" />
        <?php } ?>
    <?php } ?>
</div>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top