Magento 2 Dapatkan semua gambar produk di halaman daftar produk


8

Di Magento 1 saya selalu menggunakan

$_product->getMediaGallery('images')

Tetapi dalam sumber dari Magento 2 saya melihat

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

Itu hanya mendapatkan gambar produk pertama. Bagaimana saya mendapatkan gambar kedua atau ketiga (tidak hanya gambar dasar)?

Fungsi GetMediaGallery tidak ada?

Pembaruan: $ _product-> getMediaGalleryImages () melempar NULL dalam var_dump

dan

untuk getMediaGallery dan getMediaGalleryEntries saya mendapatkan kesalahan pemberitahuan yang sama:

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

Coba gunakan\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Jawaban:


9

Pemuatan kategori telah berubah di 2.1, jadi ini mungkin hanya relevan dari 2.1 dan seterusnya:

Galeri gambar ditambahkan ke produk melalui antarmuka ekstensi yang ditentukan melalui di.xml. Hasilnya adalah bahwa kita dapat secara manual membuat instance dari kelas ReadHandler galeri dan melewatkan produk untuk memuat semua gambar galeri.

Seperti biasa di Magento 2 cara terbaik untuk membuat instance suatu kelas adalah melalui metode __construct (), jadi inilah kelas blok rintisan:

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

Dalam templat Anda, dengan asumsi Anda memiliki $ produk dimuat melalui koleksi produk, Anda akan dapat menelepon:

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

Masih belum mungkin untuk mengetahui "peran" dari gambar (dasar, kecil, thumbnail, carikan) dengan cara ini, saya percaya.
Patrick van Bergen

Saya pikir Anda benar, meskipun urutan gambar yang dikembalikan dapat diprediksi. Saya telah menggunakan ini untuk memilih peran tertentu, meskipun ini jelas suboptimal karena pengkodean asumsi yang dapat diubah di antarmuka admin!
Robert Egginton

5

Gunakan kode di bawah ini untuk mendapatkan semua gambar galeri di halaman daftar produk:

<?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
Ini berhasil. Namun, terlepas dari kenyataan bahwa menggunakan manajer objek secara langsung adalah anti-pola sehubungan dengan DI, ini akan memerlukan pemuatan ulang setiap produk yang agak mahal. Tidak, ini bukan waktu untuk menyebutkan caching. Saya akan terus mencari solusi yang lebih murah, tetapi terima kasih telah memberi kami sesuatu untuk memulai.
Robert Egginton

Terima kasih itu berhasil!
Amrit Pal Singh

4

buat helper misalnya:

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

panggil dan gunakan di dalam list.phtml Anda: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); sekarang Anda dapat menggunakan dengan produk yang disebut saat ini di dalam untuk masing-masing (dengan teknik Anda):

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

sumber lengkap tentunya


3

Ada fungsi yang tersedia di magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()yang akan menambahkan gambar galeri media ke koleksi produk Anda.

Cukup gunakan di koleksi Anda seperti,

$collection->addMediaGalleryData();

Dan Anda akan bisa mendapatkan gambar galeri media menggunakan

$_product->getMediaGalleryImages()

Terima kasih @JaiminSutariya, itu sangat membantu. :)
Aditya Shah

1

Anda dapat menggunakan metode yang sama persis seperti Magento 1:

$_product->getMediaGallery('images')

Juga, Magento 2 menyediakan metode baru untuk mendapatkan galeri media sebagai array:

$_product->getMediaGalleryEntries():

Saya mendapatkan kesalahan pemberitahuan yang sama untuk getMediaGallery dan getMediaGalleryEntries juga Pemberitahuan: Properti tidak terdefinisi: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia

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

mengembalikan array dengan gambar galeri


Ini bekerja dengan baik di 2.3, terima kasih!
Raphael Parent

0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.