Magento 2 : How to add custom data in order email
(Update 2.3)
use transportObject Use transportObject
instead of transport
$this->eventManager->dispatch(
'email_order_set_template_vars_before',
['sender' => $this, 'transport' => $transportObject, 'transportObject' => $transportObject]
);
[Update] Add custom data in order email in Magento 2
At magento2 have an event which fire when order Prepare an email template with variables.
$this->eventManager->dispatch( 'email_order_set_template_vars_before', ['sender' => $this, 'transport' => $transport] );
So, at this event, you can add new parameter via transport to template
Just like: events.xml
<?xml version="1.0" encoding="utf-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="email_order_set_template_vars_before">
<observer name="add_Custom_variable_to_Order"
instance="[Vendor]\[ModuleName]\Observer\ObserverforAddCustomVariable" />
</event>
</config>
Observer file:
<?php
namespace [Vendor]\[ModuleName]\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\App\ObjectManager;
class ObserverforAddCustomVariable implements ObserverInterface
{
public function __construct(
) {
}
/**
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
/** @var \Magento\Framework\App\Action\Action $controller */
$transport = $observer->getTransport();
$transport['CustomVariable1'] = 'Your Value1 ';
$transport['CustomVariable2'] = 'Your Value2';
}
}
At the email template , you can get this custom variables CustomVariable1,CustomVariable2
using {{var CustomVariable1|raw}},{{var CustomVariable2|raw}}
Answer for saving custom data in sales_order at success page
Magento fire an event when a customer goes to order success page the event is :
checkout_onepage_controller_success_action
this event provides order id, So using this event you can save custom data in sales_order against order.
Also, in order save field you need to call repository \Magento\Sales\Api\OrderRepositoryInterface $orderRepositoryInterface and also add save() function for saving the data
protected $_orderRepositoryInterface ;
public function __construct(
...
\Magento\Sales\Api\OrderRepositoryInterface $orderRepositoryInterface
....
) {
.......
$this->_orderRepositoryInterface = $orderRepositoryInterface;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
/* get customer store and restaurant data */
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
$c_id = $customerSession->getCustomer()->getId();
$c_store_id = $customerSession->getCustomer()->getData('stores');
$store= $objectManager->get('Vendor\Store\Model\Template');
$store_name = ($store->load($c_store_id)->getName());
$store_restaurant_id = ($store->load($c_store_id)->getRestaurantId());
$restaurant = $objectManager->get('Vendor\Restaurant\Model\Template');
$restaurant_name = ($restaurant->load($store_restaurant_id)->getName());
$orderids = $observer->getOrderIds();
$orderId = "";
foreach($orderids as $orderid){
$order = $this->_orderRepositoryInterface->getById($orderid);
$order->setData('restaurant_name', $restaurant_name )
->setData('res_store_name', $store_name);
$order->save()
}
}