After see many frontend developers search for how call gallery in product list page , we decide to write small course (tutorial) for how done this task .
Ok first you need create class helper inside your module , for example Ibnab/Common/Helper/Data.php and push the code :
<?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; } }
Here we call to objects Magento\Catalog\Model\Product\Gallery\ReadHandler and \Magento\Catalog\Helper\Image from it's name you can observe the first is the reader of gallery by attribute - here thery reads media_gallery - and giving you as result information of all images of this current product passed to method $this->galleryReadHandler->execute($product) .
So and \Magento\Catalog\Helper\Image in our example is to organize our gallery to three type image_small / image_medium / image_large .
Ok now you need go to your list.phtml inside your theme or anywhere and calling your helper :
$_helperGallery = $this->helper('Ibnab\Common\Helper\Data');
Now you can use with the current product of foreach statement (with your 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(); ?> <?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>
You can dump current image inside loop statement with :
var_dump( $image->getData());
now all is cool you can use any type of image from gallery
Comments