Magento 2 Получить все изображения продукта на странице списка продуктов

8

В Magento 1 я всегда использовал

$_product->getMediaGallery('images')

Но в источнике из Magento 2 я вижу

$productImage = $block->getImage($_product, $image);
echo $productImage->toHtml();

Это только получение первого изображения продукта. Как получить второе или третье изображение (не только базовое)?

Функция GetMediaGallery не существует?

Обновление: $ _product-> getMediaGalleryImages () выбрасывает NULL в var_dump

а также

для getMediaGallery и getMediaGalleryEntries я получаю ту же ошибку уведомления:

Undefined property: Magento\Catalog\Model\Product\Interceptor::$getMediaGallery
Xaiamedia
источник
Попробуйте использовать\Magento\Catalog\Model\Product::getMediaGalleryImages()
Сергей Учухлебау

Ответы:

9

Категория загрузки изменилась в 2.1, так что это может относиться только к 2.1 и далее:

Галерея изображений добавляется в продукт через интерфейс расширения, определенный с помощью di.xml. В результате мы можем вручную создать экземпляр класса ReadHandler галереи и передать продукт для загрузки всех его изображений галереи.

Как обычно в Magento 2, лучший способ создания экземпляра класса - это метод __construct (), поэтому вот класс-заглушка:

use Magento\Catalog\Model\Product\Gallery\ReadHandler as GalleryReadHandler;

class Gallery
{
    protected $galleryReadHandler;

    public function __construct(
        GalleryReadHandler $galleryReadHandler
    )
    {
        $this->galleryReadHandler = $galleryReadHandler;
    }

    /** Add image gallery to $product */
    public function addGallery($product)
    {
        $this->galleryReadHandler->execute($product);
    }
}

В вашем шаблоне, если у вас есть $ product, загруженный через коллекцию продуктов, вы можете вызвать:

$block->addGallery($product);
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    ...
}
Роберт Эггинтон
источник
Я считаю, что пока невозможно определить «роль» изображения (базовое, маленькое, миниатюра, образец).
Патрик ван Берген
Я думаю, что вы правы, хотя порядок возвращаемых изображений предсказуем. Я использовал это, чтобы выбрать конкретные роли, хотя это явно неоптимально из-за кодирования предположений, которые могут быть изменены в интерфейсе администратора!
Роберт Эггинтон
5

Используйте код ниже, чтобы получить все изображения галереи на странице со списком товаров:

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $product = $objectManager->create('Magento\Catalog\Model\Product')->load($_product->getId());        
    $images = $product->getMediaGalleryImages();
    foreach($images as $child){ ?>
        <img src="<?php echo $child->getUrl(); ?>" >
<?php } ?>
Прашант Валанда
источник
6
Это работает. Однако, кроме того факта, что непосредственное использование менеджера объектов является анти-паттерном в отношении DI, это потребует повторной загрузки каждого продукта, который является довольно дорогим. Нет, сейчас не время упоминать кеширование. Я продолжу искать более дешевое решение, но спасибо, что дали нам кое-что для начала.
Роберт Эггинтон
Спасибо, это сработало!
Амрит Пал Сингх
4

создать помощника например:

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Ibnab\Common\Helper;
use Magento\Catalog\Model\Product\Gallery\ReadHandler as GalleryReadHandler;
class Data extends \Magento\Framework\App\Helper\AbstractHelper {
  protected $galleryReadHandler;
    /**
     * Catalog Image Helper
     *
     * @var \Magento\Catalog\Helper\Image
     */
    protected $imageHelper;
    public function __construct(
    GalleryReadHandler $galleryReadHandler,  \Magento\Framework\App\Helper\Context $context,\Magento\Catalog\Helper\Image $imageHelper)
    {
        $this->imageHelper = $imageHelper;
        $this->galleryReadHandler = $galleryReadHandler;
        parent::__construct($context);
    }
   /** Add image gallery to $product */
    public function addGallery($product) {
        $this->galleryReadHandler->execute($product);
    }
    public function getGalleryImages(\Magento\Catalog\Api\Data\ProductInterface $product)
    {
        $images = $product->getMediaGalleryImages();
        if ($images instanceof \Magento\Framework\Data\Collection) {
            foreach ($images as $image) {
                /** @var $image \Magento\Catalog\Model\Product\Image */
                $image->setData(
                    'small_image_url',
                    $this->imageHelper->init($product, 'product_page_image_small')
                        ->setImageFile($image->getFile())
                        ->getUrl()
                );
                $image->setData(
                    'medium_image_url',
                    $this->imageHelper->init($product, 'product_page_image_medium')
                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
                        ->setImageFile($image->getFile())
                        ->getUrl()
                );
                $image->setData(
                    'large_image_url',
                    $this->imageHelper->init($product, 'product_page_image_large')
                        ->constrainOnly(true)->keepAspectRatio(true)->keepFrame(false)
                        ->setImageFile($image->getFile())
                        ->getUrl()
                );
            }
        }
        return $images;
    }
}

вызовите и используйте внутри вашего list.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); теперь вы можете использовать с текущим вызываемым продуктом внутри для каждого (с вашей техникой):

  <a href="<?php echo $_product->getProductUrl() ?>">
                            <ul class="product-item-wrapper">
                                <?php
                                $_helperGallery->addGallery($_product);
                                $images = $_helperGallery->getGalleryImages($_product);
                                if ($images instanceof \Magento\Framework\Data\Collection) {
                                    $i = 1;
                                    foreach ($images as $image) {
                                        $item = $image->getData();
                                        if (isset($item['media_type']) && $item['media_type'] == 'image'):
                                            ?>
                                            <?php if ($i == 1): ?>
                                                <li class="selected">
                                                <?php else: ?>
                                                <li >
                                                <?php endif; ?>
                                                <img src="<?php echo isset($item['medium_image_url']) ? $item['medium_image_url'] : null; ?>" alt="Preview image">
                                            </li>
                                            <?php
                                            $i++;
                                        endif;
                                    }
                                }
                                ?>
                            </ul>
                        </a>

полный источник конечно

Ibnab
источник
3

В magento есть функция, Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()которая добавит изображения медиагалереи в вашу коллекцию товаров.

Просто используйте его в своей коллекции, как,

$collection->addMediaGalleryData();

И вы сможете получить изображения из галереи СМИ, используя

$_product->getMediaGalleryImages()
Джаймин Сутария
источник
Спасибо @JaiminSutariya, это было очень полезно. :)
Адитья шах
1

Вы можете использовать тот же метод, что и в Magento 1:

$_product->getMediaGallery('images')

Кроме того, Magento 2 предоставляет новый метод для получения медиа галереи в виде массива:

$_product->getMediaGalleryEntries():
Рафаэль в цифровом пианизме
источник
Я получаю ту же ошибку уведомления для getMediaGallery и getMediaGalleryEntries. Примечание: неопределенное свойство: Magento \ Каталог \ Модель \ Продукт \ Interceptor :: $ getMediaGallery
Xaiamedia
1
$product->getMediaGalleryImages()->getItems()

возвращает массив с галереей изображений

Хавьер С
источник
Это хорошо сработало в 2.3, спасибо!
Рафаэль Родитель
0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Сандип Кунапараджу
источник