Comment obtenir la quantité de stock de chaque produit dans Magento 2

26

Comment obtenir la quantité de stock de chaque produit dans list.phtml dans Magento 2?

Dastan Nguyen
la source

Réponses:

46

Ajoutez le code ci-dessous dans votre list.phtmlfichier

<?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
la source
1
Pour une raison quelconque, exécuter cela dans un travail cron renvoie toujours '0'
Giel Berkers
8
Veuillez utiliser DI au lieu d'ObjectManager directement!
Matthias Kleine
6
N'utilisez jamais de code comme celui-ci directement. Utilisez plutôt le constructeur DI.
Jisse Reitsma
2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento interdit l'utilisation directe de l'ObjectManager dans votre code car il cache les vraies dépendances d'une classe. Voir les règles d'utilisation." Les normes sont là pour une raison, les développeurs doivent respecter cela.
Tisch
1
@Tisch Il existe de nombreux cas où l'utilisation directe d'ObjectManager est correcte. Scripts autonomes, flux de produits, tâches cron, etc .; Tout va bien. À partir de votre propre lien, Magento déclare: "Dans une portée globale, comme dans les montages de tests d'intégration, vous pouvez utiliser le gestionnaire d'objets." Ne vous contentez pas de trucs de perroquets aveugles lorsque la réalité est beaucoup plus nuancée.
WackGet
14

Comme certains commentaires l'ont mentionné, vous souhaitez utiliser l'injection de dépendance. N'utilisez pas le gestionnaire d'objets; en d'autres termes, ne faites pas ce que disent les autres réponses. La technique suivante peut être appliquée n'importe où. Pour les blocs, définissez la classe sur votre classe dans le format XML de mise en page, qui étend l'original et injectez les bonnes informations.

Injectez l' StockRegistryInterfaceinterface où vous avez besoin d'accéder:

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

Pour l'utiliser quelque part:

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

Pour référence, Magento2 utilise cette interface exacte dans tout le catalogue lorsqu'il s'agit de récupérer des informations sur les stocks de produits.

Notez que tout ce qui est entre crochets doit être modifié.

danemacmillan
la source
3
Cela devrait être marqué comme la bonne réponse. Bien que je ne l'ai pas (encore) testé, il suit les conventions.
Daan van den Bergh
3
Je l'ai testé et c'est la bonne façon de le faire. l'utilisation du gestionnaire d'objets est un non-non.
circlesix
2
Toujours +1 pour les meilleures pratiques!
Akif
2
Cela devrait être la réponse acceptée car StockRegistryInterface fonctionne sur chaque cas, pas StockStateInterface.
Amrit Pal Singh
1
D'accord, cela devrait être la réponse acceptée.
Tisch
12

Comment obtenir la quantité de stock de chaque produit dans Magento 2

pour contrôleur ou injection de bloc \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

puis utilisez la fonction getStockQty pour obtenir la quantité

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

si vous voulez obtenir la quantité dans le fichier .phtml, utilisez

 <?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
la source
retour qté 0 pour moi même si j'ai qté 30
jafar pinjar
@jafarpinjar a découvert aujourd'hui que cela tient également compte du statut - si désactivé retourne 0 - Je ne peux pas décider si c'est une bonne chose ou non ...
Dominic Xigen
4

Le script ci-dessous sera utile pour obtenir la quantité de stock du produit, la quantité minimale et les détails du stock dans magento2.

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

Si vous voulez après $productobjavoir enregistré le produit du côté backend afin que vous puissiez facilement utiliser l' catalog_product_save_afterévénement.

Je suppose que vous savez déjà comment créer un module dans M2.

Pour le moment, vous devez développer un nouveau module pour M2

Ensuite, créez ce events.xmlfichier dans le chemin ci-dessous

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>

Et créez votre fichier d'observateur Productsaveafter.phpdans le chemin ci-dessous

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
la source