devture / symfony-email-template-bundle
Symfony 插件,提供基于 Twig 的电子邮件模板管理(持久化到文件系统)和消息准备。
Requires
- php: >=8.1
- devture/dbal: >=1.0,<1.3
- devture/form: >=5.0,<6.0-dev
- html2text/html2text: >=2.0,<5.0-dev
- knplabs/gaufrette: >=0.3,<1.0-dev
- symfony/mailer: >=3.1,<7.0-dev
- symfony/twig-bundle: >=3.0,<7.0-dev
- symfony/yaml: >=3.1,<7.0-dev
README
插件提供
- 用于管理电子邮件模板的 web UI
- 系统,可以从这些模板中准备 symfony/mailer 电子邮件消息。见使用方法。
此插件管理的电子邮件模板是 Twig 模板,您可以通过 web UI 进行编辑。每个“模板”可以本地化为多种语言。
模板以 YAML 文件的形式存储在文件系统中,使用 Gaufrette。这允许您与项目源代码一起进行版本控制。
先决条件
此插件依赖于 devture/form。
在您能够使此插件工作之前,您需要一个正常的 devture/form
设置。
至少,您需要定义以下服务(可能在 AppBundle
中的 devture-form.yaml
文件中)
services: _defaults: autowire: true autoconfigure: true public: false Devture\Component\Form\Token\TemporaryTokenManager: arguments: $validityTime: 3600 $secret: "%env(APP_SECRET)%" $hashFunction: sha256 Devture\Component\Form\Token\TokenManagerInterface: alias: Devture\Component\Form\Token\TemporaryTokenManager Devture\Component\Form\Twig\FormExtension: tags: [twig.extension] Devture\Component\Form\Twig\TokenExtension: tags: [twig.extension]
此外,您的 config/packages/twig.yaml
需要添加以下路径:"%kernel.project_dir%/vendor/devture/form/src/Devture/Component/Form/Resources/views"
安装
通过 composer 安装(composer require devture/symfony-email-template-bundle
)。
添加到 config/bundles.php
Devture\Bundle\EmailTemplateBundle\DevtureEmailTemplateBundle::class => ['all' => true],
配置
您可以将以下配置放入 config/packages/devture_email_template.yaml
devture_email_template: email_template_storage_path: "%kernel.project_dir%/asset/email-template" locales: - {"key": "en", "name": "English"} - {"key": "ja", "name": "Japanese"} fallback_locale_key: en email_wrapper_path: "@DevtureEmailTemplate/email-wrapper.html.twig" webui_twig_layout_path: "base.html.twig" editable: "%kernel.debug%"
email_template_storage_path
是模板存储的目录。它需要可以被您的 web 服务器用户写入。
locales
需要包含您要将电子邮件模板翻译成的所有语言。
fallback_locale_key
指定如果模板在请求的语言中不可用,则回退到的语言。
email_wrapper_path
是实际电子邮件消息的布局文件。此插件提供了一个示例(@DevtureEmailTemplate/email-wrapper.html.twig
),但您也可以自己制作。
webui_twig_layout_path
是您的布局文件路径,其中包含电子邮件模板系统的 web UI。唯一的要求是它定义了一个 content
块和一个 js
块。翻译系统将在 content
块中渲染其 HTML 内容,并在 js
块中渲染其 JS 代码。
示例布局文件
<!doctype html> <html> <body> <h1>Website</h1> {% block content %}{% endblock %} <script type="text/javascript"> {% block js %}{% endblock %} </script> </body> </html>
editable
控制是否可以通过 web UI 编辑模板,或者是否只以只读方式显示。在任何情况下,您的生产环境都不会挂载 web UI 路由,从而防止所有编辑。
路由示例
您可能希望仅在开发(dev
)环境中激活此插件的 web UI。因此,您可以将以下路由配置放入 config/routes/dev/DevtureEmailTemplateBundle.yaml
DevtureEmailTemplateBundleWebsite: prefix: /{_locale}/email-template resource: "@DevtureEmailTemplateBundle/Resources/config/routes/website.yaml" requirements: _locale: "en|ja"
Web UI 可在 devture_email_template.manage
路由下访问。
Web UI
模板可以作为 HTML 编辑(它们毕竟是 Twig “文件”)。此插件依赖于 CKEDITOR 4 作为富文本编辑器。
您可以在模板文件中通过常规 <script>
标签在某个地方加载它。
或者,您可以通过 comploader 通过将其定义为名为 ckeditor4
的库来加载它,如下所示
<script> comploader.register("ckeditor4", { "scripts": [ { "url": "https://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.8.0/ckeditor.js", "integrity": "sha384-O5mWK3ANYOTVEe9IPtX3AglPo9YiJ4txOJlcCuY1DJf9Bawr3wUvQiVe1H5NvNlh" } ] }); </script>
样式
此软件包依赖于Bootstrap v4进行样式设计。除非你安装并包含它(在你的webui_twig_layout_path
模板中某处),否则页面看起来会很丑。
此外,你还可以通过在webui_twig_layout_path
模板或CSS文件中包含每个语言的标志图标,使页面看起来更美观。
<style> .devture-email-template-flag { border: 1px solid #dbdbdb; width: 20px; height: 13px; display: inline-block; vertical-align: text-top; } .devture-email-template-flag.en { background: url('/images/flag/en_US.png') no-repeat; } .devture-email-template-flag..ja { background: url('/images/flag/ja_JP.png') no-repeat; } </style>
使用方法
假设你创建了一个名为user/registered
的模板,其中包含一些内容,如下所示
Hello {{ user.name }}! Welcome to <a href="{{ path('homepage') }}">our website</a>!
要使用此模板发送电子邮件,你会这样做
use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Devture\Bundle\EmailTemplateBundle\Helper\MessageCreator; class UserRegistrationController extends AbstractController { public function register(Request $request, MessageCreator $messageCreator, \Swift_Mailer $mailer) { // Actually handle registration here.. $user = $this->registerUser($request); $templateData = [ 'user' => $user, ]; $message = $messageCreator->createMessage('user/registered', $request->getLocale(), $templateData); // Set these.. $message->from($senderAddress); $message->to($receiverAddress); $mailer->send($message); } }