Magento 2で各製品の在庫数を取得する方法


回答:


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
何らかの理由で、常にリターン「0」cronジョブでこれを実行している
Giel Berkers

8
ObjectManagerの代わりに直接DIを使用してください!
マティアスクライン

6
このようなコードを直接使用しないでください。代わりにコンストラクターDIを使用してください。
Jisse Reitsma

2
@ WackGetdevdocs.magento.com / guides / v2.3/ extension - dev - guide/ -「Magentoは、クラスの実際の依存関係を隠すため、コード内でのObjectManagerの直接使用を禁止しています。使用規則を参照してください。」規格には理由があるため、開発者はそれを尊重する必要があります。
Tisch

1
@Tisch ObjectManagerを直接使用するのが良い場合がたくさんあります。スタンドアロンスクリプト、製品フィード、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
私はそれをテストしましたが、これはこれを行う正しい方法です。オブジェクトマネージャの使用は不可です。
-circlesix

2
ベストプラクティスのために常に+1!
アキフ

2
これは、StockStateInterfaceではなく、すべてのケースでStockRegistryInterfaceが機能するため、受け入れられた回答でなければなりません。
アムリトパルシン

1
同意して、これは受け入れられた答えであるべきです。
Tisch

12

Magento 2で各製品の在庫数を取得する方法

コントローラーまたはブロック注入用\ Magento \ CatalogInventory \ Api \ StockStateInterface

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

次に、getStockQty関数を使用してqtyを取得します

 $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無効返す場合-これは良いことであるかどうか、私は決めることができない...
ドミニク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();

    }   
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.