Magento 2 模块实战:创建 email 模板

·

·

在 Magento 2 中,电子邮件通知是与客户进行沟通的重要方式之一。通过创建自定义的电子邮件模板,可以更好地满足特定业务需求,提供个性化的客户体验。本文将以 PHP 语言为例,详细介绍在 Magento 2 中创建电子邮件模板的方法。

一、电子邮件模板在 Magento 2 中的重要性

电子邮件模板在 Magento 2 中起着至关重要的作用。它们用于向客户发送各种通知,如订单确认、发货通知、密码重置等。通过使用自定义的电子邮件模板,可以:

  1. 提供一致的品牌形象
    确保所有发送给客户的电子邮件都具有统一的外观和风格,增强品牌识别度。
  2. 个性化沟通
    根据不同的场景和客户需求,定制电子邮件内容,提供更加个性化的服务。
  3. 提高客户体验
    清晰、美观的电子邮件模板可以提高客户的阅读体验,增加客户对品牌的好感度。

二、创建电子邮件模板的准备工作

  1. 了解 Magento 2 的电子邮件系统架构
    Magento 2 的电子邮件系统由多个组件组成,包括模板文件、布局文件、事件触发机制等。在创建电子邮件模板之前,需要了解这些组件的作用和相互关系。
  2. 确定电子邮件模板的需求
    明确需要创建哪些类型的电子邮件模板,以及每个模板的用途和内容要求。例如,订单确认邮件可能需要包含订单详情、客户信息、发货时间等内容。
  3. 准备设计资源
    如果需要创建具有特定设计风格的电子邮件模板,可以准备相应的设计资源,如图片、图标、颜色方案等。

三、创建电子邮件模板的步骤

  1. 创建模板文件
    在 Magento 2 中,电子邮件模板文件通常位于app/code/Vendor/Module/view/frontend/email目录下。可以使用以下步骤创建一个新的电子邮件模板文件:

(1)创建模板目录
如果模块中没有email目录,可以在view/frontend目录下创建一个名为email的子目录。

(2)创建模板文件
email目录下,创建一个以.html为扩展名的模板文件,例如order_confirmation.html

以下是一个简单的电子邮件模板文件示例:

收起

html

复制

<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<!--@subject Order Confirmation @-->
<!--@vars {
"var customer_name":"Customer Name",
"var order_id":"Order ID",
"var order_total":"Order Total"
} @-->
<p>Dear {{var customer_name}},</p>
<p>Thank you for your order. Your order number is {{var order_id}}. The total amount of your order is {{var order_total}}.</p>
<p>We will process your order as soon as possible and keep you updated on the progress.</p>
<p>Best regards,</p>
<p>Your Store Team</p>

在这个模板文件中,使用了 Magento 2 的模板语法来定义变量和主题。变量可以在发送电子邮件时动态替换为实际的值。

  1. 注册电子邮件模板
    为了让 Magento 2 系统能够识别和使用新创建的电子邮件模板,需要在模块的配置文件中进行注册。可以在模块的etc/email_templates.xml文件中添加以下内容:

收起

xml

复制

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd">
    <template id="vendor_module_order_confirmation" label="Order Confirmation" file="order_confirmation.html" type="html" module="Vendor_Module" area="frontend"/>
</config>

在这个配置文件中,定义了一个名为vendor_module_order_confirmation的电子邮件模板,指定了模板文件的路径、类型和所属模块等信息。

  1. 使用电子邮件模板
    在 Magento 2 的代码中,可以使用以下方式发送电子邮件并使用自定义的电子邮件模板:

收起

php

复制

<?php

namespace Vendor\Module\Controller\Index;

use Magento\Framework\App\Action\Context;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Translate\Inline\StateInterface;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $transportBuilder;
    protected $inlineTranslation;

    public function __construct(Context $context, TransportBuilder $transportBuilder, StateInterface $inlineTranslation)
    {
        $this->transportBuilder = $transportBuilder;
        $this->inlineTranslation = $inlineTranslation;
        parent::__construct($context);
    }

    public function execute()
    {
        $customerName = 'John Doe';
        $orderId = '12345';
        $orderTotal = '$100.00';

        $this->inlineTranslation->suspend();
        $transport = $this->transportBuilder
            ->setTemplateIdentifier('vendor_module_order_confirmation')
            ->setTemplateOptions([
                'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
                'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ])
            ->setTemplateVars([
                'customer_name' => $customerName,
                'order_id' => $orderId,
                'order_total' => $orderTotal,
            ])
            ->setFrom('sender@example.com')
            ->addTo('recipient@example.com')
            ->getTransport();
        $transport->sendMessage();
        $this->inlineTranslation->resume();
    }
}

在这个示例中,首先创建了一些变量来存储客户名称、订单 ID 和订单总价等信息。然后,使用TransportBuilder类创建一个电子邮件传输对象,并设置电子邮件模板的标识符、模板选项和变量等信息。最后,设置发件人和收件人地址,并发送电子邮件。

四、电子邮件模板的高级用法

  1. 使用动态数据
    可以在电子邮件模板中使用更多的动态数据,例如从数据库中获取的数据、根据特定规则计算的数据等。可以通过在模板文件中使用更多的变量和 Magento 2 的模板语法来实现。

例如,可以在模板文件中添加以下内容来显示订单中的商品列表:

收起

html

复制

<!--@vars {
"var customer_name":"Customer Name",
"var order_id":"Order ID",
"var order_total":"Order Total",
"var items":"Order Items"
} @-->
<p>Dear {{var customer_name}},</p>
<p>Thank you for your order. Your order number is {{var order_id}}. The total amount of your order is {{var order_total}}.</p>
<p>Here are the items in your order:</p>
<ul>
<!--@foreach($var.items as $item) @-->
    <li>{{$item.name}} - {{$item.price}}</li>
<!--@endforeach @-->
</ul>
<p>We will process your order as soon as possible and keep you updated on the progress.</p>
<p>Best regards,</p>
<p>Your Store Team</p>

在发送电子邮件时,可以将订单中的商品列表作为变量传递给模板:

收起

php

复制

<?php

namespace Vendor\Module\Controller\Index;

use Magento\Framework\App\Action\Context;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Translate\Inline\StateInterface;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $transportBuilder;
    protected $inlineTranslation;

    public function __construct(Context $context, TransportBuilder $transportBuilder, StateInterface $inlineTranslation)
    {
        $this->transportBuilder = $transportBuilder;
        $this->inlineTranslation = $inlineTranslation;
        parent::__construct($context);
    }

    public function execute()
    {
        $customerName = 'John Doe';
        $orderId = '12345';
        $orderTotal = '$100.00';

        // 获取订单中的商品列表
        $items = [
            [
                'name' => 'Product 1',
                'price' => '$50.00',
            ],
            [
                'name' => 'Product 2',
                'price' => '$50.00',
            ],
        ];

        $this->inlineTranslation->suspend();
        $transport = $this->transportBuilder
            ->setTemplateIdentifier('vendor_module_order_confirmation')
            ->setTemplateOptions([
                'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
                'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ])
            ->setTemplateVars([
                'customer_name' => $customerName,
                'order_id' => $orderId,
                'order_total' => $orderTotal,
                'items' => $items,
            ])
            ->setFrom('sender@example.com')
            ->addTo('recipient@example.com')
            ->getTransport();
        $transport->sendMessage();
        $this->inlineTranslation->resume();
    }
}
  1. 自定义电子邮件主题和发件人
    可以在发送电子邮件时自定义电子邮件的主题和发件人地址。可以通过在TransportBuilder类的方法中设置相应的参数来实现。

例如,可以将电子邮件的主题设置为 “Your Order Confirmation from [Store Name]”,并将发件人地址设置为 “no-reply@example.com”:

收起

php

复制

<?php

namespace Vendor\Module\Controller\Index;

use Magento\Framework\App\Action\Context;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Framework\Translate\Inline\StateInterface;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $transportBuilder;
    protected $inlineTranslation;

    public function __construct(Context $context, TransportBuilder $transportBuilder, StateInterface $inlineTranslation)
    {
        $this->transportBuilder = $transportBuilder;
        $this->inlineTranslation = $inlineTranslation;
        parent::__construct($context);
    }

    public function execute()
    {
        $customerName = 'John Doe';
        $orderId = '12345';
        $orderTotal = '$100.00';

        // 获取订单中的商品列表
        $items = [
            [
                'name' => 'Product 1',
                'price' => '$50.00',
            ],
            [
                'name' => 'Product 2',
                'price' => '$50.00',
            ],
        ];

        $this->inlineTranslation->suspend();
        $transport = $this->transportBuilder
            ->setTemplateIdentifier('vendor_module_order_confirmation')
            ->setTemplateOptions([
                'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
                'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
            ])
            ->setTemplateVars([
                'customer_name' => $customerName,
                'order_id' => $orderId,
                'order_total' => $orderTotal,
                'items' => $items,
            ])
            ->setFrom('no-reply@example.com')
            ->addTo('recipient@example.com')
            ->setSubject('Your Order Confirmation from [Store Name]')
            ->getTransport();
        $transport->sendMessage();
        $this->inlineTranslation->resume();
    }
}

五、总结与展望

在 Magento 2 中创建电子邮件模板是一项非常有用的功能,可以帮助商家更好地与客户进行沟通,提供个性化的服务。通过本文的介绍,相信读者已经掌握了在 Magento 2 中创建电子邮件模板的方法。在实际应用中,可以根据具体的业务需求,进一步扩展和优化电子邮件模板,提高客户体验和品牌形象。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注