user1814734
user1814734

Reputation: 149

Magento 2: Add Grid Column to Admin Sales Order Without Adding Column to Database?

I want to add a column to sales order grid on magento admin dashboard. But the value of the column is from some process, not from database. Is that possible? And how to do it? Thanks in advance.

Upvotes: 3

Views: 3858

Answers (2)

Vishal Sanwar
Vishal Sanwar

Reputation: 69

Create a file with same name and path in your module.

app/code/[Vendor]/[Module_Name]/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>

app/code/[Vendor]/[Module_Name]/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>

Now, create a plugin for Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory

Next step is to create the Plugin folder and Plugin class in the module.

app/code/[Vendor]/[Module_Name]/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;
    }
}

Hope this will help you.

Upvotes: 0

Giel Berkers
Giel Berkers

Reputation: 2960

You can add a column to the admin grid by adding a file called view/adminhtml/ui_component/sales_order_grid.xml to your custom module with the following content:

<?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>

Your Example.php-file should extend Magento\Ui\Component\Listing\Columns\Column and have a prepareDataSource()-method to populate the data:

/**
 * @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;
}

Note that if you want to add sort- and filter-options you need to add some other adjustments, but that depends on what kind of data you want to show in the column.

Upvotes: 2

Related Questions