TransWikia.com

Magento 2 Get all product images in on product list page

Magento Asked by Xaiamedia on October 1, 2021

In Magento 1 I’ve always used

$_product->getMediaGallery('images')

But in the source from Magento 2 I see

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

It’s only getting the first product image. How do I get the second or third image (not only the base one)?

GetMediaGallery function doesn’t exists?

Update:
$_product->getMediaGalleryImages() throws NULL in a var_dump

and

for getMediaGallery and getMediaGalleryEntries I get the same notice error:

Undefined property: MagentoCatalogModelProductInterceptor::$getMediaGallery

8 Answers

In magento 2.3.4 i get this like this. You can get all images of the product by gallery ReadHandler

 <?php
    namespace VendorModuleControllerIndex;
    
    class DownloadPictures extends MagentoFrameworkAppActionAction
    {
        protected $_pageFactory;
    
        public function __construct(
            MagentoFrameworkAppActionContext $context,
            MagentoFrameworkViewResultPageFactory $pageFactory,
            MagentoCatalogApiProductRepositoryInterfaceFactory $productRepositoryFactory,
            MagentoCatalogModelProductGalleryReadHandler  $GalleryReadHandler
        )
        {
            $this->_pageFactory = $pageFactory;
            $this->_productRepositoryFactory = $productRepositoryFactory;
            $this->galleryReadHandler = $GalleryReadHandler;
            return parent::__construct($context);
        }
    
        public function execute()
        {
            $product = $this->_productRepositoryFactory->create()->getById($product_id);

            $galleryReadHandler = $this->galleryReadHandler->execute($product);
            $images = $galleryReadHandler->getMediaGalleryImages();
            foreach ($images as $image) {
               print_r($image->getUrl());
            }
    
        }
    }

Hope this helps give upvote if it helps

Answered by Asad Ullah on October 1, 2021

There is a function available in magento MagentoCatalogModelResourceModelProductCollection::addMediaGalleryData() which will add media gallery images to your product collection.

Just use it on your collection like,

$collection->addMediaGalleryData();

And you will be able to get media gallery images using

$_product->getMediaGalleryImages()

Answered by Jaimin Sutariya on October 1, 2021

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

returns an array with the gallery images

Answered by Javier S on October 1, 2021

foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;

Answered by Sandeep Kunaparaju on October 1, 2021

create helper for example :

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace IbnabCommonHelper;
use MagentoCatalogModelProductGalleryReadHandler as GalleryReadHandler;
class Data extends MagentoFrameworkAppHelperAbstractHelper {
  protected $galleryReadHandler;
    /**
     * Catalog Image Helper
     *
     * @var MagentoCatalogHelperImage
     */
    protected $imageHelper;
    public function __construct(
    GalleryReadHandler $galleryReadHandler,  MagentoFrameworkAppHelperContext $context,MagentoCatalogHelperImage $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(MagentoCatalogApiDataProductInterface $product)
    {
        $images = $product->getMediaGalleryImages();
        if ($images instanceof MagentoFrameworkDataCollection) {
            foreach ($images as $image) {
                /** @var $image MagentoCatalogModelProductImage */
                $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;
    }
}

call and use inside your list.phtml : $_helperGallery = $this->helper('IbnabCommonHelperData'); now you can use with current called product inside for each (with you technique):

  <a href="<?php echo $_product->getProductUrl() ?>">
                            <ul class="product-item-wrapper">
                                <?php
                                $_helperGallery->addGallery($_product);
                                $images = $_helperGallery->getGalleryImages($_product);
                                if ($images instanceof MagentoFrameworkDataCollection) {
                                    $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>

the complete source of course

Answered by Ibnab on October 1, 2021

Category loading has changed in 2.1, so this may only be relevant from 2.1 onwards:

The image gallery is added to the product via an extension interface defined via di.xml. The upshot is that we can manually create an instance of the gallery ReadHandler class and pass a product to load all its gallery images.

As usual in Magento 2 the best way to instantiate a class is via the __construct() method, so here is a stub block class:

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

In your template, assuming you have $product loaded via a product collection, you would be able to call:

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

Answered by Robert Egginton on October 1, 2021

Use below code to get all gallery images on product list page:

<?php
    $objectManager = MagentoFrameworkAppObjectManager::getInstance();
    $product = $objectManager->create('MagentoCatalogModelProduct')->load($_product->getId());        
    $images = $product->getMediaGalleryImages();
    foreach($images as $child){ ?>
        <img src="<?php echo $child->getUrl(); ?>" >
<?php } ?>

Answered by Prashant Valanda on October 1, 2021

You can use the exact same method as Magento 1:

$_product->getMediaGallery('images')

Also, Magento 2 provides a new method to get the media gallery as an array:

$_product->getMediaGalleryEntries():

Answered by Raphael at Digital Pianism on October 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP