devture/symfony-email-template-bundle

Symfony 插件,提供基于 Twig 的电子邮件模板管理(持久化到文件系统)和消息准备。

安装次数1,372

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 4

分支: 0

开放问题: 0

类型:symfony-bundle

2.2.4 2024-01-10 09:13 UTC

This package is auto-updated.

Last update: 2024-09-10 10:27:42 UTC


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);
	}

}