Я использую эту функцию для загрузки файлов шаблонов:
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}
. Этого было достаточно сейчас с очень простыми электронными письмами. Но теперь я дошел до того, что мне нужно использовать циклы и, следовательно, иметь возможность запускать PHP в этих файлах .tpl. Я изо всех сил пытаюсь определить лучший маршрут, я знаю, что 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 (которые в любом случае требуют нашего собственного доступа разработчика)