Hey guys,
i'm currently trying to override "\Magento\Sales\Model\Order\Email\Sender\OrderSender" (my plan is to provide different custom email-templates for every payment-method) which unfortunately doesn't seem to work.
I created a module for that with the following structure:
Vendor -- /OrderMailByPaymentMethod -- -- /etc -- -- -- module.xml -- -- -- /frontend -- -- -- -- di.xml -- -- /Model -- -- -- /Email -- -- -- -- /Sender -- -- -- -- -- OrderSender.php -- -- registration.php
and the following content:
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"> <preference for="Magento\Sales\Model\Order\Email\Sender\OrderSender" type="Vendor\OrderMailByPaymentMethod\Model\Email\Sender\OrderSender"/> </config>
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_OrderMailByPaymentMethod" setup_version="1.0.1"> </module> </config>
OrderSender.php:
<?php namespace Vendor\OrderMailByPaymentMethod\Model\Email\Sender; use Magento\Sales\Model\Order; class OrderSender extends \Magento\Sales\Model\Order\Email\Sender\OrderSender { protected function prepareTemplate(Order $order) { //Get Payment Method $paymentMethod = $order->getPayment()->getMethod(); die("TEST".$paymentMethod."TEST"); parent::prepareTemplate($order); //Define email template for each payment method switch ($paymentMethod) { case 'banktransfer' : $templateId = 'custom_template_cod'; break; // Add cases if you have more payment methods default: $templateId = $order->getCustomerIsGuest() ? $this->identityContainer->getGuestTemplateId() : $this->identityContainer->getTemplateId(); } $this->templateContainer->setTemplateId($templateId); } }
and finally registration.php:
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Vendor_OrderMailByPaymentMethod', __DIR__ );
The module installs correctly but unfortunately overriding the class doesn't work. I also tried the following commands:
php bin/magento setup:upgrade php bin/magento setup:di:compile php bin/magento cache:clean php bin/magento cache:flush
Any idea why this happens?
Best regards
Johannes
Hello Farbenkollektiv
Please override this SenderBuilder class.
<preference for="Magento\Sales\Model\Order\Email\SenderBuilder" type="Magebull\Orderemail\Model\Mail\SenderBuilder"/> <preference for="Magento\Sales\Model\Order\Email\Container\Template" type="Magebull\Orderemail\Model\Mail\Container\Template"/> <preference for="Magento\Sales\Model\Order\Email\Sender\OrderSender" type="Magebull\Orderemail\Model\Mail\Sender\OrderSender"/>
Magebull\Orderemail\Model\Mail\Container\Template
Magebull\Orderemail\Model\Mail\Container\Template <?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace vendor\moduleName\Model\Mail\Container; class Template extends \Magento\Sales\Model\Order\Email\Container\Template { /** * @var array */ protected $templateId; /** * @var array */ protected $imageAttach; public function setTemplateid($tempID) { $this->templateId = $tempID; } public function getTemplateid() { return $this->templateId; } }
Magebull\Orderemail\Model\Mail\Sender\OrderSender
Magebull\Orderemail\Model\Mail\SenderBuilder
<?php /** * @author Kristof Ringleff * @package Fooman_EmailAttachments * @copyright Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz) * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Magebull\Orderemail\Model\Mail\Sender; class OrderSender extends \Magento\Sales\Model\Order\Email\Sender\OrderSender { /** * @var \Fooman\EmailAttachments\Model\AttachmentContainerInterface */ protected $templateContainer; protected $_designerhelper; public function __construct( \Magento\Sales\Model\Order\Email\Container\Template $templateContainer, \Magento\Sales\Model\Order\Email\Container\OrderIdentity $identityContainer, \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory, \Psr\Log\LoggerInterface $logger, \Magento\Sales\Model\Order\Address\Renderer $addressRenderer, \Magento\Payment\Helper\Data $paymentHelper, \Magento\Sales\Model\ResourceModel\Order $orderResource, \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig, \Magento\Framework\Event\ManagerInterface $eventManager ) { $this->templateContainer = $templateContainer; parent::__construct( $this->templateContainer, $identityContainer, $senderBuilderFactory, $logger, $addressRenderer, $paymentHelper, $orderResource, $globalConfig, $eventManager ); /* $this->attachmentContainer = $attachmentContainer;*/ } public function send(\Magento\Sales\Model\Order $order, $forceSyncMode = false) { $items = $order->getAllVisibleItems(); $IncrementId = $order->getIncrementId(); $paymentMethod = $order->getPayment()->getMethod(); //Define email template for each payment method switch ($paymentMethod) { case 'banktransfer' : $templateId = 'custom_template_cod'; break; // Add cases if you have more payment methods default: $templateId = $order->getCustomerIsGuest() ? $this->identityContainer->getGuestTemplateId() : $this->identityContainer->getTemplateId(); } $this->templateContainer->setTemplateid($templateId); return parent::send($order, $forceSyncMode); } }
Magebull\Orderemail\Model\Mail\SenderBuilder
<?php /** * @author Kristof Ringleff * @package Fooman_EmailAttachments * @copyright Copyright (c) 2015 Fooman Limited (http://www.fooman.co.nz) * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Magebull\Orderemail\Model\Mail; use Magento\Framework\Mail\Template\TransportBuilder; use Magento\Sales\Model\Order\Email\Container\IdentityInterface; use Magento\Sales\Model\Order\Email\Container\Template; class SenderBuilder extends \Magento\Sales\Model\Order\Email\SenderBuilder { /** * @var Template */ protected $templateContainer; /** * @var IdentityInterface */ protected $identityContainer; /** * @var TransportBuilder */ protected $transportBuilder; /** * @param Template $templateContainer * @param IdentityInterface $identityContainer * @param TransportBuilder $transportBuilder */ public function __construct( Template $templateContainer, IdentityInterface $identityContainer, TransportBuilder $transportBuilder ) { $this->templateContainer = $templateContainer; $this->identityContainer = $identityContainer; $this->transportBuilder = $transportBuilder; } /** * Prepare and send email message * * @return void */ protected function configureEmailTemplate()
{
$templateID = $this->templateContainer->getTemplateid();
$this->transportBuilder->setTemplateIdentifier($templateId);
$this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
$this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
$this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity());
} }
Hope it will help to solve the problem then please accept as solution and kudos.