Magento 2製品リストページですべての製品画像を取得する


8

Magento 1では常に使用してきました

$_product->getMediaGallery('images')

しかし、Magento 2のソースには、

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

最初の製品画像のみを取得しています。2番目または3番目のイメージ(ベースイメージだけでなく)を取得するにはどうすればよいですか?

GetMediaGallery関数は存在しませんか?

更新: $ _product-> getMediaGalleryImages()がvar_dumpでNULLをスローします

そして

getMediaGalleryとgetMediaGalleryEntriesの場合、同じ通知エラーが発生します。

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

使用してみる\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

回答:


9

カテゴリの読み込みは2.1で変更されたため、これは2.1以降でのみ関連する可能性があります。

画像ギャラリーは、di.xmlで定義された拡張インターフェースを介して製品に追加されます。その結果、ギャラリーの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

返される画像の順序は予測可能ですが、あなたは正しいと思います。特定の役割を選択するためにこれを使用しましたが、管理インターフェイスで変更できる仮定をコーディングするため、これは明らかに最適ではありません!
Robert Egginton、2016年

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に関するアンチパターンであるという事実は別として、かなり高価なすべての製品のリロードが必要になります。いいえ、これはキャッシュについて言及する時ではありません。私はより安価なソリューションを探し続けますが、最初に何かを提供してくれてありがとう。
Robert Egginton、2016年

うまくいきました!
Amrit Pal Singh

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

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

ギャラリー画像の配列を返します


これは2.3でうまくいきました、ありがとう!
Raphael Parent

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.