Magento 2 में प्रत्येक उत्पाद की स्टॉक मात्रा कैसे प्राप्त करें


जवाबों:


46

अपनी list.phtmlफ़ाइल में bellow कोड जोड़ें

<?php 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
    echo $StockState->getStockQty($product->getId(), $product->getStore()->getWebsiteId());
?>

या

<?php
   $stockItem = $product->getExtensionAttributes()->getStockItem();
   print_r($stockItem->getQty()); 
?>

1
किसी कारण से, क्रोन की नौकरी में इसे चलाने से हमेशा '0' की वापसी होती है
Giel Berkers

8
सीधे ObjectManager के बजाय DI का उपयोग करें!
मथायस क्लेन

6
कभी भी सीधे इस तरह के कोड का उपयोग न करें। इसके बजाय कंस्ट्रक्टर डीआई का उपयोग करें।
जीससे रीत्समा

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento आपके कोड में ObjectManager के प्रत्यक्ष उपयोग को प्रतिबंधित करता है क्योंकि यह एक वर्ग की वास्तविक निर्भरता को छुपाता है। उपयोग नियम देखें।" एक कारण के लिए मानक हैं, डेवलपर्स को इसका सम्मान करना चाहिए।
टिशू

1
@ वहाँ बहुत सारे मामले हैं जहाँ ObjectManager का उपयोग करना सीधे ठीक है। स्टैंडअलोन स्क्रिप्ट, उत्पाद फ़ीड, क्रॉन जॉब्स, आदि; सब ठीक। अपने स्वयं के लिंक से, मैगेंटो बताता है: "एक वैश्विक दायरे में, एकीकरण परीक्षणों के जुड़नार की तरह, आप ऑब्जेक्ट मैनेजर का उपयोग कर सकते हैं।" वास्तविकता को और अधिक बारीक करने पर सिर्फ तोते के सामान को न देखें।
वाक्गेट

14

जैसे कुछ टिप्पणियों का उल्लेख किया गया है, आप निर्भरता इंजेक्शन का उपयोग करना चाहते हैं। ऑब्जेक्ट मैनेजर का उपयोग न करें; दूसरे शब्दों में, ऐसा न करें जो अन्य प्रतिक्रियाओं में से कोई भी हो। निम्नलिखित तकनीक को कहीं भी लागू किया जा सकता है। ब्लॉक के लिए, अपनी कक्षा को लेआउट एक्सएमएल में कक्षा में सेट करें, जो मूल का विस्तार करता है, और सही जानकारी को इंजेक्ट करता है।

उस StockRegistryInterfaceइंटरफ़ेस को इंजेक्ट करें जहाँ आपको पहुँच की आवश्यकता है:

/**
 * @var \Magento\CatalogInventory\Api\StockRegistryInterface
 */
private $stockRegistry;

/**
 * Constructor for DI.
 *
 * @param \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry
 */
public function __construct(
    \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry
) {
    $this->stockRegistry = $stockRegistry;
}

/**
 * Get the product stock data and methods.
 *
 * @return \Magento\CatalogInventory\Api\StockRegistryInterface
 */
public function getStockRegistry()
{
    return $this->stockRegistry;
}

इसे कहीं उपयोग करने के लिए:

/** @var \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry */
$stockRegistry = [$this|$block]->getStockRegistry();

/** @var \Magento\Catalog\Model\Product $product */
$product = [Grab Product instance however you want. This is up to you.]

// Get stock data for given product.
$productStock = $stockRegistry->getStockItem($product->getId());

// Get quantity of product.
$productQty = $productStock->getQty();

संदर्भ के लिए, Magento2 कैटलॉग पर इस सटीक इंटरफ़ेस का उपयोग करता है, जब यह उत्पाद स्टॉक जानकारी पुनर्प्राप्त करने की बात आती है।

ध्यान दें कि वर्ग कोष्ठक के भीतर कुछ भी संशोधित करने की आवश्यकता है।


3
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। हालाँकि मैंने इसका परीक्षण नहीं किया है (फिर भी) यह सम्मेलनों का अनुसरण करता है।
डैन वैन डेन बर्ग

3
मैंने इसका परीक्षण किया है, और यह ऐसा करने का सही तरीका है। ऑब्जेक्ट मैनेजर का उपयोग करना एक नहीं-नहीं है।
सर्किल

2
सर्वोत्तम तरीकों के लिए Allways +1!
अक़ीफ़

2
यह स्वीकृत उत्तर होना चाहिए क्योंकि StockRegistryInterface हर मामले पर काम करता है, न कि StockStateInterface।
अमृत ​​पाल सिंह

1
सहमत, यह स्वीकृत उत्तर होना चाहिए।
टिस्क्यू

12

Magento 2 में प्रत्येक उत्पाद की स्टॉक मात्रा कैसे प्राप्त करें

नियंत्रक या ब्लॉक इंजेक्षन के लिए \ Magento \ CatalogInventory \ Api \ StockStateInterface

 public function __construct(
    \Magento\CatalogInventory\Api\StockStateInterface $stockItem
   )
  {
    $this->stockItem = $stockItem;
  }

और फिर प्राप्त करने के लिए getStockQty फ़ंक्शन का उपयोग करें

 $this->stockItem->getStockQty($product->getId(), $product->getStore()->getWebsiteId());

यदि आप .phtml फ़ाइल में मात्रा प्राप्त करना चाहते हैं तो उपयोग करें

 <?php 
 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
 echo $StockState->getStockQty($product->getId(), $product->getStore()->getWebsiteId());
?>

मेरे लिए वापसी मात्रा 0 भले ही मेरे पास मात्रा 30 हो
jafar pinjar

@jafarpinjar को आज पता चला कि यह भी कारक स्थिति है - अगर विकलांग रिटर्न 0 - मैं यह तय नहीं कर सकता कि यह अच्छी बात है या नहीं ...
डोमिनिक जिगन

4

नीचे दी गई स्क्रिप्ट magento2 में उत्पाद स्टॉक मात्रा, न्यूनतम मात्रा और स्टॉक विवरण प्राप्त करने में सहायक होगी।

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productStockObj = $objectManager->get('Magento\CatalogInventory\Api\StockRegistryInterface')->getStockItem($productId);
print_r($productStockObj->getData());

1

यदि आप $productobjबैकएंड की ओर से उत्पाद को बचाने के बाद चाहते हैं तो आप आसानी से catalog_product_save_afterईवेंट का उपयोग कर सकते हैं ।

मैं मान रहा हूं कि आप पहले से ही जानते हैं कि कैसे एक मॉड्यूल बनाना है M2

अभी आपको M2 के लिए नए मॉड्यूल विकसित करने की आवश्यकता है

फिर इस events.xmlफाइल को नीचे के पथ में बनाएँ

app\code\YOUR_NAMESPACE\YOURMODULE\etc\adminhtml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="catalog_product_save_after">
        <observer name="test_name" instance="YOUR_NAMESPACE\YOUR_MODULENAME\Observer\Productsaveafter" />
    </event>
</config>

और Productsaveafter.phpनीचे की पाथ में अपनी ऑब्जर्वर फाइल बनाएं

एप्लिकेशन \ कोड \ YOUR_NAMESPACE \ YOURMODULE \ ऑब्जर्वर \

<?php

namespace YOURNAMESPACE\YOURMODULENAME\Observer;

use Magento\Framework\Event\ObserverInterface;

class Productsaveafter implements ObserverInterface
{    
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $observer->getEvent()->getProduct();
        $id = $product->getId(); //Get Product Id

        //Get Quantity
        $stockItem = $product->getExtensionAttributes()->getStockItem();
        $stockData = $stockItem->getQty();
        // Get new Qty
        $_vendor_qty = $product->getVendorQty();
        $_on_hand_qty = $product->getOnHandQty();
        $totalQty = $_vendor_qty+$_on_hand_qty; //Add New Qty


        $stockItem->setQty($totalQty); //Set New Qty to Main Qty
        $stockItem->save();

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