Как получить количество на складе каждого продукта в Magento 2

26

Как получить количество на складе каждого продукта в list.phtml в 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 напрямую!
Матиас Кляйн
6
Никогда не используйте подобный код напрямую. Вместо этого используйте конструктор DI.
Jisse Reitsma
2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - «Magento запрещает прямое использование ObjectManager в вашем коде, поскольку оно скрывает реальные зависимости класса. См. Правила использования». Стандарты существуют по определенной причине, разработчики должны уважать это.
Тиши
1
@Tisch Есть много случаев, когда использование ObjectManager напрямую подходит. Автономные скрипты, фиды продуктов, задания cron и т. Д .; все хорошо. По вашей собственной ссылке 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 использует этот точный интерфейс по всему каталогу, когда дело доходит до получения информации о наличии товара.

Обратите внимание, что все, что в квадратных скобках, должно быть изменено.

danemacmillan
источник
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, чтобы получить кол-во

 $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());
?>
Сурендра Кумар Ахир
источник
возвращая кол-во 0 для меня, хотя у меня есть кол-во 30
Джафар Пинджар
@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по пути ниже

App \ код \ 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();

    }   
}
Бахаруни Асиф
источник