Como obter a quantidade de estoque de cada produto no Magento 2

26

Como obter a quantidade de estoque de cada produto no list.phtml no Magento 2?

Dastan Nguyen
fonte

Respostas:

46

Adicione o código abaixo no seu list.phtmlarquivo

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

OU

<?php
   $stockItem = $product->getExtensionAttributes()->getStockItem();
   print_r($stockItem->getQty()); 
?>
Abdul
fonte
11
Por alguma razão, executando isso em um trabalho cron sempre retorna '0'
Giel Berkers
8
Por favor, use DI em vez do ObjectManager diretamente!
Matthias Kleine
6
Nunca use códigos como esse diretamente. Use o construtor DI.
Jisse Reitsma
2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "O Magento proíbe o uso direto do ObjectManager no seu código porque oculta as reais dependências de uma classe. Veja as regras de uso." Os padrões existem por um motivo, os desenvolvedores devem respeitar isso.
Tisch
11
@Tisch Existem muitos casos em que o uso direto do ObjectManager é bom. Scripts autônomos, feeds de produtos, trabalhos cron, etc .; tudo bem. No seu próprio link, o Magento declara: "Em um escopo global, como em equipamentos de testes de integração, você pode usar o gerenciador de objetos". Não basta cegar papagaios quando a realidade é muito mais sutil.
WackGet
14

Como alguns comentários mencionaram, você deseja usar a injeção de dependência. Não use o gerenciador de objetos; em outras palavras, não faça o que qualquer outra resposta afirma. A seguinte técnica pode ser aplicada em qualquer lugar. Para Blocos, defina a classe como sua classe no layout XML, que estende o original e injete as informações corretas.

Injete a StockRegistryInterfaceinterface na qual você precisa acessar:

/**
 * @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 usá-lo em algum lugar:

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

Para referência, o Magento2 usa essa interface exata em todo o catálogo quando se trata de recuperar informações de estoque do produto.

Observe que qualquer coisa entre colchetes precisa ser modificada.

danemacmillan
fonte
3
Isso deve ser marcado como a resposta correta. Embora eu ainda não o tenha testado, ele segue as convenções.
Daan van den Bergh
3
Eu testei, e esta é a maneira correta de fazer isso. usar o gerenciador de objetos é um não-não.
Círculos # 30/18
2
Sempre +1 para as melhores práticas!
Akif
2
Essa deve ser a resposta aceita, pois o StockRegistryInterface funciona em todos os casos, não no StockStateInterface.
Amrit Pal Singh
11
Concordado, esta deve ser a resposta aceita.
Tisch em
12

Como obter a quantidade de estoque de cada produto no Magento 2

para controlador ou bloco de injeção \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

e use a função getStockQty para obter o qty

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

Se você deseja obter uma quantidade no arquivo .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
fonte
retornando qty 0 para mim mesmo que eu tenho qty 30
Jafar pinjar
@jafarpinjar descobriu hoje que isso também fatora o status - se desativado retorna 0 - Não consigo decidir se isso é bom ou não ...
Dominic Xigen 07/07
4

O script abaixo ajudará a obter a quantidade do estoque do produto, a quantidade mínima e os detalhes do estoque no magento2.

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

Se desejar, $productobjdepois de salvar o produto do lado de back-end para que você possa usar facilmente o catalog_product_save_afterevento.

Estou assumindo que você já sabe como criar um módulo M2.

Agora você precisa desenvolver um novo módulo para M2

Em seguida, crie este events.xmlarquivo no caminho abaixo

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 crie seu arquivo observador Productsaveafter.phpno caminho abaixo

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
fonte