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.