Magento2 销售订单网格-添加优惠券代码列

期待已久的Magento 2改进之一是优化且灵活的销售订单网格。

使用升级后的网格,您可以轻松地拖放列以按任何顺序排列它们,按各种条件过滤列,设置默认的“排序网格”视图,添加/隐藏任何列以及通过任何关键字搜索网格。 所有这些选项在Magento 1中均不可用。标准的Magento 2.3.6订单网格由21列组成,这足以满足您的基本订单管理需求。

order_grid

但是,在某些情况下,这个数据量可能不够。

在本文中,我们将通过“优惠券代码”列的示例来告诉您如何轻松地实现这一点。作为一个商店老板,本专栏将让您快速检查使用某个折扣代码的次数和使用者。

首先,您应该找到优惠券字段。它被放置在标准的 Magento 表中,命名为 sales _ order。注意,在创建订单网格时使用了另一个简化的 sales_order_grid 表。

这些表与以下集合关联:

Magento\Sales\Model\ResourceModel\Order\Collection and Magento\Sales\Model\ResourceModel\Order\Grid\Collection respectively.

最简单(但最不方便)的解决方案是将优惠券代码列添加到 sales _ order _ grid 表中。但是请注意,如果你这样做,你必须不断地保持你的数据是最新的。这只能通过创建同步表的新方法来实现。

简单地说,你需要创建一个插件,在将数据从 sales _order 转移到 sales _order_ grid 列时,添加 coupon_code 列。这是一个相当糟糕的解决方案,因为您的数据会被复制。

这就是为什么我们要采取不同的方式。

让我们使用表的左连接,只获取我们需要的销售订单数据。因此,实际上可以连接到任何表并向“销售订单”网格中添加自定义列。

首先,让我们从标准的 Grid 规范开始。

Grid 本身是一个 UI 组件,存储在Magento 文件  (如下面路径)magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml.

在那里,指定它使用的集合是  Magento\Sales\Model\ResourceModel\Order\Grid\Collection

数据源名为 sales_order_grid_data_ source。

对于这个数据源,该集合在模块的 di.xml 文件(magento/module-sales/etc/di.xml)中指定。这是以下几种方式完成的:

数据源路径

对于我们自定义的 Grid,我们将使用自己的方法更改默认数据源。它的父类是网格集合的标准类,可以让第三方扩展毫不费力地使用观察者和插件处理修改(如果需要的话)。

为了实现这一点,在我们模块的 di.xml 文件中,指定应该为 sales _ order _ grid 数据源使用另一个类App/code/Vendor/ExtendGrid/etc/di.xml

首先创建我们自己的模块:

1.创建/app/code/Yshuq/ExtendGrid/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Yshuq_ExtendGrid" setup_version="1.0.0">
    </module>
</config>

2. 创建/app/code/Yshuq/ExtendGrid/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Yshuq_ExtendGrid',
    __DIR__
);

3. 在/app/code/Yshuq/ExtendGrid/etc下面创建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\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="sales_order_grid_data_source" xsi:type="string">Yshuq\ExtendGrid\Model\ResourceModel\Order\Grid\Collection</item>
                </argument>
        </arguments>
    </type>
</config>

4. 如您所见,我们需要实现集合的扩展类。 让我们在这里创建它:

<?php

namespace Yshuq\ExtendGrid\Model\ResourceModel\Order\Grid;

use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;
use Yshuq\ExtendGrid\Helper\Data as Helper;

/**
 * Order grid extended collection
 * Class Collection
 * @package Yshuq\ExtendGrid\Model\ResourceModel\Order\Grid
 */
class Collection extends OriginalCollection
{
  
}

现在,还有一点事情要做。

我们修改了 _ renderFiltersBefore 方法,这样它就可以连接到我们的表并在那里选择必要的列。

为了做到这一点,我们指定需要表的名称、列和将用于连接我们的表的字段(在我们的例子中,t 是与订单 ID 一起归档的字段) :

5. 在app/code/Yshuq/ExtendGrid/Model/ResourceModel/Order/Grid/Collection.php 中添加表字段链接查询。

<?php

namespace Yshuq\ExtendGrid\Model\ResourceModel\Order\Grid;

use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as OriginalCollection;

/**
 * Order grid extended collection
 * Class Collection
 * @package Yshuq\ExtendGrid\Model\ResourceModel\Order\Grid
 */
class Collection extends OriginalCollection
{
    protected function _renderFiltersBefore()
    {
        $joinTable = $this->getTable('sales_order');
        $this->getSelect()->joinLeft($joinTable,'main_table.entity_id = sales_order.entity_id',['coupon_code']);
        parent::_renderFiltersBefore(); // TODO: Change the autogenerated stub
    }
}

其中 sales _ order 是我们要连接的表的名称,[‘ coupon _ code’]是我们连接到 Grid 的列数组。

另外,请注意,连接的表和列越多,网格负载就越慢。此外,在连接之后,它们的索引将变得无用,在某些情况下,过滤过程将花费更多的时间!

因此,我们不建议您将网格弄得凌乱不堪,只添加合理数量的额外列。

因此,我们已经到了最后一步,现在,我们需要指示网格显示我们的新列,在这里,我们定义新列的名称-coupon_code。

为此,在我们的模块中,我们需要创建标准 Grid 组件的扩展:

6./app/code/Yshuq/ExtendGrid/view/adminhtml/ui_component/sales_order_grid.xml 。

<?xml version="1.0" encoding="utf-8" ?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="coupon_code">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Coupon Code</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

7.执行下面语句,然后刷新网站:

php bin/magento setup:upgrade

注意,组件 sales _order_ rid.xml 的名称应该是相同的。

现在,我们可以根据需要修改网格,这就是修改后的 Grid 的样子:

coupon code coumn

该列也将出现在主网格工具栏上,因此您可以在需要时启用/禁用它。

基本上就是这样,希望本文能够帮助您简化和优化使用默认的 Magento 2销售订单网格。