"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: " отличающийся только тем, что шаблон перекомпилируется каждый раз заново.