Magento 2: Отправляйте различные шаблоны электронной почты для отправки, в зависимости от выбранного способа доставки


У меня возникла дилемма о том, как отправить другое содержимое электронной почты при отправке заказа на основе выбранного способа доставки.

Например: Если есть Доставка/Забрать/Доставка в качестве способов доставки, то:

Если доставка:

  • "Ваш заказ в пути!"

Если пикап:

  • "Ваш заказ готов к отправке!"

При доставке:

  • (Шаблон электронной почты по умолчанию с отслеживанием код)

Более подробная информация: Я использую метод доставки с фиксированной ставкой для заказов на самовывоз и цены в таблице в качестве доставки.

Спасибо!

Author: Noemi Quezada, 2017-02-17

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}}
 4
Author: Aaron Allen, 2019-12-14 08:36:19

Я применил другой подход к решению этой проблемы:

Я расширил метод 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}}
 1
Author: Noemi Quezada, 2017-02-20 23:29:44

Не могли бы вы сделать это в Magento 2? Я воспользовался им и ничего не нашел. Пожалуйста, кто-нибудь может мне помочь?

 0
Author: Perla Simeone, 2020-06-05 02:55:16