Magento 2 Ottieni tutte le immagini dei prodotti nella pagina dell'elenco dei prodotti


8

In Magento 1 l'ho sempre usato

$_product->getMediaGallery('images')

Ma nella fonte di Magento 2 vedo

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

Sta solo ottenendo la prima immagine del prodotto. Come posso ottenere la seconda o la terza immagine (non solo quella di base)?

La funzione GetMediaGallery non esiste?

Aggiornamento: $ _product-> getMediaGalleryImages () genera NULL in un var_dump

e

per getMediaGallery e getMediaGalleryEntries ottengo lo stesso errore di avviso:

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

Prova ad usare\Magento\Catalog\Model\Product::getMediaGalleryImages()
— Siarhey Uchukhlebau

Risposte:


9

Il caricamento della categoria è cambiato in 2.1, quindi questo può essere rilevante solo dalla 2.1 in poi:

La galleria di immagini viene aggiunta al prodotto tramite un'interfaccia di estensione definita tramite di.xml. Il risultato è che possiamo creare manualmente un'istanza della classe ReadHandler della galleria e passare un prodotto per caricare tutte le sue immagini della galleria.

Come al solito in Magento 2 il modo migliore per creare un'istanza di una classe è tramite il metodo __construct (), quindi ecco una classe di blocchi 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);
    }
}

Nel tuo modello, supponendo che tu abbia $ product caricato tramite una raccolta di prodotti, potresti chiamare:

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

Credo che non sia ancora possibile scoprire il "ruolo" dell'immagine (base, piccola, miniatura, campione) in questo modo.
— Patrick van Bergen,

Penso che tu abbia ragione, anche se l'ordine delle immagini restituite è prevedibile. L'ho usato per selezionare ruoli specifici, anche se questo è ovviamente non ottimale a causa della codifica di ipotesi che possono essere modificate nell'interfaccia di amministrazione!
— Robert Egginton,

5

Utilizzare il codice seguente per ottenere tutte le immagini della galleria nella pagina dell'elenco prodotti:

<?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
Questo funziona. Tuttavia, a parte il fatto che l'utilizzo diretto del gestore oggetti è un anti-pattern rispetto a DI, ciò richiederà il ricaricamento di ogni prodotto che è piuttosto costoso. No, non è il momento di menzionare la memorizzazione nella cache. Continuerò a cercare una soluzione meno costosa, ma grazie per averci dato qualcosa per cominciare.
— Robert Egginton,

Grazie ha funzionato!
— Amrit Pal Singh,

4

creare un aiuto per esempio:

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

chiama e usa nella tua lista.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); ora puoi usare con l'attuale prodotto chiamato all'interno per ciascuno (con la tua tecnica):

  <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 fonte completa ovviamente


3

C'è una funzione disponibile in magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()che aggiungerà le immagini della galleria multimediale alla tua raccolta di prodotti.

Usalo sulla tua collezione come,

$collection->addMediaGalleryData();

E sarai in grado di ottenere immagini della galleria multimediale utilizzando

$_product->getMediaGalleryImages()

Grazie @JaiminSutariya, è stato molto utile. :)
— Aditya Shah,

1

Puoi usare lo stesso metodo di Magento 1:

$_product->getMediaGallery('images')

Inoltre, Magento 2 fornisce un nuovo metodo per ottenere la galleria multimediale come un array:

$_product->getMediaGalleryEntries():

Ottengo lo stesso errore di avviso anche per getMediaGallery e getMediaGalleryEntries Avviso: proprietà non definita: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
— Xaiamedia

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

restituisce un array con le immagini della galleria


Questo ha funzionato bene in 2.3, grazie!
— Raphael Parent,

0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.