防止管理员为缺货的产品下订单

时间:2019-02-08 13:11:53

标签: magento grid

在Magneto 2.2中,管理员可以在后端为缺货或禁用的产品创建订单。它告诉管理员您选择的产品没有货,但允许他完成订单。

如果管理员在订单中选择缺货产品或订购了数量不足的产品,该如何防止下达此订单?

在目录>库存中,我设置为隐藏缺货的产品,并将缺货设置为NO。但这仅适用于前端,而不适用于后端。

在Sohel Rana和HIren Kadivar的帮助下,我获得了此代码,但该代码不完整:

尝试以下方式:

app / code / SR / MagentoStackExchange / etc / adminhtml / di.xml

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid">
    <plugin name="SR_MagentoStackExchange::product_grid_create_order"
            type="SR\MagentoStackExchange\Plugin\Block\Sales\Adminhtml\Order\Create\Search\Grid" sortOrder="1"/>
   </type>
   </config>

app / code / SR / MagentoStackExchange / Plugin / Block / Sales / Adminhtml / Order / Create / Search / Grid.php

<?php
namespace SR\MagentoStackExchange\Plugin\Block\Sales\Adminhtml\Order\Create\Search;

class Grid
{
    /**
     * @var \Magento\CatalogInventory\Helper\Stock
     */
    private $stockFilter;

    /**
     * Grid constructor.
     *
     * @param \Magento\CatalogInventory\Helper\Stock $stockFilter
     */
    public function __construct(
        \Magento\CatalogInventory\Helper\Stock $stockFilter
    ) {
        $this->stockFilter = $stockFilter;
    }

    public function aroundSetCollection(
        \Magento\Sales\Block\Adminhtml\Order\Create\Search\Grid $subject,
        \Closure $proceed,
        $collection
    ) {
        $this->stockFilter->addInStockFilterToCollection($collection);
        $proceed($collection);
    }
}
?>

此方法不能完全起作用(部分解决方案),大多数产品都是可配置产品。因此,对于简单的产品,缺货的产品会被隐藏,而管理员无法选择它,这是通过上面编写的扩展名完成的。但是对于可配置产品,管理员仍可以通过选择默认可配置产品并选择配置并选择缺货的产品来选择产品。选择缺货产品后,在产品下方显示大红色X,表示产品缺货。但是管理员可以为该产品下订单。

注意:假设鞋号43缺货,但42号有库存,在网格中,鞋43产品已从网格中隐藏,但显示了鞋42,同时还显示了结合所有尺寸的默认鞋,因此管理员可以选择默认的鞋子,然后按配置,然后选择43号(缺货),然后他可以下订单(这是问题所在)。

1 个答案:

答案 0 :(得分:0)

如果您转到/vendor/magento/module-sales/Block/Adminhtml/Order/Create/Search/Grid.php以使_prepareCollection起作用并添加

$collection->joinField(
            'qty', 'cataloginventory_stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left'
        );
        $collection->addFieldToFilter('qty', ['neq' => 0]);

您应该不会在网格中看到任何数量为0的产品。但是在此处编写该产品是一种不好的做法,因此您必须覆盖此文件。在Google的一点帮助下,我确定您可以管理。