我想在 magento 管理仪表板上的销售订单网格中添加一列。但该列的值来自某个进程,而不是来自数据库。那可能吗?以及如何做呢?预先感谢。
您可以通过将名为
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">
<listingToolbar name="listing_top"/>
<columns name="sales_order_columns">
<column name="order_reference" class="Vendor\Example\Ui\Component\Listing\Column\Example">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="label" xsi:type="string" translate="true">Example Column</item>
</item>
</argument>
</column>
</columns>
</listing>
您的
Example.php
文件应扩展 Magento\Ui\Component\Listing\Columns\Column
并具有 prepareDataSource()
方法来填充数据:
/**
* @param array $dataSource
* @return array
*/
public function prepareDataSource(array $dataSource)
{
if (isset($dataSource['data']['items'])) {
foreach ($dataSource['data']['items'] as & $item) {
$item[$this->getData('name')] = 'Something'
}
}
return $dataSource;
}
请注意,如果您想添加排序和过滤选项,您需要添加一些其他调整,但这取决于您想在列中显示哪种数据。
在模块中创建一个具有相同名称和路径的文件。
应用程序/代码/[供应商]/[模块名称]/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="custom_column">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="visible" xsi:type="boolean">true</item>
<item name="filter" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Custom Column</item>
</item>
</argument>
</column>
</columns>
</listing>
应用程序/代码/[供应商]/[模块名称]/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">
<plugin name="sales_order_additional_columns" type="[Vendor]\[Module_Name]\Plugin\SalesOrderCustomColumn" sortOrder="10" disabled="false" />
</type>
</config>
现在,为 Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory 创建一个插件
下一步是在模块中创建 Plugin 文件夹和 Plugin 类。
应用程序/代码/[供应商]/[模块名称]/插件/SalesOrderCustomColumn.php
<?php
namespace [Vendor]\[Module_Name]\Plugin;
use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;
class SalesOrderCustomColumn
{
private $messageManager;
private $collection;
public function __construct(MessageManager $messageManager,
SalesOrderGridCollection $collection
) {
$this->messageManager = $messageManager;
$this->collection = $collection;
}
public function aroundGetReport(
\Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
\Closure $proceed,
$requestName
) {
$result = $proceed($requestName);
if ($requestName == 'sales_order_grid_data_source') {
if ($result instanceof $this->collection
) {
$select = $this->collection->getSelect();
$select->joinLeft(
["secondTable" => $this->collection->getTable("table_name")],
'main_table.increment_id = secondTable.order_id',
array('custom_column')
);
return $this->collection;
}
}
return $result;
}
}
希望这对您有帮助。