2011-02-10 4 views
0

Я использую эту функцию, чтобы загрузить файлы шаблона:Помощь оценке PHP в .TPL файлов

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() 'd, поэтому наши .tpl-файлы (которые требуют нашего собственного доступа к разработчику в любом случае)

+1

вы используете умник? – kjy112

ответ

0

Вы можете взять вызов и написать себе собственный парсер для этой проблемы.

Более простой и более подходящий способ для вашего вопроса - использовать уже существующие шаблонные двигатели, такие как Smarty. С его помощью вы можете либо определить собственные функции (так называемые «блоки»), которые выполняют фактическое выполнение PHP, либо используют предопределенные директивы ({foreach ...}).

Это будет довольно гладко с вашим существующим шаблоном, поскольку Smarty оценивает переменные шаблона, как в вашем примере: они выражаются как {$variable}.


EDIT

Я чувствую себя плохо, печатаю это. eval на самом деле опечатка. a на самом деле является i. Здесь мы идем:

Это путь для достижения своей цели но пожалуйста не использовать это в производственной среде:

$template = '<?php for($i = 0; $i < 10; $i++) { ?> 
    <b>something</b><?php 
} ?>'; 

eval('?>' . $template); 

Это codepad snippet дает демонстрацию десяти «Foo» с ,

+0

Я использовал Smarty раньше ... Я хотел бы просто выполнить некоторые базовые PHP (эхо-переменные и циклы) без накладных расходов сложного приложения, такого как Smarty – Webnet

+2

@Webnet Извините, тогда, приятель. Вам нужно будет разработать ** хороший ** парсер, который отличает ваш HTML от PHP. И это * комплексно. Для такого простого требования вам лучше использовать Smarty/''. –

1

Это выглядит как яркий ярлык. Если это так, вы переносите PHP в тег {php}.

Изменить, чтобы добавить образец кода:

This is a smarty tag: {$title} 

{* this is a smarty foreach loop *} 
{forach from=$some_array item=i} 
    {$i} 
{/foreach} 

{php} 
// this is literal PHP within a smarty template 
foreach ($some_array as $k=>$v) { 
    print $k.'=>'.$v.'<br />'; 
} 
{/php} 
+0

Но как я могу выполнить цикл? – Webnet

+0

тэг {php} для smarty – kjy112

+0

Отредактированный ответ, чтобы включить образец кода для Smarty ... хотя вы еще не подтвердили, что действительно используете его. –

Смежные вопросы