Previously, we used the following module to load the email variable with a custom CreatedAt value. Because this is deprecated, it will not work anymore (https://devdocs.magento.com/guides/v2.4/frontend-dev-guide/templates/template-email-migration.html).
How can we modify the following, to keep using this custom CreatedAt from Magento 2.4.3-p2?
app/code/Mago/Delivery/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Mago_Delivery',
__DIR__
);
app/code/Mago/Delivery/etc/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="Mago_Delivery" setup_version="1.0.1">
</module>
</config>
app/code/Mago/Delivery/etc/di.xml
<?xml version="1.0"?>
<config>
<preference for="Magento\Sales\Model\Order" type="Mago\Delivery\Model\Rewrite\Order" />
</config>
app/code/Mago/Delivery/Model/Rewrite/Order.php
<?php
namespace Mago\Delivery\Model\Rewrite;
class Order extends \Magento\Sales\Model\Order
{
public function getDeliveryDate()
{
$orderDate = $this->getCreatedAt(); //ORDER CREATED DATE
return date('Y-m-d', strtotime($orderDate. ' + 10 days'));
}
}
Finally in your email template you can get this date by:
{{var order.getDeliveryDate()}}
EDIT, new code with Order, Invoice and Creditmemo:
<?php
declare(strict_types=1);
namespace Acme\SalesEmail\Observer\Email;
use Magento\Framework\DataObject;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Locale\ResolverInterface;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Invoice;
use Magento\Sales\Model\Order\Creditmemo;
class OrderSetTemplateVarsBefore implements ObserverInterface
{
protected TimezoneInterface $timezone;
protected string $locale;
public function __construct(
TimezoneInterface $timezone,
ResolverInterface $localeResolver
) {
$this->timezone = $timezone;
$this->locale = $localeResolver->getLocale();
}
/**
* @inheritDoc
*/
public function execute(Observer $observer): void
{
/** @var DataObject $transport */
$transport = $observer->getEvent()->getData('transportObject');
/** @var Order $order */
$order = $transport->getData('order');
$orderData = $transport->getData('order_data');
/** @var Invoice $invoice */
$invoice = $transport->getData('invoice');
$invoiceData = $transport->getData('invoice_data');
/** @var Creditmemo $creditmemo */
$creditmemo = $transport->getData('creditmemo');
$creditmemoData = $transport->getData('creditmemo_data');
$orderDate = new \DateTime($order->getCreatedAt(), new \DateTimeZone('UTC'));
$orderData['order_date'] = $this->timezone->formatDateTime(
$orderDate,
\IntlDateFormatter::SHORT,
\IntlDateFormatter::NONE,
$this->locale
);
$transport->setData('order_data', $orderData);
if($invoice){
$invoiceDate = new \DateTime($invoice->getCreatedAt(), new \DateTimeZone('UTC'));
$invoiceData['invoice_date'] = $this->timezone->formatDateTime(
$invoiceDate,
\IntlDateFormatter::SHORT,
\IntlDateFormatter::NONE,
$this->locale
);
$transport->setData('invoice_data', $invoiceData);
}
if($creditmemo){
$creditmemoDate = new \DateTime($creditmemo->getCreatedAt(), new \DateTimeZone('UTC'));
$creditmemoData['creditmemo_date'] = $this->timezone->formatDateTime(
$creditmemoDate,
\IntlDateFormatter::SHORT,
\IntlDateFormatter::NONE,
$this->locale
);
$transport->setData('creditmemo_data', $creditmemoData);
}
}
}