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'을 반환합니다
Giel Berkers

8
ObjectManager 대신 DI를 직접 사용하십시오!
Matthias Kleine 2012 년

6
이와 같은 코드를 직접 사용하지 마십시오. 대신 생성자 DI를 사용하십시오.
Jisse Reitsma

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/…- "Magento는 클래스의 실제 종속성을 숨기므로 코드에서 ObjectManager를 직접 사용하는 것을 금지합니다. 사용 규칙을 참조하십시오." 표준은 이유가 있으므로 개발자는이를 존중해야합니다.
Tisch

1
@Tisch ObjectManager를 직접 사용하는 것이 좋은 경우가 많이 있습니다. 독립형 스크립트, 제품 피드, 크론 작업 등 다 괜찮아 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
정답으로 표시해야합니다. 아직 테스트하지는 않았지만 규칙을 따릅니다.
Daan van den Bergh

3
나는 그것을 테스트했으며 이것이 올바른 방법입니다. 객체 관리자를 사용하는 것은 아닙니다.
동그라미 ixix

2
모범 사례를 위해 항상 +1!
Akif

2
StockRegistryInterface가 StockStateInterface가 아니라 모든 경우에 작동하므로이 답변이 허용됩니다.
Amrit Pal Singh

1
동의합니다. 이것이 정답입니다.
Tisch

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을 반환
자파르 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 \ 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.