Come ottenere la quantità di magazzino di ciascun prodotto in Magento 2


Risposte:


46

Aggiungi il codice qui sotto nel tuo list.phtmlfile

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

O

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

1
Per qualche ragione, eseguirlo in un cron job restituisce sempre '0'
Giel Berkers,

8
Utilizzare direttamente DI anziché ObjectManager!
Matthias Kleine,

6
Non usare mai codice come questo direttamente. Utilizzare invece il costruttore DI.
Jisse Reitsma,

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento proibisce l'uso diretto dell'ObjectManager nel codice perché nasconde le dipendenze reali di una classe. Vedi regole di utilizzo." Gli standard sono lì per un motivo, gli sviluppatori dovrebbero rispettarlo.
Tisch

1
@Tisch Ci sono molti casi in cui l'utilizzo dell'ObjectManager va bene. Script autonomi, feed di prodotti, lavori cron, ecc .; tutto bene. Dal tuo link, Magento afferma: "In un ambito globale, come nei dispositivi dei test di integrazione, puoi usare il gestore oggetti". Non solo cose da pappagallo cieco quando la realtà è molto più sfumata.
Wack

14

Come alcuni commenti hanno già detto, si desidera utilizzare l'iniezione di dipendenza. Non utilizzare il gestore oggetti; in altre parole, non fare ciò che afferma una delle altre risposte. La seguente tecnica può essere applicata ovunque. Per Blocks, imposta la classe sulla tua classe nel layout XML, che estende l'originale e inietta le informazioni giuste.

Iniettare l' StockRegistryInterfaceinterfaccia a cui è necessario accedere:

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

Per usarlo da qualche parte:

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

Per riferimento, Magento2 utilizza questa interfaccia esatta in tutto il catalogo quando si tratta di recuperare informazioni sullo stock del prodotto.

Si noti che qualsiasi cosa tra parentesi quadre deve essere modificata.


3
Questo dovrebbe essere contrassegnato come la risposta corretta. Anche se non l'ho ancora testato (segue) segue le convenzioni.
Daan van den Bergh,

3
L'ho provato e questo è il modo corretto per farlo. l'utilizzo del gestore oggetti è un no-no.
cerchi il

2
Sempre +1 per le migliori pratiche!
Akif

2
Questa dovrebbe essere la risposta accettata poiché StockRegistryInterface funziona su tutti i casi, non su StockStateInterface.
Amrit Pal Singh,

1
D'accordo, questa dovrebbe essere la risposta accettata.
Tisch,

12

Come ottenere la quantità di magazzino di ciascun prodotto in Magento 2

per controller o blocco iniettare \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

e quindi usa la funzione getStockQty per ottenere qty

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

se si desidera ottenere quantità nel file .phtml, utilizzare

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

restituendo qty 0 per me anche se ho qty 30
jafar pinjar

@jafarpinjar ha scoperto oggi che questo influenza anche lo stato - se disabilitato restituisce 0 - Non riesco a decidere se questa è una cosa positiva o no ...
Dominic Xigen

4

Lo script seguente sarà utile per ottenere quantità di prodotto, quantità minima e dettagli di magazzino in magento2.

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

1

Se lo desideri $productobjdopo aver salvato il prodotto dal lato back-end in modo da poter utilizzare facilmente l' catalog_product_save_afterevento.

Presumo che tu sappia già come creare un modulo M2.

In questo momento devi sviluppare un nuovo modulo per M2

Quindi creare questo events.xmlfile nel percorso seguente

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>

E crea il tuo file osservatore Productsaveafter.phpnel percorso seguente

App \ code \ YOUR_NAMESPACE \ nomemodulo \ 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();

    }   
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.