Magento 2:将网格列添加到管理销售订单而不将列添加到数据库?

问题描述 投票:0回答:2

我想在 magento 管理仪表板上的销售订单网格中添加一列。但该列的值来自某个进程,而不是来自数据库。那可能吗?以及如何做呢?预先感谢。

php magento2
2个回答
2
投票

您可以通过将名为

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;
}

请注意,如果您想添加排序和过滤选项,您需要添加一些其他调整,但这取决于您想在列中显示哪种数据。


0
投票

在模块中创建一个具有相同名称和路径的文件。

应用程序/代码/[供应商]/[模块名称]/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;
    }
}

希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.