Reputation: 149
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
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
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