Làm cách nào để lấy hình ảnh và URL sản phẩm trong Magento 2?


16

Đây là người quan sát của tôi:

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $orderIds = $observer->getEvent()->getOrderIds();
    $order = $this->_orderRepositoryInterface->get($orderIds[0]);
    $items =$order->getAllVisibleItems();
    $productQuantity = array();
    $productPrice = array();
    $productName = array();
    $productIds = array();
    foreach($items as $item) {
        $productIds[]= $item->getProductId();
        $productName[]= $item->getSku(); 
        $productPrice[] = $item->getPrice();
        $productQuantity[]= floor($item->getQtyOrdered());
    }
}

Làm cách nào tôi có thể lấy hình ảnh sản phẩm và URL sản phẩm từ mục này?


Sự kiện nào bạn bắt được?
Khoa TruongDinh

checkout_onepage_controll_success_action
Ramkishan Suthar

Câu trả lời:


23

Cách này có thể không phải là cách tốt nhất để có được hình ảnh sản phẩm.

Tiêm \Magento\Catalog\Api\ProductRepositoryInterfaceFactorytrong nhà xây dựng của chúng tôi.

protected $_productRepositoryFactory;

public function __construct(
        \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory
) {

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

Chúng ta có thể có được hình ảnh:

$product = $this->_productRepositoryFactory->create()->getById($item->getProductId());
$product->getData('image');
$product->getData('thumbnail');
$product->getData('small_image');

câu trả lời của bạn là đúng nhưng tôi sẽ làm gì nếu tôi có nhiều sản phẩm trong giỏ hàng, làm thế nào tôi có thể hiển thị nhiều hơn một hình ảnh sản phẩm
Ramkishan Suthar

ok tôi hiểu rồi @khoa. nếu tôi có nhiều hơn một hình ảnh sản xuất. cảm ơn rất nhiều
Ramkishan Suthar

Đây không phải là làm việc. Giá trị được trả về là một loại chuỗi như thế này "/w/s/wsh10-orange_main.jpg"
Hoàng Trinh

2
@piavgh đó là đường dẫn đến hình ảnh:pub/media/catalog/product
Khoa TruongDinh

1
vậy làm cách nào để sử dụng /w/s/wsh10-orange_main.jpg trong thuộc tính <img src = "" /> để tôi có thể tải hình ảnh thực tế
Lachezar Raychev

17

Nếu bạn muốn URL giao diện được xuất bản / bộ đệm của hình ảnh cho chế độ xem cửa hàng cụ thể (như tôi đã làm) thì điều này có hiệu quả với tôi:

/**
 * @var \Magento\Store\Model\App\Emulation
 */
protected $appEmulation;

/**
 * @var \Magento\Store\Model\StoreManagerInterface
 */
protected $storeManager;

/**
 * @var \Magento\Catalog\Api\ProductRepositoryInterfaceFactory
 */
protected $productRepositoryFactory;

/**
 * @var \Magento\Catalog\Helper\ImageFactory
 */
protected $imageHelperFactory;

/**
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 * @param \Magento\Store\Model\App\Emulation $appEmulation
 * @param \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory
 * @param \Magento\Catalog\Helper\ImageFactory $helperFactory
 */
public function __construct(
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Store\Model\App\Emulation $appEmulation,
    \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory,
    \Magento\Catalog\Helper\ImageFactory $imageHelperFactory
)
{
    $this->storeManager = $storeManager;
    $this->appEmulation = $appEmulation;
    $this->productRepositoryFactory = $productRepositoryFactory;
    $this->imageHelperFactory = $imageHelperFactory;
}

Sau đó, bất cứ nơi nào bạn cần để có được URL giao diện hình ảnh:

$sku = "my-sku";
// get the store ID from somewhere (maybe a specific store?)
$storeId = $this->storeManager->getStore()->getId();
// emulate the frontend environment
$this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
// load the product however you want
$product = $this->productRepositoryFactory->create()->get($sku);
// now the image helper will get the correct URL with the frontend environment emulated
$imageUrl = $this->imageHelperFactory->create()
  ->init($product, 'product_thumbnail_image')->getUrl();
// end emulation
$this->appEmulation->stopEnvironmentEmulation();

Bạn có thể chọn các loại hình ảnh khác bên cạnh product_thumbnail_image: xem magento/theme-frontend-luma/etc/view.xmldanh sách các hình ảnh sản phẩm có sẵn hoặc tạo hình ảnh của riêng bạn trongview.xml tệp.


1
WTF? đó chỉ là bệnh: D
Lachezar Raychev

Chỉ cần thử giải pháp này và tôi không nhận được bất kỳ lỗi nào, mặc dù URL trả về không tồn tại và chuỗi trống. Tôi đã thử với 'sản phẩm_base_image', 'sản phẩm_small_image' và 'sản phẩm_thumbnail_image', không có sản phẩm nào hoạt động. Bạn có thể tư vấn xin vui lòng? Hoặc có một cách hiệu quả để làm điều này bằng cách sử dụng kho sản phẩm? Như tôi đã tải nó ở nơi khác trong khối của tôi.
Joshua Lũ

11

Nếu bạn cần trả về một URL sản phẩm, nó sẽ giống như thế này:

//todo get product object $product 

$objectManager =\Magento\Framework\App\ObjectManager::getInstance();
$helperImport = $objectManager->get('\Magento\Catalog\Helper\Image');

$imageUrl = $helperImport->init($product, 'product_page_image_small')
                ->setImageFile($product->getSmallImage()) // image,small_image,thumbnail
                ->resize(380)
                ->getUrl();
echo $imageUrl;

6

Đó là cách tôi đã làm. Nó khá hiệu quả và sạch sẽ:

1) Trước tiên, bạn cần tiêm các lớp sau:

protected $_storeManager;
protected $_appEmulation;
protected $_blockFactory;

public function __construct(
    ...
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\View\Element\BlockFactory $blockFactory,
    \Magento\Store\Model\App\Emulation $appEmulation)
{
    $this->_storeManager = $storeManager;
    $this->_blockFactory = $blockFactory;
    $this->_appEmulation = $appEmulation;
}

2) Sau đó, tạo phương thức getImageUrl với mã dưới đây:

protected function getImageUrl($product, string $imageType = '')
{
    $storeId = $this->_storeManager->getStore()->getId();

    $this->_appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);

    $imageBlock =  $this->_blockFactory->createBlock('Magento\Catalog\Block\Product\ListProduct');
    $productImage = $imageBlock->getImage($product, $imageType);
    $imageUrl = $productImage->getImageUrl();

    $this->_appEmulation->stopEnvironmentEmulation();

    return $imageUrl;
}

Lưu ý: Mã "appEmulation" chỉ cần thiết khi bạn thực hiện cuộc gọi này từ quản trị viên hoặc cho API . Nếu không, bạn sẽ nhận được lỗi bên dưới (hoặc tương tự):

Unable to resolve the source file for 'webapi_rest/_view/en_AU/Magento_Catalog/images/product/placeholder/.jpg'

3) Gọi getImageUrl truyền đối tượng sản phẩm và loại hình ảnh bạn muốn (dựa trên tệp view.xml của bạn )

...
$smallImage = $this->getImageUrl($productObject, 'product_page_image_small');
...

1

Để sắp xếp url hình ảnh tùy chỉnh, tôi đã sử dụng mã này. Vì vậy, nếu hình ảnh không thoát ra, nó sẽ tải hình ảnh chủ đề mặc định.

$product = $block->getProduct();

$productImageAttr = $product->getCustomAttribute('product_banner_image');

if ($productImageAttr && $productImageAttr->getValue() != 'no_selection') {

    $productImage = $this->helper('Magento\Catalog\Helper\Image')
    ->init($product, 'product_banner_image')
    ->setImageFile($productImageAttr->getValue());

    $imageUrl = $productImage->getUrl();

} else {

    $imageUrl = $this->getViewFileUrl('images/cat-img1.jpg'); // Theme/web/images

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