Magento 2 में SKU द्वारा उत्पाद को कैसे लोड किया जाए


29

यह बहुत बुनियादी है, लेकिन मुझे स्टैकएक्सचेंज या गूगल पर काम करने का उदाहरण नहीं मिल सकता है। मैं एक सहायक या ब्लॉक से एक उत्पाद लोड करना चाहता हूं। मैंने पहले से ही कुछ चीजों की कोशिश की जैसे:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$product = $objectManager->create('\Magento\Catalog\Api\Data\ProductInterface');

$product->get('<SKU>');

$product->getName();

यह कुछ भी नहीं लौटाता है। मैंने किसी भी उपलब्ध मॉडल और एपीआई को लोड करने की कोशिश की, लेकिन SKU के साथ काम करने के लिए कुछ भी नहीं लगता है।

जवाबों:


56

Magento 2 सेवा अनुबंध के अनुसार सही तरीका, रिपॉजिटरी का उपयोग कर रहा है:

$product = $this->productRepositoryInterface->get($sku);

Magento\Catalog\Api\ProductRepositoryInterfaceअपने निर्माता में इसे पाने के लिए उपयोग करें ।

पूर्ण उदाहरण:

...
private $productRepository; 
...
public function __construct(
    ...
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
    ...
) {
    ...
    $this->productRepository = $productRepository;
    ...
}

public function loadMyProduct($sku)
{
    return $this->productRepository->get($sku);
}
...

ध्यान दें:

यदि उत्पाद मौजूद नहीं है, तो यह विधि एक NoSuchEntityExceptionत्रुटि को ट्रिगर करती है क्योंकि यह सबसे अच्छा Magento2 अभ्यास में होगा।

इसलिए, यदि आपको किसी तरह से संभालना है, तो इसे एक कोशिश / कैच ब्लॉक में लपेटें।


9
कोई उत्पाद नहीं मिलने पर यह विधि एक त्रुटि देती है। इसलिए यदि कोई उत्पाद मौजूद है, तो यह जाँचने के लिए @ fschmengler का समाधान बेहतर तरीका हो सकता है।
डेनिस वैन शेख

1
क्या आप pls अधिक विवरण जोड़ सकते हैं Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? मैं क्या करूँ? बहुत बहुत धन्यवाद
davideghz

मेरी अपडेट की गई पोस्ट देखें
फीनिक्स128_रिकार्डो

सेवा अनुबंधों का उपयोग करने का वास्तविक उचित Magento 2 तरीका अधिक जटिल है। रिपॉजिटरी-> मिलता है () अभी भी एक मॉडल कॉल है जिसका उपयोग नहीं किया जाना चाहिए। सही तरीका यह है कि SearchCriteriaBuilder के साथ रिपॉजिटरी-> getList () का उपयोग करें। आदेशों पर मेरा उत्तर देखें (बहुत ही समान विधि): magento.stackexchange.com/questions/140374/…
जाक

1
@JaccoAmersfoort, मैं पुष्टि करता हूं कि "गेट" सही तरीका है। आपके उदाहरण में यह सुझाया गया है क्योंकि "रिपॉजिटरी" के लिए रिपॉजिटरी को "ऑर्डर आईडी" की आवश्यकता होती है और वह उपयोगकर्ता "इंक्रीमेंट आईडी" की तलाश में था। उस मामले में एक गेटलिस्ट सबसे अच्छा विकल्प है, लेकिन यदि आप "प्राप्त" का उपयोग कर सकते हैं, तो आपको इसका उपयोग करना चाहिए।
फीनिक्स128_रीकॉर्डो

27

ऑब्जेक्ट प्रबंधक का सीधे उपयोग करने के बजाय, ProductFactory इंजेक्षन करें:

public function __construct(\Magento\Catalog\Model\ProductFactory $productFactory)
{
    $this->productFactory = $productFactory;
}

फिर इसे इस तरह उपयोग करें:

$product = $this->productFactory->create();
$product->loadByAttribute('sku', $sku);

या एक पूर्ण लोड करने के लिए (ऊपर एक संग्रह का उपयोग करके इसे लोड करता है):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));

7
वास्तव में जब यह अभी भी काम कर रहा है, तो इसका उपयोग करना load()और संग्रह करना "मैगेंटो 1" तरीका है, बेहतर विकल्प का उपयोग करें जैसा कि @RiccardoT द्वारा सुझाया गया है।
फाबियन शेंगलर

1
इसके अलावा, आपकी विधि एक उत्पाद मॉडल लौटाएगी, जबकि रिपॉजिटरी का उपयोग करने से आपको एक उत्पाद डेटा मॉडल ( Api/Data/Product) मिलेगा , जो एक उत्पाद मॉडल को डंबड-डाउन डीटीओ में परिवर्तित किया जाएगा। कुछ विचार करने के लिए, क्योंकि वे काफी अलग हैं।
नेवरमाइंड

@FabianSchmengler: $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()उत्पाद थंबनेल छवि प्रदर्शित करने के लिए उपयोग करने की कोशिश की गई , लेकिन यह काम नहीं कर रहा है।
स्लीमशेड्डीय

@FabianSchmengler हां रिपोजिटरी की सिफारिश @RiccardoT जवाब के रूप में अच्छी है। लेकिन अगर मैंने गलत स्क्यू में प्रवेश किया, तो यह पूरे ऑपरेशन को तोड़ देगा और अपवाद को फेंक देगा, इसलिए इस मामले में हमें निर्भर रहना होगाproductFactory
हिमांशु

@ हिमांशु अपवाद को पकड़ते हैं। और अगर आपको उस मामले में एक ताजा उत्पाद की आवश्यकता है, तो आप अभी भी इसे कारखाने का उपयोग करके बना सकते हैं
फैबियन शेंगलर

7

मुझे @ फीनिक्स128-रिककार्डॉट का उत्तर पसंद है, लेकिन एक अपवाद जोड़ देगा, बस अगर उत्पाद मौजूद नहीं है:

प्रयत्न {
    $ उत्पाद = $ यह-> productRepositoryInterface-> मिलता है ($ sku);
} पकड़ (\ Magento \ फ्रेमवर्क \ अपवाद \ NoSuchEntityException $ e) {}
    // यहां अपनी त्रुटि हैंडलिंग डालें
}

मैं इसे टिप्पणी के रूप में नहीं जोड़ पा रहा था (बहुत कम प्रतिष्ठा), क्षमा करें।


4

आप कोशिश कर सकते हैं कि

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');
$productObj = $productRepository->get('<SKU>');

echo $productObj->getId();

3

इसे इस्तेमाल करे:

/** @var \Magento\Catalog\Model\ProductFactory $productFactory */
$product = $productFactory->create();
$product->loadByAttribute('sku', 'my sku');

// $product->load($product->getId()); // may need to do this too,
// see \Magento\Framework\Api\AttributeValueFactory\AbstractModel::loadByAttribute

मुझे csv आयात के दौरान sku (csv का कॉलम) से product_id प्राप्त करने की आवश्यकता है और केवल product_id..How को कैसे प्राप्त करें?
सुशीवम

0

निर्भरता इंजेक्शन (DI) का उपयोग करना

यहां निर्भरता इंजेक्शन का उपयोग करके Magento 2 में उत्पाद आईडी और SKU द्वारा उत्पाद जानकारी प्राप्त करने के लिए उदाहरण कोड है।

इसमें, हमें अपने मॉड्यूल के ब्लॉक वर्ग के निर्माता में \ Magento \ कैटलॉग \ मॉडल \ ProductRepository वर्ग की वस्तु को इंजेक्ट करने और इसे व्यू (.phtml) फ़ाइल से एक्सेस करने की आवश्यकता हो सकती है।

नमूना फ़ाइल पथ: ऐप / कोड / YourCompanyName / YourModuleName / Block / YourCustomBlock.php

<?php
namespace YourCompanyName\YourModuleName\Block;

class YourCustomBlock extends \Magento\Framework\View\Element\Template
{ 
    protected $_productRepository;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context, 
        \Magento\Catalog\Model\ProductRepository $productRepository,
        array $data = []
    ) {
        $this->_productRepository = $productRepository;
        parent::__construct($context, $data);
    }

    public function getProductById($id) {
        return $this->_productRepository->getById($id);
    }

    public function getProductBySku($sku) {
        return $this->_productRepository->get($sku);
    }
}

अब, हम अपने विचार (.phtml) फ़ाइल में निम्न प्रकार से कार्यों का उपयोग कर सकते हैं।

// get product by id
$product = $block->getProductById(15);

// get product by sku
$product = $block->getProductBySku('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

ऑब्जेक्ट मैनेजर का उपयोग करना

यहां Magento 2 में ऑब्जेक्ट आईडी का उपयोग करके उत्पाद आईडी और SKU द्वारा उत्पाद जानकारी प्राप्त करने के लिए उदाहरण कोड है।

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');

// get product by product id 
$product = $productRepository->getById(15);

// get product by product sku 
$product = $productRepository->get('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

-3
<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');


$sku ='24-MB01';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productObject = $objectManager->get('Magento\Catalog\Model\Product');
$product = $productObject->loadByAttribute('sku', $sku);
echo $product->getName();

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