期待已久的Magento 2改进之一是优化且灵活的销售订单网格。
使用升级后的网格,您可以轻松地拖放列以按任何顺序排列它们,按各种条件过滤列,设置默认的“排序网格”视图,添加/隐藏任何列以及通过任何关键字搜索网格。 所有这些选项在Magento 1中均不可用。标准的Magento 2.3.6订单网格由21列组成,这足以满足您的基本订单管理需求。
但是,在某些情况下,这个数据量可能不够。
在本文中,我们将通过“优惠券代码”列的示例来告诉您如何轻松地实现这一点。作为一个商店老板,本专栏将让您快速检查使用某个折扣代码的次数和使用者。
首先,您应该找到优惠券字段。它被放置在标准的 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 的样子:
该列也将出现在主网格工具栏上,因此您可以在需要时启用/禁用它。
基本上就是这样,希望本文能够帮助您简化和优化使用默认的 Magento 2销售订单网格。