วิธีรับภาพผลิตภัณฑ์และ URL ใน Magento 2


16

นี่คือผู้สังเกตการณ์ของฉัน:

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

ฉันจะรับภาพผลิตภัณฑ์และ URL ผลิตภัณฑ์จากรายการได้อย่างไร


คุณจับเหตุการณ์อะไร
Khoa TruongDinh

checkout_onepage_controller_success_action
Ramkishan Suthar

คำตอบ:


23

วิธีนี้อาจไม่ใช่วิธีที่ดีที่สุดในการรับภาพผลิตภัณฑ์

ฉีด\Magento\Catalog\Api\ProductRepositoryInterfaceFactoryเข้าไปในคอนสตรัคเตอร์ของเรา

protected $_productRepositoryFactory;

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

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

เราสามารถรับภาพ:

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

คำตอบของคุณถูกต้อง แต่ฉันควรทำอย่างไรถ้าฉันมีสินค้ามากกว่าหนึ่งรายการในตะกร้าฉันจะแสดงภาพผลิตภัณฑ์ได้มากกว่าหนึ่งภาพ
Ramkishan Suthar

ตกลงฉันได้รับมัน @ Khoa ถ้าฉันมีภาพมากกว่าหนึ่งภาพ ขอบคุณมาก
Ramkishan Suthar

มันไม่ทำงาน ค่าที่ส่งคืนเป็นสตริงประเภทนี้ "/w/s/wsh10-orange_main.jpg"
Hoang Trinh

2
@piavgh เป็นเส้นทางสู่ภาพ:pub/media/catalog/product
Khoa TruongDinh

1
ดังนั้นฉันจะใช้ /w/s/wsh10-orange_main.jpg ใน <img src = "" /> คุณลักษณะอย่างไรดังนั้นฉันสามารถโหลดภาพที่แท้จริง
Lachezar Raychev

18

หากคุณต้องการ URL ส่วนหน้าที่เผยแพร่ / แคชของภาพสำหรับมุมมองร้านค้าที่เฉพาะเจาะจง (เหมือนที่ฉันทำ) สิ่งนี้ใช้ได้สำหรับฉัน:

/**
 * @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;
}

จากนั้นทุกที่ที่คุณต้องการรับ URL ของส่วนหน้า:

$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();

คุณสามารถเลือกประเภทภาพอื่น ๆ นอกเหนือจากproduct_thumbnail_image: ดูmagento/theme-frontend-luma/etc/view.xmlรายการภาพผลิตภัณฑ์ที่มีอยู่หรือสร้างภาพของคุณเองในview.xmlไฟล์


1
WTF? นั่นเป็นเพียงแค่ป่วย: D
Lachezar Raychev

เพิ่งลองวิธีแก้ปัญหานี้และฉันไม่ได้รับข้อผิดพลาดใด ๆ ถึงแม้ว่า URL ที่ส่งคืนไม่มีอยู่และสตริงนั้นว่างเปล่า ฉันได้ลองกับ 'product_base_image', 'product_small_image' และ 'product_thumbnail_image' ซึ่งไม่ได้ผล คุณช่วยแนะนำได้ไหม หรือมีวิธีที่มีประสิทธิภาพในการทำเช่นนี้โดยใช้ที่เก็บผลิตภัณฑ์? ในขณะที่ฉันกำลังโหลดที่อื่นในบล็อกของฉัน
Joshua Flood

11

หากคุณต้องการส่งคืน URL ผลิตภัณฑ์ควรมีลักษณะดังนี้:

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

นั่นคือวิธีที่ฉันทำ มันค่อนข้างมีประสิทธิภาพและสะอาด:

1) ก่อนอื่นคุณต้องฉีดคลาสต่อไปนี้:

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) จากนั้นสร้างเมธอด getImageUrl ด้วยโค้ดด้านล่าง:

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

หมายเหตุ: "appEmulation รหัส" เป็นสิ่งที่จำเป็นเฉพาะเมื่อคุณทำให้สายนี้จากผู้ดูแลระบบหรือสำหรับAPI มิฉะนั้นคุณจะได้รับข้อผิดพลาดด้านล่าง (หรือคล้ายกัน):

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

3) เรียกใช้ getImageUrl ผ่านวัตถุผลิตภัณฑ์และประเภทของภาพที่คุณต้องการ (ขึ้นอยู่กับไฟล์view.xmlของคุณ)

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

1

สำหรับการดึง URL รูปภาพที่กำหนดเองฉันใช้รหัสนี้ ดังนั้นหากภาพไม่ออกก็จะโหลดภาพชุดรูปแบบเริ่มต้น

$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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.