Magento 2 Nhận tất cả hình ảnh sản phẩm trên trang danh sách sản phẩm


8

Trong Magento 1 tôi đã luôn sử dụng

$_product->getMediaGallery('images')

Nhưng trong nguồn từ Magento 2 tôi thấy

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

Nó chỉ nhận được hình ảnh sản phẩm đầu tiên. Làm thế nào để tôi có được hình ảnh thứ hai hoặc thứ ba (không chỉ là cơ sở)?

Chức năng GetMediaGallery không tồn tại?

Cập nhật: $ _product-> getMediaGalleryImages () ném NULL trong một var_dump

đối với getMediaGallery và getMediaGalleryEntries Tôi gặp lỗi thông báo tương tự:

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

Hãy thử sử dụng\Magento\Catalog\Model\Product::getMediaGalleryImages()
Siarhey Uchukhlebau

Câu trả lời:


9

Tải danh mục đã thay đổi trong 2.1, vì vậy điều này chỉ có thể có liên quan từ 2.1 trở đi:

Thư viện hình ảnh được thêm vào sản phẩm thông qua giao diện mở rộng được xác định qua di.xml. Kết quả cuối cùng là chúng ta có thể tự tạo một thể hiện của lớp ReadHandler và truyền một sản phẩm để tải tất cả các hình ảnh bộ sưu tập của nó.

Như thường lệ trong Magento 2, cách tốt nhất để khởi tạo một lớp là thông qua phương thức __construct (), vì vậy đây là một lớp khối còn sơ khai:

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

Trong mẫu của bạn, giả sử bạn có $ sản phẩm được tải thông qua bộ sưu tập sản phẩm, bạn sẽ có thể gọi:

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

Tôi vẫn chưa thể tìm ra "vai trò" của hình ảnh (cơ sở, nhỏ, hình thu nhỏ, mẫu màu) theo cách này, tôi tin.
Patrick van Bergen

Tôi nghĩ bạn đã đúng, mặc dù thứ tự của hình ảnh được trả về là có thể dự đoán được. Tôi đã sử dụng điều này để chọn ra các vai trò cụ thể, mặc dù điều này rõ ràng là không tối ưu do mã hóa trong các giả định có thể thay đổi trong giao diện quản trị viên!
Robert Egginton

5

Sử dụng mã dưới đây để có được tất cả các hình ảnh bộ sưu tập trên trang danh sách sản phẩm:

<?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
Điều này không hoạt động. Tuy nhiên, ngoài việc sử dụng trực tiếp trình quản lý đối tượng là một mô hình chống liên quan đến DI, điều này sẽ yêu cầu tải lại mọi sản phẩm khá tốn kém. Không, đây không phải là lúc để đề cập đến bộ nhớ đệm. Tôi sẽ tiếp tục tìm kiếm một giải pháp ít tốn kém hơn, nhưng cảm ơn vì đã cho chúng tôi một cái gì đó để bắt đầu.
Robert Egginton

Cảm ơn nó đã làm việc!
Amrit Pal Singh

4

tạo người trợ giúp chẳng hạn:

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

gọi và sử dụng trong danh sách của bạn.phtml: $ _helperGallery = $ this-> helper ('Ibnab \ Common \ Helper \ Data'); bây giờ bạn có thể sử dụng với sản phẩm được gọi hiện tại bên trong cho mỗi (với kỹ thuật của bạn):

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

nguồn hoàn chỉnh của khóa học


3

Có một chức năng có sẵn trong magento Magento\Catalog\Model\ResourceModel\Product\Collection::addMediaGalleryData()sẽ thêm hình ảnh bộ sưu tập phương tiện vào bộ sưu tập sản phẩm của bạn.

Chỉ cần sử dụng nó trên bộ sưu tập của bạn như,

$collection->addMediaGalleryData();

Và bạn sẽ có thể có được hình ảnh bộ sưu tập phương tiện bằng cách sử dụng

$_product->getMediaGalleryImages()

Cảm ơn bạn @JaiminSutariya, Nó rất hữu ích. :)
Aditya Shah

1

Bạn có thể sử dụng chính xác phương pháp tương tự như Magento 1:

$_product->getMediaGallery('images')

Ngoài ra, Magento 2 cung cấp một phương thức mới để lấy bộ sưu tập phương tiện dưới dạng một mảng:

$_product->getMediaGalleryEntries():

Tôi cũng gặp lỗi thông báo tương tự cho getMediaGallery và getMediaGalleryEntries Thông báo: Thuộc tính không xác định: Magento \ Catalog \ Model \ Product \ Interceptor :: $ getMediaGallery
Xaiamedia

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

trả về một mảng với các hình ảnh bộ sưu tập


Điều này đã làm việc tốt trong 2.3, cảm ơn bạn!
Phụ huynh Raphael

0
foreach ($product->getMediaGalleryImages() as $_image) {
      $array[] = $_image->getFile();
}
echo $array;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.