如何在Magento 2中获取每种产品的库存数量


Answers:


46

list.phtml文件中添加以下代码

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

要么

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

1
出于某种原因,在cron作业中运行此命令始终会返回“ 0”
Giel Berkers,2016年

8
请直接使用DI代替ObjectManager!
马提亚斯·克莱恩

6
切勿直接使用此类代码。请改用构造函数DI。
Jisse Reitsma'6

2
@ WackGetdevdocs.magento.com / guides/v2.3/ extension - dev - guide /… -“ Magento禁止在您的代码中直接使用ObjectManager,因为它隐藏了类的真正依赖关系。请参见用法规则。” 有标准是有原因的,开发人员应该尊重这一点。
Tisch

1
@Tisch在很多情况下,直接使用ObjectManager是可以的。独立脚本,产品Feed,Cron作业等;一切都很好。在您自己的链接中,Magento指出:“在全局范围内,例如在集成测试中,您可以使用对象管理器。” 当现实变得更加细微差别时,不要只是盲目模仿鹦鹉的东西。
WackGet

14

就像提到的一些评论一样,您想使用依赖注入。不要使用对象管理器;换句话说,不要执行任何其他响应状态。以下技术可以在任何地方应用。对于“块”,将类设置为布局XML中的类,这样可以扩展原始类并注入正确的信息。

StockRegistryInterface接口插入需要访问的位置:

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

在某处使用它:

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

作为参考,Magento2在检索产品库存信息时会在整个目录中使用此确切接口。

请注意,方括号内的所有内容都需要修改。


3
应该将其标记为正确答案。尽管我尚未测试(但),但遵循约定。
大安范登伯格

3
我已经测试过了,这是正确的方法。使用对象管理器是不可以的。
circleix

2
总是+1最佳做法!
阿基夫

2
这应该是可以接受的答案,因为StockRegistryInterface可以处理每种情况,而不是StockStateInterface。
Amrit Pal Singh

1
同意,这应该是公认的答案。
蒂施

12

如何在Magento 2中获取每种产品的库存数量

用于控制器或块注入\ Magento \ CatalogInventory \ Api \ StockStateInterface

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

然后使用getStockQty函数获取数量

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

如果您想获取.phtml文件中的数量,请使用

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

即使我有数量30,也为我返回数量0
jafar pinjar

@jafarpinjar今天发现这也影响状态-如果禁用返回0-我不能确定这是否是好事...
Dominic Xigen

4

下面的脚本将有助于在magento2中获取产品库存数量,最小数量和库存详细信息。

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

1

如果您想$productobj从后端保存产品之后,那么可以轻松地使用catalog_product_save_after事件。

我假设您已经知道如何在中创建模块M2

现在,您需要为M2开发新模块

然后events.xml在下面的路径中创建此文件

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>

Productsaveafter.php在下面的路径中创建观察者文件

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

    }   
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.