【发布时间】:2011-02-11 02:26:11
【问题描述】:
我使用这个函数来加载模板文件:
public function loadTemplate ($replaceToken = array(), $path = 'master.tpl') {
$template = $this->tru->objectFactory('file', $this->tru->config->get('root.path').'/lib/template/email/'.$path);
$templateContent = $template->readAll();
if (count($replaceToken) > 0) {
foreach ($replaceToken as $token => $value) {
$templateContent = str_replace('{$'.$token.'}', $value, $templateContent);
}
}
return $templateContent;
}
它允许我调用变量,例如{$title}。现在,对于非常基本的电子邮件,这已经足够了。但现在我已经到了需要使用循环的地步,因此需要能够在这些 .tpl 文件中运行 PHP。我正在努力确定最佳路线,我知道 eval() 很少是一个好的解决方案,但这是他正确的解决方案吗?
这是我的一个 tpl 文件的示例:
<tr style='border-top: 1px solid rgb(204, 204, 204); border-bottom: 1px solid rgb(204, 204, 204);'>
<td style='border-color: #ccc; border-style: solid none; border-width: 1px medium; color: #494949 !important; padding: 5px 10px !important; font-size: 12px;'>Description</td>
<td style='border-color: #ccc; border-style: solid none; border-width: 1px medium; color: #494949 !important; padding: 5px 10px !important; font-size: 12px;'>Vehicle</td>
<td style='border-color: #ccc; border-style: solid none; border-width: 1px medium; color: #494949 !important; padding: 5px 10px !important; font-size: 12px; text-align: right;'>Unit price</td>
<td style='border-color: #ccc; border-style: solid none; border-width: 1px medium; color: #494949 !important; padding: 5px 10px !important; font-size: 12px; text-align: right;'>Qty</td>
<td style='border-color: #ccc; border-style: solid none; border-width: 1px medium; color: #494949 !important; padding: 5px 10px !important; font-size: 12px; text-align: right;'>Amount</td>
</tr>
<?
foreach ($order['productList'] as $product) {
?>
<tr>
<td style='padding: 10px; border-bottom: 1px <?=$product['border']?> rgb(204, 204, 204); color: #666 !important;'><?=$product['title']?></td>
<td style='padding: 10px; border-bottom: 1px <?=$product['border']?> rgb(204, 204, 204); color: #666 !important;'><?=$product['vehicle']?></td>
<td style='padding: 10px; border-bottom: 1px <?=$product['border']?> rgb(204, 204, 204); color: #666 !important; text-align: right;'>$<?=$product['price']?></td>
<td style='padding: 10px; border-bottom: 1px <?=$product['border']?> rgb(204, 204, 204); color: #666 !important; text-align: right;'><?=$product['quantity']?></td>
<td style='padding: 10px; border-bottom: 1px <?=$product['border']?> rgb(204, 204, 204); color: #666 !important; text-align: right;'>$<?=$product['lineTotal']?></td>
</tr>
<?
}
?>
<tr>
<td colspan='3'></td>
<td style='padding: 2px 5px; text-align: right; font-size: 12px;'>Subtotal</td>
<td style='padding: 2px 5px; text-align: right; font-size: 12px;'>$<?=$order['subtotal']?></td>
</tr>
更新
像这样使用eval() 有哪些安全风险:
public function loadTemplate ($replaceToken = array(), $path = 'master.tpl') {
$template = $this->tru->objectFactory('file', $this->tru->config->get('root.path').'/lib/template/email/'.$path);
$templateContent = $template->readAll();
if (count($replaceToken) > 0) {
foreach ($replaceToken as $token => $value) {
$$token = $value;
$templateContent = str_replace('{$'.$token.'}', $value, $templateContent);
}
}
ob_start();
eval('?>'.$templateContent.'<?');
$templateContent = ob_get_contents();
ob_end_clean();
return $templateContent;
}
我想不出这怎么会不安全。即使它们包含 PHP 代码的变量也不会被 eval() 处理,因此我们的 .tpl 文件(无论如何都需要我们自己的开发人员访问)
【问题讨论】:
标签: php template-engine