Create observer on “email_shipment_set_template_vars_before” and set template vars
-
15-04-2021 - |
Question
I have created a observer on "email_shipment_set_template_vars_before" & trying to set some template var but its not working.
any thoughts ?
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Mod\Sales\Observer;
use Magento\Framework\Event\ObserverInterface;
use Psr\Log\LoggerInterface;
use Magento\Sales\Model\Order\Email\Container\Template;
class ShipmentSender implements ObserverInterface
{
/**
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* @param \Psr\Log\LoggerInterface $logger
*/
public function __construct(LoggerInterface $logger,Template $templateContainer)
{
$this->logger = $logger;
$this->templateContainer = $templateContainer;
}
/**
* @param Observer $observer
* @param Template $templateContainer
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$transport = $observer->getEvent()->getTransport();
$shipment = $transport['shipment'];
$order = $transport['order'];
$justshipped = '45';
$shipped = '99';
$transport['shipment'] = $shipment;
$transport['justshipped'] = $justshipped;
$transport['shipped'] = $shipped;
$this->templateContainer->setTemplateVars($transport);
}
}
adminhtml/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="email_shipment_set_template_vars_before">
<observer name="shipment_sender" instance="Mod\Sales\Observer\ShipmentSender" />
</event>
</config>
Solution
Yes , i have found a way for it. Please follow below steps to achieve this.
Step 1: Create events.xml file under path PackageName/Module/etc/
<?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="email_shipment_set_template_vars_before">
<observer name="add_Custom_variable_to_Order"
instance="PackageName\Module\Observer\ObserverforAddCustomVariable" />
</event>
</config>
Step 2: Create file ObserverforAddCustomVariable.php under path PackageName/Module/Observer/
<?php
namespace PackageName\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
class ObserverforAddCustomVariable implements ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
$sender = $observer->getData('sender');
if (!$sender instanceof ShipmentSender) {
return;
}
/** @var DataObject $transport */
$transport = $observer->getData('transportObject');
$transport->setData('CustomVariable1', 'Your Value1');
$transport->setData('CustomVariable2', 'Your Value2');
return;
}
}
At the email template(shipment email template) , you can get this custom variables CustomVariable1,CustomVariable2 using {{var CustomVariable1|raw}},{{var CustomVariable2|raw}}
Input - https://prnt.sc/103maal Output - https://prnt.sc/103mb56
Like above , you can set your own custom variables. It will surely work for you.
Thanks! Cheers