मैं Magento2 में वर्तमान उत्पाद कैसे प्राप्त करूं?


16

मैं Magento 2 में एक ब्लॉक में वर्तमान उत्पाद की विशेषताओं को पुनः प्राप्त करने की कोशिश कर रहा हूं। मैं एक उत्पाद प्राप्त कर सकता हूं, जैसे आईडी 1:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\ProductRepository')->getById(1);

मैं नहीं जानता कि वर्तमान उत्पाद की आईडी कैसे प्राप्त करें। मैं उसको कैसे करू?


यू समारोह कॉल कर सकते हैं getProduct()मेंMagento\Catalog\Block\Product\View
xanka

आप वर्तमान उत्पाद प्राप्त करना चाहते हैं
अमित बेरा

मैं उत्पाद पृष्ठ पर एक टैब में उत्पाद की विशिष्टताओं (विशेषताओं) को दिखाने के लिए एक मॉड्यूल जोड़ रहा हूं। राहिल पटेल से प्रति उत्तर $ ब्लॉक-> getProduct () के माध्यम से हल की गई समस्या।
टिम ट्रम्पेडाच

कृपया नीचे दिए गए लिंक देखें mageplaza.com/how-get-current-product-category-magento-2.html आप रजिस्ट्री का उपयोग करके वर्तमान उत्पाद प्राप्त कर सकते हैं। धन्यवाद !!
मुकेश प्रजापति 10

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
जय

जवाबों:


11

वर्तमान उत्पाद प्राप्त करने के लिए, अनुशंसित तरीकों में से एक है:

  1. ब्लॉक क्लास का विस्तार या उपयोग करें Magento\Catalog\Block\Product\View\AbstractView:।
  2. उत्पाद का उपयोग करें: $block->getProduct()अपनी phtml फ़ाइल में।

6
या आप इस $ कोशिश कर सकते हैं -> _ coreRegistry-> रजिस्ट्री ('उत्पाद'); भी!!
राहिल पटेल

# 2 बहुत अच्छा काम करता है। मुझे यकीन नहीं है कि मैं खुद को क्यों समझ नहीं पाया। आपकी सहायताके लिए धन्यवाद!
टिम ट्रम्पेडाच

क्या आप उत्पाद आईडी $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance () प्राप्त करने के लिए लोड () में त्रुटि प्राप्त करने में मेरी मदद कर सकते हैं; $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> लोड ($ productId);
सुशीवम

@ साचिस अधिक विवरण प्रदान करें ताकि मैं आपकी सहायता कर सकूं।
राहिल पटेल

2
AbstractView राजधानी ए मैगेंटो \ कैटलॉग \ ब्लॉक \ उत्पाद \ देखें \ के साथ शुरू होता है
पैट्रिक वैन बर्गन

29

यद्यपि अन्य उत्तर सही हैं, वे अनुशंसित / उचित समाधान नहीं हैं।

Magento 2 में ObjectManager का उपयोग पूरी तरह से निषिद्ध है। इसलिए कृपया इस समाधान पर भरोसा न करें, लेकिन इसके बजाय इसे प्राप्त करने के लिए उचित DI का उपयोग करें। Magento 2 में DI का उपयोग करने का तरीका जानने के लिए, यह संसाधन देखें: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

AbstractView का विस्तार करना आवश्यक नहीं है। यदि आप AbstractView में मूल फ़ंक्शन को देखते हैं, तो आप देख सकते हैं कि उत्पाद को लाने के लिए Magento रजिस्ट्री का उपयोग करता है। आपको ऐसा करने के लिए एक विशिष्ट वर्ग का विस्तार करने की आवश्यकता नहीं है, बस अपने निर्माता में Magento के फ्रेमवर्क \ रजिस्ट्री को इंजेक्ट करें और "उत्पाद" रजिस्ट्री आइटम का अनुरोध करें।

पूर्ण कोड उदाहरण:

<?php

// Example = Module namespace, Module = module name, rest of the namespace is just for example only, change this to whatever it is in your case.
namespace Example\Module\Block\Frontend\Catalog\Product\General;

use Magento\Catalog\Model\Product;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Framework\View\Element\Template;

class Information extends Template
{

    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var Product
     */
    private $product;

    public function __construct(Template\Context $context,
                                Registry $registry,
                                array $data)
    {
        $this->registry = $registry;

        parent::__construct($context, $data);
    }


    /**
     * @return Product
     */
    private function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');

            if (!$this->product->getId()) {
                throw new LocalizedException(__('Failed to initialize product'));
            }
        }

        return $this->product;
    }

    public function getProductName()
    {
        return $this->getProduct()->getName();
    }

}

Magento एसई में आपका स्वागत है। यदि आपके पास अन्य उत्तरों पर टिप्पणियां हैं, तो कृपया ऐसा करने के लिए "एक टिप्पणी जोड़ें" लिंक का उपयोग करें। कृपया ऐसा उत्तर लिखें जो इस पर जितना हो सके उतना खड़ा हो और अन्य उत्तरों पर निर्भर न हो। अन्य उत्तर हटाए जा सकते हैं या पृष्ठ के निचले क्षेत्रों में "गायब" हो सकते हैं।
7ochem

@ 7ochem माफी, यह कहा कि मुझे अभी तक टिप्पणी करने की अनुमति नहीं थी, इसलिए मैंने इसे इस तरह किया, मैं भविष्य में उचित टिप्पणियों का उपयोग करूंगा। :)
वेस्ले वेस्टजेन्स

मेरे पास पहले से ही मॉड्यूल है और क्या आप कृपया मेरे वर्तमान मॉड्यूल में अपने फ़ंक्शन का उपयोग करने के लिए मार्गदर्शन कर सकते हैं? और मैं कहूंगा, आप स्पष्टीकरण सबसे अच्छा है जिसे मुझे अपने मॉड्यूल में लागू करने की आवश्यकता है। धन्यवाद
शर्मा

हाय शर्मा, कोड को देखे बिना ठीक से कहना मुश्किल है, लेकिन विचार एक ही है: आपके निर्माता में (2 अंडरस्कोर वाले), एक नया तर्क जोड़ें और अपने ब्लॉक में Magento \ Framework \ रजिस्ट्री इंजेक्षन करें। फिर, इस तरह से उत्पाद प्राप्त करने के लिए रजिस्ट्री का उपयोग करें: $ this-> उत्पाद = $ this-> रजिस्ट्री-> रजिस्ट्री ('उत्पाद');
वेस्ले वेस्टजेंस

2
रजिस्ट्री को हटा दिया गया है और इसके बजाय @ राफेल-गलगामा-गोम्स की विधि का उपयोग किया जाना है।
क्रिस्टोफ फेरेबूफ

6

यदि आप Magento 2.1 या प्रमुख का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं helperक्योंकि पुरानी पद्धति को हटा दिया गया था।

...
use Magento\Catalog\Helper\Data;
...

public function __construct(
        Context $context,
        Data $helper,
        array $data = []
    ){
        $this->context = $context;
        $this->helper = $helper;
        $this->data = $data;
        parent::__construct($context, $data);
    }

...

public function getProduct(){
    if(is_null($this->_product)){
        $this->_product = $this->helper->getProduct();
    }
    return $this->_product;
}

0

@Wesley Vestjens समाधान ने मेरे लिए भी काम किया। बस पहुंच संशोधक पर ध्यान देना सुनिश्चित करें, क्योंकि निजी वह नहीं हो सकता जो आप getProduct()अपने टेम्पलेट में उपयोग कर रहे हैं । उपरोक्त उदाहरण में यह काम करता है क्योंकि getProductName()उपयोग करने के लिए सार्वजनिक विधि है।


यह आम तौर पर पूरे ऑब्जेक्ट को एक टेम्प्लेट में नहीं देने की सिफारिश की जाती है, लेकिन इसके बजाय उस डेटा को पास करें जिसके लिए इसकी आवश्यकता है और इससे अधिक कुछ नहीं। इसीलिए getProduct()निजी है और getProductName()सार्वजनिक है। नए Magento के संस्करणों में (2.2 / 2.3 और बाद के) इन तरीकों को भी पदावनत माना जाता है और इसके बजाय व्यू मॉडल का उपयोग किया जाना चाहिए।
वेस्ले वेस्टजेन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.