getgalleryimages возвращает Null на домашней странице Magento
-
16-10-2019 - |
Вопрос
Мы расширили слайдер домашней страницы для клиента, чтобы они могли иметь продукты в этом пространстве.
В рамках этого есть три слота изображения, где мы хотим получить основное изображение продуктов, а затем два изображения из медиа -галереи (в идеале случайно, но не конец света, если от ID).
Чтобы лучше понять, пожалуйста, посмотрите скриншот того, что у нас есть до сих пор:-
Мы создаем коллекцию для этого модуля, используя следующее:-
$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>