Magento 2 Obtenga todas las imágenes de productos en la página de lista de productos


8

En Magento 1 siempre he usado

$_product->getMediaGallery('images')

Pero en la fuente de Magento 2 veo

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

Solo está obteniendo la primera imagen del producto. ¿Cómo obtengo la segunda o tercera imagen (no solo la base)?

La función GetMediaGallery no existe?

Actualización: $ _product-> getMediaGalleryImages () arroja NULL en un var_dump

y

para getMediaGallery y getMediaGalleryEntries obtengo el mismo error de aviso:

Undefined property: Magento\Catalog\Model\Product\Interceptor::$getMediaGallery

Trate de usar\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Respuestas:


9

La carga de categoría ha cambiado en 2.1, por lo que esto solo puede ser relevante a partir de 2.1 en adelante:

La galería de imágenes se agrega al producto a través de una interfaz de extensión definida a través de di.xml. El resultado es que podemos crear manualmente una instancia de la clase ReadHandler de la galería y pasar un producto para cargar todas sus imágenes de la galería.

Como es habitual en Magento 2, la mejor manera de crear una instancia de una clase es a través del método __construct (), así que aquí hay una clase de bloque de código auxiliar:

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

En su plantilla, suponiendo que tenga $ product cargado a través de una colección de productos, podrá llamar a:

$block->addGallery($product);
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    ...
}

Todavía no es posible descubrir el "papel" de la imagen (base, pequeña, miniatura, muestra) de esta manera, creo.
Patrick van Bergen

Creo que tiene razón, aunque el orden de las imágenes devueltas es predecible. ¡He usado esto para elegir roles específicos, aunque esto obviamente es subóptimo debido a la codificación de supuestos que se pueden cambiar en la interfaz de administración!
Robert Egginton

5

Use el siguiente código para obtener todas las imágenes de la galería en la página de la lista de productos:

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

66
Esto funciona Sin embargo, aparte del hecho de que usar el administrador de objetos directamente es un antipatrón con respecto a DI, esto requerirá la recarga de cada producto que es bastante costoso. No, este no es el momento de mencionar el almacenamiento en caché. Seguiré buscando una solución menos costosa, pero gracias por darnos algo para comenzar.
Robert Egginton

Gracias funcionó!
Amrit Pal Singh

4

crear ayudante por ejemplo:

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

llame y use dentro de su lista.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); ahora puede usar con el producto actual llamado para cada uno (con su 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>

la fuente completa por supuesto


3

Hay una función disponible en magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()que agregará imágenes de la galería multimedia a su colección de productos.

Solo úsalo en tu colección como,

$collection->addMediaGalleryData();

Y podrá obtener imágenes de la galería multimedia utilizando

$_product->getMediaGalleryImages()

Gracias @JaiminSutariya, fue muy útil. :)
Aditya Shah

1

Puede usar exactamente el mismo método que Magento 1:

$_product->getMediaGallery('images')

Además, Magento 2 proporciona un nuevo método para obtener la galería de medios como una matriz:

$_product->getMediaGalleryEntries():

Recibo el mismo error de aviso para getMediaGallery y getMediaGalleryEntries también Aviso: Propiedad no definida: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia

1
$product->getMediaGalleryImages()->getItems()

devuelve una matriz con las imágenes de la galería


Esto funcionó bien en 2.3, ¡gracias!
Raphael Parent

0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.