понедельник, 30 июля 2012 г.

Smarty и рассылка писем

"Smarty это - движок шаблонов (шаблонизатор) для PHP. Точнее, он предоставляет легко управляемый способ отделения логики и содержания приложения от его внешнего вида." ©документация.

Ещё не встречал случаев, когда в приложениях просто необходимо отделять логику от отображения. Возможно мне не приходилось работать с такими большими задачами. В моей практике я использую Smarty немного иначе, что можно понять из заголовка.

Установка Smarty подробно описана в документации. Только отмечу, что гораздо удобнее использовать продвинутую установку, т.е. создать свой класс, расширяющий класс Smarty и задающий начальные установки:

require_once('Smarty-X.X.XX/libs/Smarty.class.php');


class MySmarty extends Smarty
{
 function __construct()
 {
  parent::__construct();

  $this->template_dir = CWD . '/modules/Smarty-X.X.XX/templates/';
  $this->compile_dir = CWD . '/modules/Smarty-X.X.XX/templates_c/';
  $this->config_dir = CWD . '/modules/Smarty-X.X.XX/configs/';
  $this->cache_dir = CWD . '/modules/Smarty-X.X.XX/cache/';

  //$this->caching  = Smarty::CACHING_OFF;
  //$this->debugging  = true;
  //$this->error_reporting = E_ALL;
 }
}

$Smarty = new MySmarty();

При обычном использовании шаблоны Smarty отображаются функцией display() :

$Smarty->assign('lang_code', 'RU');
$Smarty->assign('curr_date', date('d.m.Y') );

$Smarty->display('test_templ.tpl');

В моём случае была задача введения переменных в тело письма при автоматизированных рассылках с помошью скрипта. Переменные (дата, имя, фамилия и т.д.) вставляются оператором в тексты стандартных писем, и во время самой рассылки переменные в каждом письме должны подменяться соответствующей информацией.

Я решил попробовать использовать Smarty для этой цели. Как оказалось функции display() и fetch() используют понятие ресурс: в первом параметре, перед основным значением можно вставить строку "string: " и тогда остальное значение будет воспринято как текст шаблона вместо пути к файлу. И в сочетании с функцией fetch(), возвращающей результат в виде строки, это всё что нужно для моей задачи.

В этом схематичном примере сначала Smarty переменные в тексте заменяются нужными значениями, затем текст вставляется в подготовленный заранее шаблон с HTML:

set_time_limit(0);

require_once(CWD . '/modules/Smarty.php');

while (true)
{
 $res = db_query('...');

 while ($row = db_fetch($res))
 {
  $Smarty->assign('FirstName',  $row['first_name']);
  $Smarty->assign('LastName',  $row['last_name']);

  $text_ready  = $Smarty->fetch('string: ' . $row['text']);
  $Smarty->assign('text',  $text_ready);

  $mail_body  = $Smarty->fetch(CWD . 'mail/generic_templ.tpl');


  mail($row['to'], $row['subj'], $mail_body);

  db_query('...'); // set mail as sent

  $Smarty->clearAllAssign();
 }
}

Помимо "string: " для работы со строками есть ещё "eval: " отличающийся только тем, что шаблон перекомпилируется каждый раз заново.

Комментариев нет:

Отправить комментарий