如何在每封电子邮件发送前调用一个函数?
How do I call a function before every email send?
我有大约 50 种不同的电子邮件模板,其文本会根据收件人动态变化。我不想为每个可能的案例制作不同的模板并在数十个不同的控制器文件中包含类似的逻辑,我想在每个模板中包含一些案例切换并对每封电子邮件应用案例确定变量。
例如,典型的模板可能如下所示:
<? if ($case) { ?>
<p> text variation 1 </p>
<? } else { ?>
<p> text variation 2 </p>
<? } ?>
$case
将由函数 beforeEmail($to_address)
设置,该函数根据收件人电子邮件对案例进行所有计算。这些计算对于每封电子邮件都是相同的。如何让 beforeEmail()
在每次发送电子邮件时都被呼叫?或者更准确地说, 我应该在哪里放置 beforeEmail()
函数?
通常我会在视图文件控制器中添加这种代码,但是电子邮件视图文件没有控制器。我玩过在某个地方制作 beforeEmail()
静态函数并在每个视图文件中调用它,但这看起来很乱而且是错误的(它让我在视图文件中调用函数,并在 50 多个文件中重复代码) .
编辑:我也试过在布局文件中设置 $case
变量,但事实证明布局是在电子邮件视图文件加载之后加载的,因此在布局中设置的变量不能用于查看文件。
如果有人遇到类似问题,我最终修改了核心 CakeEmail 库的 send() 方法。虽然它并不理想,但这是我能找到的获得我想要的行为的唯一方法(无需在各处创建重复代码)。
不起作用的东西:
-Callbacks/events - CakeEmail class 不提供回调。
- 创建自定义传输 - 在 呈现电子邮件后调用传输。
-将代码放入通用布局文件中 - 在呈现电子邮件的视图文件之后呈现布局。