So erhalten Sie die Lagerbestandsmenge der einzelnen Produkte in Magento 2


Antworten:


46

Fügen Sie folgenden Code in Ihre list.phtmlDatei ein

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

ODER

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

1
Aus irgendeinem Grund gibt die Ausführung in einem Cron-Job immer '0' zurück
Giel Berkers,

8
Bitte verwenden Sie DI anstelle von ObjectManager direkt!
Matthias Kleine

6
Verwenden Sie niemals Code wie diesen direkt. Verwenden Sie stattdessen Konstruktor DI.
Jisse Reitsma,

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento verbietet die direkte Verwendung von ObjectManager in Ihrem Code, da die tatsächlichen Abhängigkeiten einer Klasse ausgeblendet werden . Siehe Verwendungsregeln." Standards gibt es aus einem Grund, Entwickler sollten dies respektieren.
Tisch

1
@Tisch Es gibt viele Fälle, in denen die direkte Verwendung von ObjectManager in Ordnung ist. Standalone-Skripte, Produkt-Feeds, Cron-Jobs usw .; alles gut. Über Ihren eigenen Link erklärt Magento: "In einem globalen Bereich, wie in Fixtures von Integrationstests, können Sie den Objektmanager verwenden." Nicht nur blindes Papageienmaterial, wenn die Realität viel nuancierter ist.
WackGet

14

Wie in einigen Kommentaren bereits erwähnt, möchten Sie die Abhängigkeitsinjektion verwenden. Verwenden Sie nicht den Objektmanager. Mit anderen Worten, tun Sie nicht, was in den anderen Antworten angegeben ist. Die folgende Technik kann überall angewendet werden. Setzen Sie für Blöcke die Klasse in Layout-XML auf Ihre Klasse, wodurch das Original erweitert wird, und fügen Sie die richtigen Informationen ein.

Fügen Sie die StockRegistryInterfaceSchnittstelle ein, auf die Sie Zugriff benötigen:

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

Um es irgendwo zu benutzen:

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

Als Referenz verwendet Magento2 genau diese Schnittstelle im gesamten Katalog, um Produktinformationen abzurufen.

Beachten Sie, dass alles in eckigen Klammern geändert werden muss.


3
Dies sollte als die richtige Antwort markiert werden. Obwohl ich es (noch) nicht getestet habe, folgt es Konventionen.
Daan van den Bergh

3
Ich habe es getestet, und dies ist der richtige Weg, um dies zu tun. Die Verwendung des Objektmanagers ist ein Nein-Nein.
Kreiseix

2
Immer +1 für Best Practices!
Akif

2
Dies sollte die akzeptierte Antwort sein, da StockRegistryInterface in jedem Fall funktioniert, nicht das StockStateInterface.
Amrit Pal Singh

1
Einverstanden, sollte dies die akzeptierte Antwort sein.
Tisch

12

So erhalten Sie die Lagerbestandsmenge der einzelnen Produkte in Magento 2

Für Controller oder Block Inject \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

Verwenden Sie dann die Funktion getStockQty, um die Menge abzurufen

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

Wenn Sie die Menge in einer .phtml-Datei erhalten möchten, verwenden Sie

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

Rückgabe der Menge 0 für mich, obwohl ich Menge 30 habe
Jafar Pinjar

@jafarpinjar fand heute heraus, dass dies auch den Status beeinflusst - wenn disabled 0 zurückgibt - kann ich nicht entscheiden, ob dies eine gute Sache ist oder nicht ...
Dominic Xigen

4

Das folgende Skript hilft Ihnen dabei, die Lagermenge, die Mindestmenge und die Lagerdetails in magento2 zu ermitteln.

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

1

Wenn Sie $productobjdas Produkt nach dem Speichern von der Back-End-Seite, so können Sie einfach catalog_product_save_afterEvent verwenden.

Ich gehe davon aus, dass Sie bereits wissen, wie man ein Modul erstellt M2.

Im Moment müssen Sie ein neues Modul für M2 entwickeln

Dann erstellen Sie diese events.xmlDatei im folgenden Pfad

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>

Und erstellen Sie Ihre Beobachterdatei Productsaveafter.phpunter folgendem Pfad

app \ code \ YOUR_NAMESPACE \ YOURMODULE \ Observer \

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

    }   
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.