Давно хотел добавить поддержку шаблонов Smarty - т.к. привык к нему и мне намного удобнее выводить сложные массивы и писать условия, при этом не заморачиваясь с кучей сниппетов, префиксами в плейсхолдерах итп. В работе я использую только свои модули - данные храню в собственных таблицах, а для вывода использую снипет, делающий выборку из базы. В результате получются массивы с данными. Сначала для вывода использовал такой подход: делал плейсхолдер с массивом, потом вызывал сниппет foreach, который по переданному имени плейсхолдера и чанку формировал вывод. В снипете foreach для каждого элемента массива парсил чанк, передавая ему ассоциативный массивчик с данными. Вроде как нормальный подход, но когда пришлось еще и условия писать, у меня появилось множество дополнительных сниппетов - if, condition итд. В итоге огромное колличество нечитаемого кода.
Сейчас же все изменилось. Smarty отлично выполняет совю работу! Теперь мне достаточно вызвать снипет для выборки данных и потом вызвать снипет Smarty, передав ему имя чанка, содержащего смарти шаблон.
Вообщем хочу поделиться идеей, может кому и пригодится.
- Создаем папку /assets/snippets/smarty/
- В ней папки templates и templates_c
- В папке templates создаем файл base.tpl со следующим содержимым:
- Скачиваем smarty http://www.smarty.net/download
- Распаковываем скачанный архив и копируем папку lib в созданную нами папку smarty
- Создаем новый сниппет Smarty со следующим содержимым:
<?php
if (isset($tpl)) {
$smarty_path = $modx->config['base_path']."assets/snippets/smarty/";
include_once $smarty_path."libs/Smarty.class.php";
$smarty = new smarty();
$smarty -> template_dir = $smarty_path."templates/";
$smarty -> compile_dir = $smarty_path."templates_c/";
$smarty -> assign('phr', $modx -> placeholders);
$smarty -> assign('document', $modx -> documentObject);
$smarty -> assign('template', $modx -> getChunk($tpl));
return $smarty -> fetch('base.tpl');
}
return 'no template';
?>
- Пользуемся [[Smarty? &tpl=`smarty_chunk`]]. Все плейсхолдеры доступны в переменной $phr. Данные страницы в переменной $document.
Пример вывода заголовка страницы в шаблоне смарти:
<h1>{$document.pagetitle}</h1>
Появилась идейка по более глубокому внедрению смарти. Как закончу с обмозговыванием, выложу сюда же.