Magento 2 Obtenez toutes les images de produits sur la page de liste des produits

8

Dans Magento 1, j'ai toujours utilisé

$_product->getMediaGallery('images')

Mais dans la source de Magento 2, je vois

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

Il n'obtient que la première image du produit. Comment obtenir la deuxième ou la troisième image (pas seulement l'image de base)?

La fonction GetMediaGallery n'existe pas?

Mise à jour: $ _product-> getMediaGalleryImages () lève NULL dans un var_dump

et

pour getMediaGallery et getMediaGalleryEntries, j'obtiens la même erreur de notification:

Undefined property: Magento\Catalog\Model\Product\Interceptor::$getMediaGallery
Xaiamedia
la source
Essayez d'utiliser\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Réponses:

9

Le chargement des catégories a changé en 2.1, donc cela ne peut être pertinent qu'à partir de 2.1:

La galerie d'images est ajoutée au produit via une interface d'extension définie via di.xml. Le résultat est que nous pouvons créer manuellement une instance de la classe ReadHandler de la galerie et passer un produit pour charger toutes ses images de la galerie.

Comme d'habitude dans Magento 2, la meilleure façon d'instancier une classe est via la méthode __construct (), voici donc une classe de bloc 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);
    }
}

Dans votre modèle, en supposant que $ product soit chargé via une collection de produits, vous pourrez appeler:

$block->addGallery($product);
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    ...
}
Robert Egginton
la source
Il n'est pas encore possible de découvrir le "rôle" de l'image (base, petite, vignette, échantillon) de cette façon, je crois.
Patrick van Bergen
Je pense que vous avez raison, bien que l'ordre des images retournées soit prévisible. Je l'ai utilisé pour choisir des rôles spécifiques, bien que ce soit évidemment sous-optimal en raison du codage d'hypothèses qui peuvent être modifiées dans l'interface d'administration!
Robert Egginton
5

Utilisez le code ci-dessous pour obtenir toutes les images de la galerie sur la page de liste des produits:

<?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
la source
6
Cela fonctionne. Cependant, à part le fait que l'utilisation directe du gestionnaire d'objets est un anti-modèle en ce qui concerne DI, cela nécessitera le rechargement de chaque produit qui est assez cher. Non, ce n'est pas le moment de mentionner la mise en cache. Je vais continuer à chercher une solution moins chère, mais merci de nous avoir donné quelque chose pour commencer.
Robert Egginton
Merci ça a marché!
Amrit Pal Singh
4

créer une aide par exemple:

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

appeler et utiliser dans votre list.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); maintenant vous pouvez utiliser avec le produit appelé actuel à l'intérieur de chacun (avec votre technique):

  <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 source complète bien sûr

Ibnab
la source
3

Il existe une fonction disponible dans magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()qui ajoutera des images de galerie multimédia à votre collection de produits.

Utilisez-le simplement sur votre collection comme,

$collection->addMediaGalleryData();

Et vous pourrez obtenir des images de la galerie multimédia en utilisant

$_product->getMediaGalleryImages()
Jaimin Sutariya
la source
Merci @JaiminSutariya, cela a été très utile. :)
Aditya Shah
1

Vous pouvez utiliser exactement la même méthode que Magento 1:

$_product->getMediaGallery('images')

De plus, Magento 2 fournit une nouvelle méthode pour obtenir la galerie multimédia en tant que tableau:

$_product->getMediaGalleryEntries():
Raphael chez Digital Pianism
la source
J'obtiens la même erreur de notification pour getMediaGallery et getMediaGalleryEntries également Remarque: propriété non définie: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia
1
$product->getMediaGalleryImages()->getItems()

renvoie un tableau avec les images de la galerie

Javier S
la source
Cela a bien fonctionné en 2.3, merci!
Raphael Parent
0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Sandeep Kunaparaju
la source