Як отримати кількість запасів кожного товару в 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"
Гіель Беркерс

8
Будь ласка, використовуйте DI замість ObjectManager безпосередньо!
Маттіас Клейн

6
Ніколи не використовуйте такий код безпосередньо. Замість цього використовуйте конструктор DI.
Джіссі Рейцма

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento забороняє безпосередньо використовувати ObjectManager у вашому коді, оскільки він приховує реальні залежності класу. Див. Правила використання." Стандарти існують з причини, розробники повинні це дотримуватися.
Тиш

1
@Tisch Є маса випадків, коли використання ObjectManager безпосередньо. Автономні сценарії, канали продуктів, завдання Cron тощо; все добре. За власним посиланням Magento зазначає: "У глобальному масштабі, як і у складі тестів інтеграції, ви можете використовувати диспетчер об'єктів". Не просто сліпі папуги, коли реальність набагато більш нюансована.
WackGet

14

Як згадували деякі коментарі, ви хочете використовувати ін'єкцію залежності. Не використовувати диспетчер об'єктів; Іншими словами, не робіть того, про що говорить жодна з інших відповідей. Наступна техніка може застосовуватися в будь-якому місці. Для Blocks встановіть клас для свого класу в макеті 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
Я перевірив це, і це правильний спосіб зробити це. використання диспетчера об'єктів - це ні-ні.
circleix

2
Завжди +1 для найкращих практик!
Акіф

2
Це має бути прийнятою відповіддю, оскільки StockRegistryInterface працює у кожному випадку, а не StockStateInterface.
Амріт Пал Сінгх

1
Погоджено, це має бути прийнятою відповіддю.
Тиш

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());
?>

повернення qty 0 для мене, хоча у мене є qty 30
jafar pinjar

@jafarpinjar сьогодні дізнався, що це також впливає на стан - якщо інвалід повертається 0 - я не можу вирішити, добре це чи ні ...
Домінік Сіген

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();

    }   
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.