Do you want to add a custom order attribute to the Magento 2 admin grid? Read this tutorial to learn the step-by-step method to create custom order attribute in Magento 2 and show it in the admin grid.
Businesses use order information to manage & fulfill online orders efficiently. Order details such as shipping address and payment status make it easy to process online orders. The default Magento 2 displays such essential order information in the Sales > Orders backend grid, making it easy for the merchants to manage & process the orders. Furthermore, the Magento order status & states make the process easier.
Creating a custom order attribute in Magento 2 and showing it in the admin grid can make order processing more efficient as you scale your business. Also You add category attribute to custom attribute group in Magento 2 will help you integrating a third-party API and using a category attribute! You can follow the steps in this blog post to create a custom attribute in Magento 2 & show it in the admin grid.
Method to Create Custom Order Attribute in Magento 2 and Show it in Admin Grid
In order to create a custom order attribute in Magento 2, we will create a custom module and a UpgradeData file and save the custom attribute using an observer. Lastly, we’ll update the sales_order_grid.xml file to show the custom attribute in Magento 2 order grid.
Let’s see how to do it using an example. Create the following files in Magento 2:
- Vendor_Module/etc/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="vendor_module" setup_version="1.0.0">
<sequence>
<module name="Magento_Sales"/>
</sequence>
</module>
</config>
- Vendor_Module/Setup/UpgradeData.php
<?php
namespace Vendor\Module\Setup;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Sales\Setup\SalesSetupFactory;
class UpgradeData implements UpgradeDataInterface
{
private $salesSetupFactory;
/**
* Constructor
*
* @param \Magento\Sales\Setup\SalesSetupFactory $salesSetupFactory
*/
public function __construct(SalesSetupFactory $salesSetupFactory)
{
$this->salesSetupFactory = $salesSetupFactory;
}
/**
* {@inheritdoc}
*/
public function upgrade(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
if (version_compare($context->getVersion(), "1.0.1", "<")) {
$salesSetup = $this->salesSetupFactory->create(['setup' => $setup]);
$salesSetup->addAttribute(
'order',
'checkmo_cash_info',
[
'type' => 'varchar',
'length' => 100,
'visible' => false,
'required' => false,
'grid' => true
]
);
}
}
}
- Vendor_Module/etc/events.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_order_save_after">
<observer instance="Vendor\Module\Observer\Sales\OrderSaveAfter" name="ordersmodification_observer_sales_ordersaveafter_sales_order_save_after"/>
</event>
</config>
- Vendor_Module/Observer/Sales/OrderSaveAfter.php
<?php
namespace Vendor\Module\Observer\Sales;
class OrderSaveAfter implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Catalog\Model\ProductRepository
*/
protected $productRepository;
public function __construct(
\Psr\Log\LoggerInterface $logger,
\Magento\Catalog\Model\ProductRepository $productRepository
) {
$this->logger = $logger;
$this->productRepository = $productRepository;
}
/**
* Execute observer
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function execute(
\Magento\Framework\Event\Observer $observer
) {
$order= $observer->getData('order');
if(isset($postData['payment']['ckm_cash_number'])){
$order->setCheckmoCashInfo('y');
}
$order->save();
}
}
- Vendor_Module/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">
<!--Sync the sales_order table and sales_order_grid-->
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="checkmo_cash_info" xsi:type="string">sales_order.checkmo_cash_info</item>
</argument>
</arguments>
</virtualType>
</config>
- Vendor_Module/view/adminhtml/ui_component/sales_order_columns.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="checkmo_cash_info">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">textRange</item>
<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>
<item name="label" xsi:type="string" translate="true">checkmo Cash Information</item>
</item>
</argument>
</column>
</columns>
</listing>
Yeahhh…!
The custom order attribute will be created and displayed in the admin order grid in Magento 2. You can also learn Magento 2 create order in admin Panel to assist your customer in placing order when they require.
You can use the above code to create a custom order attribute in Magento 2 and show it in the admin grid as per your requirement & put your own logic. Try the solution.
Don’t you think this solution deserves a five-star rating?
Help us spread the Magento knowledge. Share this blog post on social media & online forums.
Thanks for reading…!