Skip to content

How to override an abstract class in magento 2

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');
}