Magento 2 में उत्पाद छवि और URL कैसे प्राप्त करें?


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 कैसे प्राप्त कर सकता हूं?


आपने किस घटना को पकड़ा?
खोआ TruongDinh

checkout_onepage_controller_success_action
रामकिशन सुथार

जवाबों:


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

आपका जवाब सही है, लेकिन मैं क्या मैं कैसे एक से अधिक उत्पाद छवि दिखा सकते हैं अगर मैं गाड़ी में एक से अधिक उत्पाद है shoild
रामकिशन सुथार

ठीक है मैं इसे @khoa मिला। अगर मैं एक से अधिक उत्पादन छवि है। बहुत बहुत धन्यवाद
रामकिशन सुथार

ये काम नहीं कर रहा है। लौटाया गया मान किसी प्रकार का स्ट्रिंग है जैसे "/w/s/wsh10-orange_main.jpg"
Hoang Trinh

2
@ पियावघ यह छवि का मार्ग है:pub/media/catalog/product
खोआ ट्रूंगडिनह

1
इसलिए मैं <img src = "" /> विशेषता में /w/s/wsh10-orange_main.jpg का उपयोग कैसे कर सकता हूं ताकि मैं वास्तविक छवि को लोड कर
सकूं

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' के साथ कोशिश की है, जिनमें से कोई भी काम नहीं है। क्या आप कृपया सलाह दे सकते हैं? या उत्पाद रिपॉजिटरी का उपयोग करने के लिए एक कुशल तरीका है? जैसा कि मैं पहले से ही अपने ब्लॉक में कहीं और लोड कर रहा हूं।
जोशुआ फ्लड

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

कस्टम छवि यूआरएल पाने के लिए मैंने इस कोड का उपयोग किया। इसलिए यदि छवि बाहर नहीं जाती है तो यह डिफ़ॉल्ट थीम छवि को लोड कर देगा।

$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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.