วิธีรับปริมาณสต็อกของแต่ละผลิตภัณฑ์ใน 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
ด้วยเหตุผลบางอย่างการทำงานนี้ในงาน cron จะส่งคืน '0' เสมอ
Giel Berkers

8
กรุณาใช้ DI แทน ObjectManager โดยตรง!
Matthias Kleine

6
อย่าใช้รหัสเช่นนี้โดยตรง ใช้ตัวสร้าง DI แทน
Jisse Reitsma

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/ - "Magento ห้ามการใช้งานโดยตรงของ ObjectManager ในรหัสของคุณเพราะซ่อนการอ้างอิงที่แท้จริงของชั้นเรียนดูกฎการใช้งาน" มาตรฐานอยู่ที่นั่นด้วยเหตุผลที่นักพัฒนาควรให้ความเคารพ
Tisch

1
@Tisch มีหลายกรณีที่การใช้ ObjectManager โดยตรงนั้นใช้ได้ สคริปต์แบบสแตนด์อโลนฟีดผลิตภัณฑ์งาน cron ฯลฯ สบายดี จากลิงก์ของคุณวีโอไอพีระบุว่า: "ในขอบเขตทั่วโลกเช่นเดียวกับการทดสอบการรวมระบบคุณสามารถใช้ตัวจัดการวัตถุ" อย่าเพิ่งทำสิ่งที่เหมือนนกแก้วตาบอดเมื่อความจริงนั้นเหมาะสมยิ่งกว่า
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
ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง แม้ว่าฉันจะยังไม่ได้ทดสอบ แต่ก็เป็นไปตามอนุสัญญา
Daan van den Bergh

3
ฉันได้ทำการทดสอบแล้วและนี่คือวิธีที่ถูกต้องในการทำสิ่งนี้ การใช้ตัวจัดการวัตถุนั้นไม่ใช่ตัวเลือก
Circlesix

2
Allways +1 เพื่อการปฏิบัติที่ดีที่สุด!
Akif

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจาก StockRegistryInterface ใช้ได้กับทุกกรณีไม่ใช่ StockStateInterface
Amrit Pal Singh

1
ตกลงนี้ควรเป็นคำตอบที่ยอมรับได้
Tisch

12

วิธีรับปริมาณสต็อกของแต่ละผลิตภัณฑ์ใน Magento 2

สำหรับตัวควบคุมหรือบล็อกการฉีด \ Magento \ แคตตาล็อกสินค้าคงคลัง \ Api \ StockStateInterface

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

จากนั้นใช้ฟังก์ชัน getStockQty เพื่อรับจำนวน

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

หากคุณต้องการรับปริมาณเป็นไฟล์. php ให้ใช้

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

กลับมาจำนวน 0 สำหรับฉันแม้ว่าฉันจะมีจำนวน 30
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ในเส้นทางด้านล่าง

แอปพลิเค \ รหัส \ YOUR_NAMESPACE \ YOURMODULE \ สังเกตการณ์ \

<?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.