Magento 2 Holen Sie sich alle Produktbilder auf der Produktlistenseite

8

In Magento 1 habe ich immer verwendet

$_product->getMediaGallery('images')

Aber in der Quelle von Magento 2 sehe ich

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

Es wird nur das erste Produktbild angezeigt. Wie bekomme ich das zweite oder dritte Bild (nicht nur das Basisbild)?

GetMediaGallery-Funktion existiert nicht?

Update: $ _product-> getMediaGalleryImages () löst NULL in einem var_dump aus

und

Für getMediaGallery und getMediaGalleryEntries erhalte ich den gleichen Fehler:

Undefined property: Magento\Catalog\Model\Product\Interceptor::$getMediaGallery
Xaiamedia
quelle
Versuchen Sie zu verwenden\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Antworten:

9

Das Laden der Kategorie hat sich in 2.1 geändert, daher ist dies möglicherweise erst ab 2.1 relevant:

Die Bildergalerie wird dem Produkt über eine Erweiterungsschnittstelle hinzugefügt, die über di.xml definiert ist. Das Ergebnis ist, dass wir manuell eine Instanz der ReadHandler-Klasse der Galerie erstellen und ein Produkt übergeben können, um alle Galeriebilder zu laden.

Wie in Magento 2 üblich, können Sie eine Klasse am besten über die Methode __construct () instanziieren. Hier ist also eine Stub-Block-Klasse:

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

Angenommen, Sie haben $ product über eine Produktsammlung geladen, können Sie in Ihrer Vorlage Folgendes aufrufen:

$block->addGallery($product);
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
    ...
}
Robert Egginton
quelle
Ich glaube, es ist noch nicht möglich, die "Rolle" des Bildes (Basis, klein, Miniaturbild, Farbfeld) auf diese Weise herauszufinden.
Patrick van Bergen
Ich denke, Sie haben Recht, obwohl die Reihenfolge der zurückgegebenen Bilder vorhersehbar ist. Ich habe dies verwendet, um bestimmte Rollen auszuwählen, obwohl dies offensichtlich nicht optimal ist, da Annahmen codiert werden, die in der Administrationsoberfläche geändert werden können!
Robert Egginton
5

Verwenden Sie den folgenden Code, um alle Bilder der Galerie auf der Produktlistenseite abzurufen:

<?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 } ?>
Prashant Valanda
quelle
6
Das funktioniert. Abgesehen von der Tatsache, dass die direkte Verwendung des Objektmanagers ein Anti-Pattern in Bezug auf DI ist, erfordert dies jedoch das erneute Laden jedes Produkts, das ziemlich teuer ist. Nein, dies ist nicht der richtige Zeitpunkt, um das Caching zu erwähnen. Ich werde weiterhin nach einer günstigeren Lösung suchen, aber danke, dass Sie uns zunächst etwas gegeben haben.
Robert Egginton
Danke, es hat funktioniert!
Amrit Pal Singh
4

Helfer erstellen zum Beispiel:

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

Rufen Sie auf und verwenden Sie es in Ihrer list.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); Jetzt können Sie mit aktuell aufgerufenen Produkten für jedes (mit Ihrer Technik) verwenden:

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

die komplette Quelle natürlich

Ibnab
quelle
3

In Magento ist eine Funktion verfügbar Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData(), mit der Sie Ihrer Produktkollektion Bilder aus der Mediengalerie hinzufügen können.

Verwenden Sie es einfach auf Ihrer Sammlung wie,

$collection->addMediaGalleryData();

Und Sie können Mediengalerie-Bilder mit erhalten

$_product->getMediaGalleryImages()
Jaimin Sutariya
quelle
Danke @JaiminSutariya, es war sehr hilfreich. :)
Aditya Shah
1

Sie können genau die gleiche Methode wie Magento 1 verwenden:

$_product->getMediaGallery('images')

Außerdem bietet Magento 2 eine neue Methode, um die Mediengalerie als Array abzurufen:

$_product->getMediaGalleryEntries():
Raphael beim digitalen Pianismus
quelle
Ich erhalte den gleichen Benachrichtigungsfehler auch für getMediaGallery und getMediaGalleryEntries. Hinweis: Undefinierte Eigenschaft: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia
1
$product->getMediaGalleryImages()->getItems()

Gibt ein Array mit den Galeriebildern zurück

Javier S.
quelle
Das hat in 2.3 gut funktioniert, danke!
Raphael Parent
0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Sandeep Kunaparaju
quelle