允许用户选择要在CakePHP中的电子邮件模板中使用的字符串

时间:2016-06-02 10:18:24

标签: cakephp cakephp-3.0

我们有一些电子邮件模板,基本模板如下:

<p> Hi <?= $name?>,</p></br>
<p> A new task has been assigned to you. Please check your tasks list. </p>

如果用户希望翻译基本文本,我们需要允许用户插入自己的文本。

最简单的方法显然会为每个用户存储两个字符串/翻译:

"Hi"
"A new task has been assigned to you. Please check your tasks list."

然后只是为了选择它们,但问题就出现了,例如用户只想让电子邮件说:"New task has been assigned"而没有任何影响。

问题是:我们如何允许用户存储字符串,包括html标签和php变量的名称?

所有模板都很简短,最多包含3个php变量

如果有任何其他有价值且我可以提供的信息,请询问。

2 个答案:

答案 0 :(得分:1)

使用某种形式的令牌将您的电子邮件模板HTML存储在数据库中,以表示可变数据,例如$name,然后使用str_replace替换令牌以获取实际值。例如,如果您的数据中有令牌,例如${name}${message}: -

$body = str_replace(
    [
        '${name}',
        '${message}'
    ], 
    [
        $name,
        'Foo bar'
    ],
    $body
);

然后,您可以将$body传递给CakeEmail并正常发送电子邮件。

这是我希望允许用户自定义系统生成的任何电子邮件中的文本并且运行良好时,我倾向于使用电子邮件的方法。

答案 1 :(得分:1)

  

我们需要允许用户根据需要插入自己的文本   翻译基本文本。

     

..我们决定将它们存储在数据库中

简单的解决方案。

在前端允许用户创建自己的电子邮件文本,并存储在数据库中,如:

<p> Hi {{name}},</p></br>
<p> A new task has been assigned to you. Please check your tasks list. </p>
<hr>
<p>Best regards,</p>
<p>{{admin}}</p>
<p>{{email}}</p>

如您所见,{{name}},{{admin}},{{email}}为可变占位符。

在渲染电子邮件或html页面之前的后端使用str_replace()php函数查找变量占位符并替换为其他值:

$tpl = $user->template; // load from db
$tpl = str_replace("{{name}}", $user->name, $tpl);
$tpl = str_replace("{{admin}}", $admin->name, $tpl);
$tpl = str_replace("{{email}}", $admin->email, $tpl);

echo $tmpl;

或者drmonkeyninja的回答

   $tpl = str_replace(
      [
         '{{name}}', 
         '{{admin}}', 
         '{{email}}'
      ],
      [
         $user->name,
         $admin->name,
         $admin->email
      ],
      $user->template // load from db
   );
   echo $tpl;