我有一个简单的电子邮件()类。它用于从我的网站发送电子邮件。使用模板的电子邮件功能。包括通过ob_start和全局变量
<?
Email::send($to, $subj, $msg, $options);
?>
我也有一堆电子邮件模板用纯PHP编写的PHP变量刺穿。例如。 /inc/email/templates/account_created.php
:
<p>Dear <?=$name?>,</p>
<p>Thank you for creating an account at <?=$SITE_NAME?>. To login use the link below:</p>
<p><a href="https://<?=$SITE_URL?>/account" target="_blank"><?=$SITE_NAME?>/account</a></p>
为了有PHP乏渲染我不得不include
模板到我的功能。但由于include
不返回的内容,而是仅仅将其直接输出,我有缓冲功能,把它包起来:
<?
abstract class Email {
public static function send($to, $subj, $msg, $options = array()) {
/* ... */
ob_start();
include '/inc/email/templates/account_created.php';
$msg = ob_get_clean();
/* ... */
}
}
之后,我意识到PHP瓦尔不会呈现,因为他们正在功能范围之内,所以只好全球化里面的模板的变量:
<?
global $SITE_NAME, $SITE_URL, $name;
?>
<p>Dear <?=$name?>,</p>
...
所以,问题是是否有更优雅的解决方案呢?主要是我担心使用ob_start()
和global
的解决方法。出于某种原因,我觉得很奇怪。或者这很常见的做法?
嗯..这就像smarty模板的东西的作品,对吧?然而,变量仍然需要在函数内全球化。 – Geo
也许,我没有看到里面的Smarty代码:)关于变量 - 你可以提供它们作为send函数的附加参数。但更好的选择是将模板解析代码移动到另一个函数并将结果内容发送到函数 –
您可以用这种方式实际使用现有文件,替换整个PHP部分,所以类似'str_replace( '=name;?>','Some name',$ email_html);' – BenOfTheNorth