Magento 2 Obtenha todas as imagens de produtos na página da lista de produtos

8

No Magento 1 eu sempre usei

$_product->getMediaGallery('images')

Mas na fonte do Magento 2 eu vejo

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

Está apenas obtendo a primeira imagem do produto. Como obtenho a segunda ou terceira imagem (não apenas a base)?

A função GetMediaGallery não existe?

Atualização: $ _product-> getMediaGalleryImages () lança NULL em um var_dump

e

para getMediaGallery e getMediaGalleryEntries, recebo o mesmo erro de aviso:

Undefined property: Magento\Catalog\Model\Product\Interceptor::$getMediaGallery
Xaiamedia
fonte
Tente usar #\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Respostas:

9

O carregamento da categoria mudou em 2.1, portanto, isso só pode ser relevante a partir de 2.1:

A galeria de imagens é adicionada ao produto por meio de uma interface de extensão definida por di.xml. O resultado é que podemos criar manualmente uma instância da classe ReadHandler da galeria e transmitir um produto para carregar todas as suas imagens da galeria.

Como de costume no Magento 2, a melhor maneira de instanciar uma classe é através do método __construct (), então aqui está uma classe de bloco de stub:

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);
    }
}

No seu modelo, supondo que você tenha $ product carregado por meio de uma coleção de produtos, você poderá chamar:

$block->addGallery($product);
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    ...
}
Robert Egginton
fonte
Ainda não é possível descobrir o "papel" da imagem (base, pequena, miniatura, amostra) dessa maneira, acredito.
Patrick van Bergen
Acho que você está correto, embora a ordem das imagens retornadas seja previsível. Eu usei isso para escolher funções específicas, embora isso seja obviamente subótimo devido à codificação de suposições que podem ser alteradas na interface de administração!
Robert Egginton
5

Use o código abaixo para obter todas as imagens da galeria na página da lista de produtos:

<?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 } ?>
Prashant Valanda
fonte
6
Isso funciona. No entanto, além do fato de que usar o gerenciador de objetos diretamente é um antipadrão em relação ao DI, isso exigirá o recarregamento de todos os produtos que são bastante caros. Não, não é hora de mencionar o cache. Vou continuar procurando uma solução mais barata, mas obrigado por nos dar algo para começar.
Robert Egginton 29/06
Graças funcionou!
Amrit Pal Singh
4

crie ajudante, por exemplo:

<?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;
    }
}

chame e use dentro de sua list.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); agora você pode usar o produto chamado atual dentro de cada um (com sua técnica):

  <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>

a fonte completa, é claro

Ibnab
fonte
3

Existe uma função disponível no magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()que adiciona imagens da galeria de mídia à sua coleção de produtos.

Basta usá-lo em sua coleção como,

$collection->addMediaGalleryData();

E você poderá obter imagens da galeria de mídia usando

$_product->getMediaGalleryImages()
Jaimin Sutariya
fonte
Obrigado @JaiminSutariya, foi muito útil. :)
Aditya Shah
1

Você pode usar exatamente o mesmo método que o Magento 1:

$_product->getMediaGallery('images')

Além disso, o Magento 2 fornece um novo método para obter a galeria de mídia como uma matriz:

$_product->getMediaGalleryEntries():
Raphael na Digital Pianism
fonte
Eu recebo o mesmo erro aviso para getMediaGallery e getMediaGalleryEntries bem Aviso: propriedade indefinido: Magento \ Catalog \ Modelo \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia
1
$product->getMediaGalleryImages()->getItems()

retorna uma matriz com as imagens da galeria

Javier S
fonte
Isso funcionou bem na versão 2.3, obrigado!
Raphael Parent
0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Sandeep Kunaparaju
fonte