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>
Was it helpful?

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

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top