我有一個簡單的電子郵件()類。它用於從我的網站發送電子郵件。使用模板的電子郵件功能。包括通過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