Jak zdobyć zapasy każdego produktu w Magento 2


Odpowiedzi:


46

Dodaj poniższy kod do swojego list.phtmlpliku

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

LUB

<?php
   $stockItem = $product->getExtensionAttributes()->getStockItem();
   print_r($stockItem->getQty()); 
?>

1
Z jakiegoś powodu uruchomienie tego w zadaniu cron zawsze zwraca „0”
Giel Berkers

8
Proszę użyć DI zamiast ObjectManager bezpośrednio!
Matthias Kleine

6
Nigdy nie używaj takiego kodu bezpośrednio. Zamiast tego użyj konstruktora DI.
Jisse Reitsma

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - „Magento zabrania bezpośredniego używania ObjectManager w kodzie, ponieważ ukrywa prawdziwe zależności klasy. Zobacz zasady użytkowania”. Istnieją powody, dla których programiści powinni to uszanować.
Tisch

1
@Tisch Istnieje wiele przypadków, w których bezpośrednie użycie ObjectManager jest w porządku. Samodzielne skrypty, pliki danych produktów, zadania cron itp .; wszystko w porządku. Z własnego linku Magento stwierdza: „W zakresie globalnym, podobnie jak w urządzeniach testów integracyjnych, można użyć menedżera obiektów”. Nie tylko papugowate papugi, kiedy rzeczywistość jest o wiele bardziej zniuansowana.
WackGet

14

Jak wspomniano w niektórych komentarzach, chcesz użyć wstrzykiwania zależności. Nie używaj menedżera obiektów; innymi słowy, nie rób tego, co podają inne odpowiedzi. Poniższą technikę można zastosować w dowolnym miejscu. W przypadku bloków ustaw klasę na klasę w układzie XML, który rozszerza oryginał, i wprowadź odpowiednie informacje.

Wstaw StockRegistryInterfaceinterfejs, do którego potrzebujesz dostępu:

/**
 * @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;
}

Aby użyć go gdzieś:

/** @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();

Dla porównania, Magento2 używa tego dokładnego interfejsu w całym katalogu, jeśli chodzi o pobieranie informacji o zapasach produktów.

Pamiętaj, że wszystko w nawiasach kwadratowych wymaga modyfikacji.


3
To powinno być oznaczone jako poprawna odpowiedź. Chociaż nie testowałem (jeszcze), jest zgodny z konwencjami.
Daan van den Bergh

3
Przetestowałem to i jest to właściwy sposób na zrobienie tego. korzystanie z menedżera obiektów to nie-nie.
circlesix

2
Zawsze +1 za najlepsze praktyki!
Akif

2
To powinna być zaakceptowana odpowiedź, ponieważ StockRegistryInterface działa w każdym przypadku, a nie StockStateInterface.
Amrit Pal Singh

1
Uzgodnione, to powinna być zaakceptowana odpowiedź.
Tisch

12

Jak zdobyć zapasy każdego produktu w Magento 2

dla kontrolera lub bloku wtrysku \ Magento \ CatalogInventory \ Api \ StockStateInterface

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

a następnie użyj funkcji getStockQty, aby uzyskać ilość

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

jeśli chcesz uzyskać ilość w pliku .phtml, użyj

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

zwracając qty 0 dla mnie, mimo że mam
qty

@jafarpinjar dowiedział się dzisiaj, że to także wpływa na status - jeśli wyłączone zwraca 0 - Nie mogę się zdecydować, czy to dobrze, czy nie ...
Dominic Xigen

4

Poniższy skrypt pomoże uzyskać ilość zapasów produktu, ilość min i szczegóły zapasów w magento2.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productStockObj = $objectManager->get('Magento\CatalogInventory\Api\StockRegistryInterface')->getStockItem($productId);
print_r($productStockObj->getData());

1

Jeśli chcesz $productobjpo zapisaniu produktu od strony zaplecza, abyś mógł łatwo użyć catalog_product_save_afterzdarzenia.

Zakładam, że już wiesz, jak utworzyć moduł M2.

W tej chwili musisz opracować nowy moduł dla M2

Następnie utwórz ten events.xmlplik poniżej ścieżki

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>

I utwórz plik obserwatora Productsaveafter.phpponiżej ścieżki

app \ code \ 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();

    }   
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.