Cómo obtener la cantidad de stock de cada producto en Magento 2

Respuestas:

46

Agregue el siguiente código en su list.phtmlarchivo

<?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()); 
?>
Abdul
fuente
1
Por alguna razón, ejecutar esto en un trabajo cron siempre devuelve '0'
Giel Berkers
8
¡Utilice DI en lugar de ObjectManager directamente!
Matthias Kleine
66
Nunca use un código como este directamente. Utilice el constructor DI en su lugar.
Jisse Reitsma
2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento prohíbe el uso directo del ObjectManager en su código porque oculta las dependencias reales de una clase. Consulte las reglas de uso". Los estándares están ahí por una razón, los desarrolladores deben respetar eso.
Tisch
1
@Tisch Hay muchos casos en los que usar ObjectManager directamente está bien. Scripts independientes, feeds de productos, trabajos cron, etc. todo muy bien. Desde su propio enlace, Magento afirma: "En un ámbito global, como en los accesorios de las pruebas de integración, puede usar el administrador de objetos". No se limite a ver cosas de loros cuando la realidad es mucho más matizada.
WackOb
14

Como algunos comentarios han mencionado, desea utilizar la inyección de dependencia. No use el administrador de objetos; en otras palabras, no haga lo que dice ninguna de las otras respuestas. La siguiente técnica se puede aplicar en cualquier lugar. Para los bloques, configure la clase a su clase en el diseño XML, que extiende el original, e inyecte la información correcta.

Inyecte la StockRegistryInterfaceinterfaz donde necesita acceso:

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

Para usarlo en alguna 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();

Como referencia, Magento2 utiliza esta interfaz exacta en todo el catálogo cuando se trata de recuperar información de stock del producto.

Tenga en cuenta que cualquier cosa entre corchetes debe modificarse.

danemacmillan
fuente
3
Esto debe marcarse como la respuesta correcta. Aunque no lo he probado (todavía) sigue las convenciones.
Daan van den Bergh el
3
Lo probé y esta es la forma correcta de hacerlo. usar el administrador de objetos es un no-no.
circlesix
2
¡Siempre +1 para mejores prácticas!
Akif
2
Esta debería ser la respuesta aceptada ya que StockRegistryInterface funciona en todos los casos, no en StockStateInterface.
Amrit Pal Singh
1
De acuerdo, esta debería ser la respuesta aceptada.
Tisch
12

Cómo obtener la cantidad de stock de cada producto en Magento 2

para controlador o inyección de bloque \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

y luego use la función getStockQty para obtener qty

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

si desea obtener la cantidad en el archivo .phtml, use

 <?php 
 $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
 echo $StockState->getStockQty($product->getId(), $product->getStore()->getWebsiteId());
?>
Surendra Kumar Ahir
fuente
devolviendo la cantidad 0 para mí a pesar de que tengo la cantidad 30
jafar pinjar
@jafarpinjar descubrió hoy que esto también tiene en cuenta el estado: si deshabilitado devuelve 0 - No puedo decidir si esto es bueno o no ...
Dominic Xigen
4

El siguiente script será útil para obtener la cantidad de stock del producto, la cantidad mínima y los detalles de stock en magento2.

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

Si lo desea $productobjdespués de guardar el producto desde el lado del backend para que pueda usar fácilmente el catalog_product_save_afterevento.

Supongo que ya sabes cómo crear un módulo M2.

En este momento debe desarrollar un nuevo módulo para M2

Luego cree este events.xmlarchivo en la ruta a continuación

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>

Y cree su archivo de observador Productsaveafter.phpen la siguiente ruta

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

    }   
}
Baharuni Asif
fuente