Magento 2在产品列表页面上获取所有产品图像


8

在Magento 1中,我一直使用

$_product->getMediaGallery('images')

但是从Magento 2的源中我看到了

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

它只是获得第一个产品图片。如何获得第二个或第三个图像(不仅是基本图像)?

GetMediaGallery函数不存在?

更新: $ _product-> getMediaGalleryImages()在var_dump中抛出NULL

对于getMediaGallery和getMediaGalleryEntries,我得到相同的通知错误:

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

尝试使用\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau,2016年

Answers:


9

在2.1中类别加载已更改,因此仅从2.1开始才相关:

图像库通过di.xml定义的扩展接口添加到产品中。结果是我们可以手动创建Gallery ReadHandler类的实例,并传递产品以加载其所有画廊图像。

像在Magento 2中一样,实例化类的最佳方法是通过__construct()方法,因此这是一个存根块类:

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

在模板中,假设您通过产品集合加载了$ product,则可以调用:

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

我相信,尚不可能以这种方式找出图像的“角色”(基础,小,缩略图,色板)。
Patrick van Bergen

我认为您是正确的,尽管返回的图像顺序是可以预测的。我用它来挑选特定的角色,尽管由于在管理界面中可以更改的假设进行编码,这显然不是最佳选择!
罗伯特·艾金顿

5

使用以下代码获取产品列表页面上的所有图库图像:

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

6
这确实有效。但是,除了直接使用对象管理器是对DI的反模式之外,这还需要重新装入每个产品,这相当昂贵。不,现在不是时候提到缓存了。我将继续寻找一种较便宜的解决方案,但感谢您给我们一些帮助。
罗伯特·艾金顿

谢谢工作!
阿姆里特·帕·辛格

4

创建帮助程序,例如:

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

在list.phtml中调用并使用: $ _helperGallery = $ this-> helper('Ibnab \ Common \ Helper \ Data'); 现在,您可以使用每种技术(使用您的技术)在其中使用当前调用的产品:

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

当然完整的来源


3

magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()中提供了一项功能,该功能会将媒体库图像添加到您的产品集中。

只需将其用于您的收藏集,例如,

$collection->addMediaGalleryData();

您将可以使用以下方法获取媒体库图像

$_product->getMediaGalleryImages()

谢谢@JaiminSutariya,它非常有帮助。:)
Aditya Shah

1

您可以使用与Magento 1完全相同的方法:

$_product->getMediaGallery('images')

此外,Magento 2提供了一种新方法来获取媒体库作为数组:

$_product->getMediaGalleryEntries():

我也对getMediaGallery和getMediaGalleryEntries收到相同的通知错误注意:未定义的属性:Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia'Aug


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.