Magento 2'deki her ürünün stok miktarını nasıl alabilirim


Yanıtlar:


46

list.phtmlDosyanıza feryat kodu ekleyin

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

VEYA

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

1
Bazı sebeplerden dolayı, bunu bir cron işinde çalıştırmak her zaman '0'
değerini

8
Lütfen doğrudan ObjectManager yerine DI kullanın!
Matthias Kleine

6
Asla doğrudan böyle bir kod kullanmayın. Bunun yerine yapıcı DI'yi kullanın.
Jisse Reitsma

2
@WackGet devdocs.magento.com/guides/v2.3/extension-dev-guide/… - "Magento, bir sınıfın gerçek bağımlılıklarını gizlediği için ObjectManager'in kodunuzda doğrudan kullanılmasını yasaklar. Kullanım kurallarına bakın." Standartlar bir sebepten dolayı var, geliştiriciler buna saygı duymalı.
Tisch

1
@Tisch ObjectManager'ı doğrudan kullanmanın iyi olduğu birçok durum vardır. Bağımsız scriptler, ürün yayınları, cron işleri vb .; hepsi iyi. Magento kendi bağlantınızdan şunları söylüyor: “Global bir kapsamda, entegrasyon testlerinin fikstüründe olduğu gibi, nesne yöneticisini kullanabilirsiniz.” Gerçek çok daha çekingen olduğunda sadece sadece papağan şeylerini karıştırmayın.
WackGet

14

Bahsettiğiniz bazı yorumlar gibi, bağımlılık enjeksiyonunu kullanmak istiyorsunuz. Nesne yöneticisini kullanmayın; Başka bir deyişle, diğer cevaplardan herhangi birinin ifade ettiği şeyi yapmayın. Aşağıdaki teknik herhangi bir yere uygulanabilir. Blocks için, sınıfı, orijinali genişleten düzeni XML olarak sınıfınıza ayarlayın ve doğru bilgileri enjekte edin.

Erişmeniz gereken StockRegistryInterfacearayüzü enjekte edin :

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

Bir yerde kullanmak için:

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

Referans olarak, Magento2 ürün stok bilgisini almaya gelince, kataloğun tamamında bu tam arayüzü kullanır.

Köşeli parantez içindeki herhangi bir şeyin değiştirilmesi gerektiğini unutmayın.


3
Bu doğru cevap olarak işaretlenmelidir. Test etmemiş olmama rağmen (henüz) sözleşmeleri takip ediyor.
Daan van den Bergh,

3
Test ettim ve bunu yapmanın doğru yolu bu. Nesne yöneticisini kullanarak bir hayır-hayır.
circlesix

2
En iyi uygulamalar için Allways +1!
Akif

2
Bu, StockRegistryInterface, StockStateInterface'te değil her durumda çalıştığı için kabul edilen cevap olmalıdır.
Amrit Pal Singh

1
Kabul, bu kabul edilen cevap olmalıdır.
Tisch

12

Magento 2'deki her ürünün stok miktarını nasıl alabilirim

denetleyici veya blok enjekte etmek için \ Magento \ CatalogueInventory \ Api \ StockStateInterface

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

ve sonra qty almak için getStockQty işlevini kullanın

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

Eğer .phtml dosyasında miktar almak istiyorsanız kullanın

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

Ben 30 için sahip olsa bile benim için 0 qty dönen
jafar pinjar 16:30 '

@jafarpinjar bugün bunun da durum faktörlerini keşfetti - eğer devre dışı bırakılırsa 0 - bunun iyi bir şey olup olmadığına karar
veremem

4

Aşağıdaki komut dosyası, magento2'deki ürün stok miktarı, minimum miktar ve stok detaylarını elde etmek için yardımcı olacaktır.

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

1

$productobjÜrünü arka uçtan kaydettikten sonra istiyorsanız, bu yüzden catalog_product_save_afteretkinliği kolayca kullanabilirsiniz .

Nasıl modül oluşturulacağını zaten bildiğinizi varsayıyorum M2.

Şu anda M2 için yeni bir modül geliştirmeniz gerekiyor

Sonra bu events.xmldosyayı aşağıdaki yoldan oluşturun.

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>

Ve gözlemci dosyanızı Productsaveafter.phpaşağıdaki yoldan oluşturun

Uygulamanın \ kod \ YOUR_NAMESPACE \ YOURMODULE \ Gözlemci \

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

    }   
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.