I know how override the normal class but now i try to override the abstract class [ MagentoSalesModelOrderEmailSender.php ] .
i have override the Sender.php file in custom module but its not working. Please suggest what can i do to override the file in custom module. Could anyone suggest regarding this so i can proceed forward.
Core File
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace MagentoSalesModelOrderEmail;
use MagentoSalesModelOrder;
use MagentoSalesModelOrderEmailContainerIdentityInterface;
use MagentoSalesModelOrderEmailContainerTemplate;
use MagentoSalesModelOrderAddressRenderer;
/**
* Class Sender
*
* phpcs:disable Magento2.Classes.AbstractApi
* @api
* @since 100.0.2
*/
abstract class Sender
{
/**
* @var MagentoSalesModelOrderEmailSenderBuilderFactory
*/
protected $senderBuilderFactory;
/**
* @var Template
*/
protected $templateContainer;
/**
* @var IdentityInterface
*/
protected $identityContainer;
/**
* @var PsrLogLoggerInterface
*/
protected $logger;
/**
* @var Renderer
*/
protected $addressRenderer;
/**
* @param Template $templateContainer
* @param IdentityInterface $identityContainer
* @param SenderBuilderFactory $senderBuilderFactory
* @param PsrLogLoggerInterface $logger
* @param Renderer $addressRenderer
*/
public function __construct(
Template $templateContainer,
IdentityInterface $identityContainer,
MagentoSalesModelOrderEmailSenderBuilderFactory $senderBuilderFactory,
PsrLogLoggerInterface $logger,
Renderer $addressRenderer
) {
$this->templateContainer = $templateContainer;
$this->identityContainer = $identityContainer;
$this->senderBuilderFactory = $senderBuilderFactory;
$this->logger = $logger;
$this->addressRenderer = $addressRenderer;
}
/**
* Send order email if it is enabled in configuration.
*
* @param Order $order
* @return bool
*/
protected function checkAndSend(Order $order)
{
$this->identityContainer->setStore($order->getStore());
if (!$this->identityContainer->isEnabled()) {
return false;
}
$this->prepareTemplate($order);
/** @var SenderBuilder $sender */
$sender = $this->getSender();
try {
$sender->send();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
return false;
}
if ($this->identityContainer->getCopyMethod() == 'copy') {
try {
$sender->sendCopyTo();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
}
}
return true;
}
/**
* Populate order email template with customer information.
*
* @param Order $order
* @return void
*/
protected function prepareTemplate(Order $order)
{
$this->templateContainer->setTemplateOptions($this->getTemplateOptions());
if ($order->getCustomerIsGuest()) {
$templateId = $this->identityContainer->getGuestTemplateId();
$customerName = $order->getBillingAddress()->getName();
} else {
$templateId = $this->identityContainer->getTemplateId();
$customerName = $order->getCustomerName();
}
$this->identityContainer->setCustomerName($customerName);
$this->identityContainer->setCustomerEmail($order->getCustomerEmail());
$this->templateContainer->setTemplateId($templateId);
}
/**
* Create Sender object using appropriate template and identity.
*
* @return Sender
*/
protected function getSender()
{
return $this->senderBuilderFactory->create(
[
'templateContainer' => $this->templateContainer,
'identityContainer' => $this->identityContainer,
]
);
}
/**
* Get template options.
*
* @return array
*/
protected function getTemplateOptions()
{
return [
'area' => MagentoFrameworkAppArea::AREA_FRONTEND,
'store' => $this->identityContainer->getStore()->getStoreId()
];
}
/**
* Render shipping address into html.
*
* @param Order $order
* @return string|null
*/
protected function getFormattedShippingAddress($order)
{
return $order->getIsVirtual()
? null
: $this->addressRenderer->format($order->getShippingAddress(), 'html');
}
/**
* Render billing address into html.
*
* @param Order $order
* @return string|null
*/
protected function getFormattedBillingAddress($order)
{
return $this->addressRenderer->format($order->getBillingAddress(), 'html');
}
Override in custom module
<?php
declare(strict_types=1);
namespace MatridOrderConfirmationRewriteMagentoSalesModelOrderEmail;
use MagentoSalesModelOrder;
use MagentoSalesModelOrderEmailContainerTemplate;
use MagentoSalesModelOrderEmailContainerIdentityInterface;
use MagentoSalesModelOrderAddressRenderer;
class Sender
{
/**
* @var MagentoSalesModelOrderEmailSenderBuilderFactory
*/
protected $senderBuilderFactory;
/**
* @var Template
*/
protected $templateContainer;
/**
* @var IdentityInterface
*/
protected $identityContainer;
/**
* @var PsrLogLoggerInterface
*/
protected $logger;
/**
* @var Renderer
*/
protected $addressRenderer;
/**
* @param Template $templateContainer
* @param IdentityInterface $identityContainer
* @param SenderBuilderFactory $senderBuilderFactory
* @param PsrLogLoggerInterface $logger
* @param Renderer $addressRenderer
*/
public function __construct(
Template $templateContainer,
IdentityInterface $identityContainer,
MagentoSalesModelOrderEmailSenderBuilderFactory $senderBuilderFactory,
PsrLogLoggerInterface $logger,
Renderer $addressRenderer
) {
$this->templateContainer = $templateContainer;
$this->identityContainer = $identityContainer;
$this->senderBuilderFactory = $senderBuilderFactory;
$this->logger = $logger;
$this->addressRenderer = $addressRenderer;
}
protected function checkAndSendCustom(Order $order)
{
$this->identityContainer->setStore($order->getStore());
if (!$this->identityContainer->isEnabled()) {
return false;
}
$this->prepareTemplate($order);
/** @var SenderBuilder $sender */
$sender = $this->getSender();
# send the value in sendcustom function @var SenderBuilder
try {
$sender->sendCustom();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
return false;
}
# copy method you to show the method you have select by the magento admin
# if you have select the separate method then bcc change to copy
if ($this->identityContainer->getCopyMethod() == 'bcc') {
try {
$sender->sendCopyToCustom();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
}
}
return true;
}
protected function prepareTemplate(Order $order)
{
$this->templateContainer->setTemplateOptions($this->getTemplateOptions());
if ($order->getCustomerIsGuest()) {
$templateId = $this->identityContainer->getGuestTemplateId();
$customerName = $order->getBillingAddress()->getName();
} else {
$templateId = $this->identityContainer->getTemplateId();
$customerName = $order->getCustomerName();
}
$this->identityContainer->setCustomerName($customerName);
$this->identityContainer->setCustomerEmail($order->getCustomerEmail());
$this->templateContainer->setTemplateId($templateId);
}
/**
* Create Sender object using appropriate template and identity.
*
* @return Sender
*/
protected function getSender()
{
return $this->senderBuilderFactory->create(
[
'templateContainer' => $this->templateContainer,
'identityContainer' => $this->identityContainer,
]
);
}
/**
* Get template options.
*
* @return array
*/
protected function getTemplateOptions()
{
return [
'area' => MagentoFrameworkAppArea::AREA_FRONTEND,
'store' => $this->identityContainer->getStore()->getStoreId()
];
}
/**
* Render shipping address into html.
*
* @param Order $order
* @return string|null
*/
protected function getFormattedShippingAddress($order)
{
return $order->getIsVirtual()
? null
: $this->addressRenderer->format($order->getShippingAddress(), 'html');
}
/**
* Render billing address into html.
*
* @param Order $order
* @return string|null
*/
protected function getFormattedBillingAddress($order)
{
return $this->addressRenderer->format($order->getBillingAddress(), 'html');
}