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