Отображение продаваемого количества в интерфейсе Magento 2.3
В настоящее время мы показываем наше доступное количество на складе на интерфейсе каждого продукта, используя следующий код:
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$StockState = $objectManager->get('\Magento\CatalogInventory\Api\StockStateInterface');
$qty = $StockState->getStockQty($_product->getId());
?>
Но когда мы включаем новую функцию MSI в Magento 2, приведенный выше код всегда выводит 0. Как мы можем показать общее количество продаваемых товаров во внешнем интерфейсе всех источников инвентаризации?
Редактировать:
Я обнаружил, что когда я включаю источник по умолчанию, назначаю его продукту и даю ему, например, 10 шт. Приведенный выше код выводит 10, поэтому приведенный выше код не учитывает все источники запасов. Он должен показывать общее количество продаваемых товаров, как показано в бэкэнде.
Редактировать 2:
Объяснение с изображениями.
С указанными выше настройками приведенный выше код выводит 10. Он должен вывести 25.
Когда источник по умолчанию не назначен, приведенный выше код выводит 0. Он должен вывести 15.
5 answers
Определение продаваемого количества включает в себя минимальное количество.
В настоящее время MSI - это подход. Таким образом, никаких других методов, ярлыков, средств управления объектами или кода ретроспективной памяти M1. Все это должно быть подходом MSI, который будет совместим с будущими версиями M2.
Итак, давайте перейдем к делу:
$websiteCode = $this->storeManager->getWebsite()->getCode();
$stock = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
$stockId = $stock->getStockId();
Здесь вы получите свой идентификатор акции для вашего веб-сайта. Это может быть всегда одно и то же, но вы должны посмотреть его.
Если на интерфейсе вы хотите показать другое сообщение для товар в резервном заказе, то вы можете сделать это:
$stockItem = $this->getStockItemConfiguration->execute($product->getSku(), $stockId);
$minQty = $stockItem->getMinQty();
$salableQty = $this->productSalableQty->execute($product->getSku(), $stockId);
Чтобы определить, есть ли товар на складе и в продаже:
$product->isSalable()
Если вы хотите показать, что такое низкий запас, вы можете получить это от:
$lowStock = $this->scopeConfig->getValue(self::XML_PATH_STOCK_THRESHOLD_QTY, ScopeInterface::SCOPE_STORE);
Объединение этих значений для отображения наличия на складе:
if (($salableQty + $minQty) > $lowStock) {
Это показывает, что легко доступно без ожидания отложенных заказов и без низких запасов.
Если вы хотите знать, что есть на складе, включая низкие запасы, измените вышеуказанное на:
if (($salableQty + $minQty) > 0) {
Для настройки вашего класс использует интерфейсы:
use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface;
use Magento\InventorySalesApi\Api\GetProductSalableQtyInterface;
use Magento\InventorySalesApi\Api\StockResolverInterface;
use Magento\Store\Model\StoreManagerInterface;
Затем для вашего конструктора:
const XML_PATH_STOCK_THRESHOLD_QTY = 'cataloginventory/options/stock_threshold_qty';
private $getStockItemConfiguration;
private $productSalableQty;
private $stockResolver;
private $storeManager;
public function __construct(
. . .
GetProductSalableQtyInterface $productSalableQty,
GetStockItemConfigurationInterface $getStockItemConfiguration,
StockResolverInterface $stockResolver,
StoreManagerInterface $storeManager,
. . .
) {
$this->getStockItemConfiguration = $getStockItemConfiguration;
$this->productSalableQty = $productSalableQty;
$this->stockResolver = $stockResolver;
$this->storeManager = $storeManager;
. . .
}
Попробуйте это. Полное решение, основанное на других ответах
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
$productSalable = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
$stockResolver = $objectManager->get('\Magento\InventorySalesApi\Api\StockResolverInterface');
$stockId = $stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $website_code)->getStockId();
$stockQty = $productSalable->execute($product_sku, $stockId);
$website_code = код веб-сайта из всего магазина. $product_sku = артикул продукта. Результатом ($STOCKQTY) будет количество продукта определенного запаса, а не значение запаса по умолчанию
Я нашел свое собственное решение в следующем фрагменте кода:
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$StockState = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
$qty = $StockState->execute($_product->getSku(), 2);
?>
Я надеюсь, что это может помочь другим!:)
2 = $StockID
Все интерфейсы Cataloginventory, включая интерфейс StockStateИнтерфейс, устарели с версии Magento 2.3.1 Вы можете видеть, что в исходном коде Magento они также будут выделены как устаревшие, если вы используете PHP IDE для разработки. https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/CatalogInventory/Api/StockStateInterface.php#L13-L15
Начиная с Magento 2.3 правильный способ получения товарного количества следующий:
/** @var \Magento\InventorySalesApi\Api\StockResolverInterface */
$stockId = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode)->getStockId();
/** @var \Magento\InventorySalesApi\Api\GetProductSalableQtyInterface */
$qty = (int)$this->getProductSalableQty->execute($sku, $stockId);
Попробуйте это
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$StockState = $objectManager->get('\Magento\InventorySalesAdminUi\Model\GetSalableQuantityDataBySku');
$qty = $StockState->execute($_product->getSku());
print_r($qty)
Результат должен быть
Array ( [0] => Array ( [stock_name] => other [qty] => 980 [manage_stock] => 1 ) )