Bagaimana cara mendapatkan gambar dan URL produk di Magento 2?

16

Ini adalah pengamat saya:

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

Bagaimana saya bisa mendapatkan gambar produk dan URL produk dari item?

Ramkishan Suthar
sumber
Acara apa yang Anda tangkap?
Khoa TruongDinh
checkout_onepage_controller_success_action
Ramkishan Suthar

Jawaban:

23

Cara ini mungkin bukan cara terbaik untuk mendapatkan gambar produk.

Suntikkan \Magento\Catalog\Api\ProductRepositoryInterfaceFactorydi konstruktor kami.

protected $_productRepositoryFactory;

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

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

Kita bisa mendapatkan gambar:

$product = $this->_productRepositoryFactory->create()->getById($item->getProductId());
$product->getData('image');
$product->getData('thumbnail');
$product->getData('small_image');
Khoa TruongDinh
sumber
jawaban Anda benar tetapi apa yang harus saya lakukan jika saya memiliki lebih dari satu produk dalam keranjang, bagaimana saya dapat menampilkan lebih dari satu gambar produk
Ramkishan Suthar
ok saya mengerti @khoa. jika saya memiliki lebih dari satu gambar produksi. terima kasih banyak
Ramkishan Suthar
Ini tidak bekerja. Nilai yang dikembalikan adalah semacam string seperti ini "/w/s/wsh10-orange_main.jpg"
Hoang Trinh
2
@piavgh itu jalan menuju gambar:pub/media/catalog/product
Khoa TruongDinh
1
jadi bagaimana saya menggunakan /w/s/wsh10-orange_main.jpg di atribut <img src = "" /> sehingga saya dapat memuat gambar yang sebenarnya
Lachezar Raychev
18

Jika Anda ingin URL tampilan depan / cache dari suatu gambar untuk tampilan toko tertentu (seperti yang saya lakukan) ini berfungsi untuk saya:

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

Lalu, di mana pun Anda perlu mendapatkan URL frontend gambar:

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

Anda dapat memilih jenis gambar lain selain product_thumbnail_image: lihat magento/theme-frontend-luma/etc/view.xmldaftar gambar produk yang tersedia, atau buat gambar Anda sendiri dalam view.xmlfile.

thaddeusmt
sumber
1
WTF? itu hanya sakit: D
Lachezar Raychev
Baru saja mencoba solusi ini dan saya tidak mendapatkan kesalahan, meskipun URL yang dikembalikan tidak ada dan string kosong. Saya sudah mencoba dengan 'product_base_image', 'product_small_image' dan 'product_thumbnail_image', tidak ada yang berfungsi. Bisakah Anda memberi saran? Atau adakah cara efisien untuk melakukan ini menggunakan repositori produk? Karena saya sudah memuatnya di tempat lain di blok saya.
Joshua Flood
11

Jika Anda perlu mengembalikan URL produk, URL akan terlihat seperti ini:

//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;
Shaoqing Ma
sumber
6

Itulah yang saya lakukan. cukup efisien dan bersih:

1) Pertama, Anda perlu menyuntikkan kelas-kelas berikut:

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) Kemudian, buat metode getImageUrl dengan kode di bawah ini:

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

Catatan: Kode "appEmulation" hanya diperlukan ketika Anda melakukan panggilan ini dari admin atau untuk API . Jika tidak, Anda akan mendapatkan kesalahan di bawah ini (atau serupa):

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

3) Panggil getImageUrl lewat objek produk dan jenis gambar yang Anda inginkan (berdasarkan file view.xml Anda )

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

Untuk mendapatkan url gambar khusus, saya menggunakan kode ini. Jadi jika gambar tidak keluar itu akan memuat gambar tema default.

$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

}
Amit Singh
sumber