Magento 2'de ürün resmi ve URL'si nasıl alınır?


16

Bu benim gözlemcim:

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

Ürün resmini ve ürün URL'sini öğeden nasıl alabilirim?


Hangi olayı yakaladın?
Khoa TruongDinh

checkout_onepage_controller_success_action
Ramkishan Suthar

Yanıtlar:


23

Bu şekilde ürün resmi almanın en iyi yolu olmayabilir.

Yapımcımıza enjekte edin \Magento\Catalog\Api\ProductRepositoryInterfaceFactory.

protected $_productRepositoryFactory;

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

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

Görüntüyü alabiliriz:

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

Cevabınız doğru ama sepette birden fazla ürün varsa ne yapmalıyım nasıl birden fazla ürün resmi gösterebilirim
Ramkishan Suthar

tamam @ khoa anladım. birden fazla üretim imajım varsa. çok teşekkürler
Ramkishan Suthar

Bu çalışmıyor. Döndürülen değer şöyle bir dizedir "/w/s/wsh10-orange_main.jpg"
Hoang Trinh

2
@piavgh görüntü yolu:pub/media/catalog/product
Khoa TruongDinh

1
gerçek imgeyi yükleyebilmem için <img src = "" /> özniteliğinde /w/s/wsh10-orange_main.jpg dosyasını nasıl kullanırım
06'da Lachezar Raychev

18

Belirli bir mağaza görünümü için bir görüntünün yayınlanmış / önbellek ön uç URL'sini (benim yaptığım gibi) istiyorsanız bu benim için çalışıyor:

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

Ardından, resim ön uç URL'sini almanız gereken her yerde:

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

Bunun dışında başka görüntü türleri de seçebilirsiniz product_thumbnail_image: magento/theme-frontend-luma/etc/view.xmlkullanılabilir ürün görüntülerinin listesi için bkz view.xml.


1
O NE LAN? Bu sadece hasta: D
Lachezar Raychev

Sadece bu çözümü denedim ve döndürülen URL mevcut değil ve dize boş olsa da herhangi bir hata almıyorum. Hiçbiri işe yaramayan 'product_base_image', 'product_small_image' ve 'product_thumbnail_image' ile denedim. Tavsiye edebilir misiniz lütfen? Yoksa ürün havuzunu kullanarak bunu yapmanın etkili bir yolu var mı? Zaten bloğumun başka bir yerine yüklediğim için.
Joshua Flood

11

Bir ürün URL'sini iade etmeniz gerekiyorsa, aşağıdaki gibi görünmelidir:

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

Ben de öyle yaptım. oldukça verimli ve temiz:

1) İlk olarak, aşağıdaki sınıfları enjekte etmeniz gerekir:

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) Ardından, aşağıdaki kodla bir getImageUrl yöntemi oluşturun:

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

Not: "appEmulation" kodu yalnızca bu çağrıyı yönetici veya API için yaptığınızda gereklidir . Aksi takdirde, aşağıdaki hatayı (veya benzeri) alırsınız:

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

3) Ürün nesnesini ve istediğiniz görüntü türünü geçen getImageUrl'i arayın ( view.xml dosyanıza göre)

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

1

Özel görüntü URL'si elde etmek için bu kodu kullandım. Dolayısıyla, görüntü çıkmazsa varsayılan tema görüntüsünü yükleyecektir.

$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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.