Magento 2: Отправляйте различные шаблоны электронной почты для отправки, в зависимости от выбранного способа доставки
У меня возникла дилемма о том, как отправить другое содержимое электронной почты при отправке заказа на основе выбранного способа доставки.
Например: Если есть Доставка/Забрать/Доставка в качестве способов доставки, то:
Если доставка:
- "Ваш заказ в пути!"
Если пикап:
- "Ваш заказ готов к отправке!"
При доставке:
- (Шаблон электронной почты по умолчанию с отслеживанием код)
Более подробная информация: Я использую метод доставки с фиксированной ставкой для заказов на самовывоз и цены в таблице в качестве доставки.
Спасибо!
3 answers
Вы можете создать некоторые переменные, которые будут использоваться в шаблоне электронной почты для добавления некоторых сообщений в зависимости от способа доставки.
Добавьте переменные в шаблон, создав плагин для метода Magento\Sales\Model\Order\Email\Container\Template
setTemplateVars
. Например:
class ShippingVars
{
public function beforeSetTemplateVars(\Magento\Sales\Model\Order\Email\Container\Template $subject, array $vars)
{
/** @var Order $order */
$order = $vars['order'];
$method = $order->getShippingMethod();
$vars['is_pickup'] = $method === 'flatrate_flatrate';
return [$vars];
}
}
В шаблоне электронной почты:
{{if is_pickup}}
<p>Your order is ready for Pickup!</p>
{{else}}
<p>Your order is on the road!</p>
{{/if}}
Я применил другой подход к решению этой проблемы:
Я расширил метод Magento\Sales\Model\Order\Email\Sender\Shipment Sender
send
и добавил свои собственные переменные непосредственно в транспорт.
Мой подход был результатом стороннего расширения, также вводящего свои собственные переменные через ShipmentSender
.
class ShipmentSender extends BaseShipmentSender
{
public function send(Shipment $shipment, $forceSyncMode = false)
{
$shipment->setSendEmail(true);
if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
$order = $shipment->getOrder();
$transport = [
'order' => $order,
'shipment' => $shipment,
'comment' => $shipment->getCustomerNoteNotify() ? $shipment->getCustomerNote() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
'store' => $order->getStore(),
'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
'shipping_arrival_date' => $order->getShippingArrivalDate(),
'delivery_time_slot' => $order->getShippingArrivalTimeslot(),
'shipping_arrival_comments' => $order->getShippingArrivalComments(),
'is_pickup' => $order->getShippingMethod() == "flatrate_flatrate",
'is_delivery' => $order->getShippingMethod() == "shippingtable_shippingtable1",
'is_shipment' => ($order->getShippingMethod() != "flatrate_flatrate" && $order->getShippingMethod() != "shippingtable_shippingtable1"),
'is_pickup_or_delivery' => ($order->getShippingMethod() == "flatrate_flatrate" || $order->getShippingMethod() == "shippingtable_shippingtable1"),
];
$this->eventManager->dispatch(
'email_shipment_set_template_vars_before',
['sender' => $this, 'transport' => $transport]
);
$this->templateContainer->setTemplateVars($transport);
if ($this->checkAndSend($order)) {
$shipment->setEmailSent(true);
$this->shipmentResource->saveAttribute($shipment, ['send_email', 'email_sent']);
return true;
}
}
$this->shipmentResource->saveAttribute($shipment, 'send_email');
return false;
}
Благодаря этому изменению я смог ссылаться на него таким образом в своем шаблоне shipment_new.html
.
{{if is_pickup}}
{{trans "Your %store_name order is ready for Pickup!" store_name=$store.getFrontendName()}}
{{/if}}
{{if is_delivery}}
{{trans "Your %store_name order is on the road!" store_name=$store.getFrontendName()}}
{{/if}}
{{if is_shipment}}
{{trans "Your %store_name order has shipped!" store_name=$store.getFrontendName()}}
{{/if}}
Не могли бы вы сделать это в Magento 2? Я воспользовался им и ничего не нашел. Пожалуйста, кто-нибудь может мне помочь?