Cara mendapatkan jumlah stok setiap produk di Magento 2

26

Bagaimana cara mendapatkan jumlah stok setiap produk di list.phtml di Magento 2?

Dastan Nguyen
sumber

Jawaban:

46

Tambahkan kode di bawah ini di list.phtml file

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

ATAU

<?php
   $stockItem = $product->getExtensionAttributes()->getStockItem();
   print_r($stockItem->getQty()); 
?>
Abdul
sumber
1
Untuk beberapa alasan, menjalankan ini dalam pekerjaan cron selalu mengembalikan '0'
Giel Berkers
8
Silakan gunakan DI alih-alih ObjectManager secara langsung!
Matthias Kleine
6
Jangan pernah menggunakan kode seperti ini secara langsung. Gunakan konstruktor DI sebagai gantinya.
Jisse Reitsma
2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento melarang penggunaan langsung dari ObjectManager dalam kode Anda karena ia menyembunyikan dependensi nyata suatu kelas. Lihat aturan penggunaan." Standar ada karena suatu alasan, pengembang harus menghargai itu.
Tisch
1
@Tisch Ada banyak kasus di mana menggunakan ObjectManager secara langsung baik-baik saja. Skrip mandiri, umpan produk, pekerjaan cron, dll.; semua baik-baik saja. Dari tautan Anda sendiri, Magento menyatakan: "Dalam cakupan global, seperti dalam perlengkapan pengujian integrasi, Anda dapat menggunakan manajer objek." Jangan hanya membohongi burung beo ketika kenyataannya jauh lebih bernuansa.
WackGet
14

Seperti beberapa komentar yang telah disebutkan, Anda ingin menggunakan injeksi ketergantungan. Jangan gunakan manajer objek; dengan kata lain, jangan lakukan apa yang dinyatakan oleh tanggapan lainnya. Teknik berikut dapat diterapkan di mana saja. Untuk Blok, atur kelas ke kelas Anda dalam tata letak XML, yang memperluas yang asli, dan menyuntikkan informasi yang benar.

Suntikkan StockRegistryInterfaceantarmuka tempat Anda memerlukan akses:

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

Untuk menggunakannya di suatu tempat:

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

Sebagai referensi, Magento2 menggunakan antarmuka persis ini di seluruh katalog ketika datang untuk mengambil informasi stok produk.

Perhatikan bahwa apa pun di dalam tanda kurung perlu diubah.

danemacmillan
sumber
3
Ini harus ditandai sebagai jawaban yang benar. Meskipun saya belum mengujinya (belum) mengikuti konvensi.
Daan van den Bergh
3
Saya sudah mengujinya, dan ini adalah cara yang benar untuk melakukan ini. menggunakan object manager adalah tidak-tidak.
circleix
2
Allways +1 untuk praktik terbaik!
Akif
2
Ini harus menjadi jawaban yang diterima karena StockRegistryInterface bekerja pada setiap kasus, bukan StockStateInterface.
Amrit Pal Singh
1
Setuju, ini harus menjadi jawaban yang diterima.
Tisch
12

Cara mendapatkan jumlah stok setiap produk di Magento 2

untuk controller atau blok inject \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

dan kemudian gunakan fungsi getStockQty untuk mendapatkan qty

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

jika Anda ingin mendapatkan kuantitas dalam file .phtml kemudian gunakan

 <?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
sumber
mengembalikan qty 0 untuk saya walaupun saya punya qty 30
jafar pinjar
@jafarpinjar tahu hari ini bahwa ini juga faktor status - jika dinonaktifkan mengembalikan 0 - Saya tidak dapat memutuskan apakah ini hal yang baik atau tidak ...
Dominic Xigen
4

Skrip di bawah ini akan membantu untuk mendapatkan stok produk qty, min qty dan detail stok di magento2.

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

Jika Anda ingin $productobjsetelah menyimpan produk dari sisi backend sehingga Anda dapat dengan mudah menggunakan catalog_product_save_afteracara.

Saya berasumsi bahwa Anda sudah tahu cara membuat modul M2.

Saat ini Anda harus mengembangkan modul baru untuk M2

Kemudian Buat events.xmlfile ini di jalur di bawah ini

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>

Dan Buat file pengamat Anda Productsaveafter.phpdi jalur di bawah ini

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
sumber