Cách lấy số lượng tồn kho của từng sản phẩm trong Magento 2


Câu trả lời:


46

Thêm mã dưới đây vào list.phtmltập tin của bạn

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

HOẶC LÀ

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

1
Vì một số lý do, chạy cái này trong một công việc định kỳ luôn trả về '0'
Giel Berkers

8
Vui lòng sử dụng DI thay vì ObjectManager trực tiếp!
Matthias Kleine

6
Không bao giờ sử dụng mã như thế này trực tiếp. Sử dụng hàm tạo DI thay thế.
Jisse Reitsma

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/... - "Magento cấm việc sử dụng trực tiếp của ObjectManager trong mã của bạn vì nó che giấu sự phụ thuộc thực sự của một lớp Xem quy định sử dụng.." Các tiêu chuẩn là có lý do, các nhà phát triển nên tôn trọng điều đó.
Tisch

1
@Tisch Có rất nhiều trường hợp sử dụng ObjectManager trực tiếp là tốt. Kịch bản độc lập, nguồn cấp dữ liệu sản phẩm, công việc định kỳ, v.v.; tất cả đều tốt. Từ liên kết của riêng bạn, Magento tuyên bố: "Trong phạm vi toàn cầu, như trong các thử nghiệm tích hợp, bạn có thể sử dụng trình quản lý đối tượng." Đừng chỉ mù quáng thứ vẹt khi thực tế nhiều sắc thái.
WackGet

14

Giống như một số ý kiến ​​đã đề cập, bạn muốn sử dụng tiêm phụ thuộc. Không sử dụng trình quản lý đối tượng; nói cách khác, không làm bất cứ điều gì trong các câu trả lời khác. Các kỹ thuật sau đây có thể được áp dụng bất cứ nơi nào. Đối với Khối, đặt lớp thành lớp của bạn theo bố cục XML, mở rộng bản gốc và đưa thông tin đúng.

Tiêm StockRegistryInterfacegiao diện nơi bạn cần truy cập:

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

Để sử dụng nó ở đâu đó:

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

Để tham khảo, Magento2 sử dụng giao diện chính xác này trên tất cả các danh mục khi lấy thông tin chứng khoán sản phẩm.

Lưu ý rằng bất cứ điều gì trong dấu ngoặc vuông cần phải được sửa đổi.


3
Điều này nên được đánh dấu là câu trả lời chính xác. Mặc dù tôi đã không thử nó (nhưng) nó tuân theo các quy ước.
Daan van den Bergh

3
Tôi đã thử nó và đây là cách chính xác để làm điều này. sử dụng trình quản lý đối tượng là không.
circleix

2
Allways +1 để thực hành tốt nhất!
Akif

2
Đây phải là câu trả lời được chấp nhận vì StockRegistryInterface hoạt động trên mọi trường hợp, không phải StockStateInterface.
Amrit Pal Singh

1
Đồng ý, đây sẽ là câu trả lời được chấp nhận.
Tisch

12

Cách lấy số lượng tồn kho của từng sản phẩm trong Magento 2

cho bộ điều khiển hoặc khối tiêm \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

và sau đó sử dụng hàm getStockQty để lấy qty

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

Nếu bạn muốn lấy số lượng trong tệp .phtml thì hãy sử dụng

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

trả lại qty 0 cho tôi mặc dù tôi có qty 30
jafar pinjar

@jafarpinjar phát hiện ra hôm nay cũng có tình trạng này - nếu bị vô hiệu hóa trả về 0 - Tôi không thể quyết định xem đây có phải là điều tốt hay không ...
Dominic Xigen

4

Kịch bản dưới đây sẽ hữu ích để có được các sản phẩm chứng khoán qty, min qty và chi tiết chứng khoán trong magento2.

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

1

Nếu bạn muốn $productobjsau khi lưu sản phẩm từ phía phụ trợ để bạn có thể dễ dàng sử dụng catalog_product_save_aftersự kiện.

Tôi giả sử rằng bạn đã biết cách tạo một mô-đun M2.

Ngay bây giờ bạn cần phát triển mô-đun mới cho M2

Sau đó, tạo events.xmltập tin này trong đường dẫn dưới đây

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>

Và tạo tập tin quan sát của bạn Productsaveafter.phptrong đường dẫn dưới đây

ứng dụng \ 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();

    }   
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.