Появилась необходимость создания сайта работающего на нескольких языках. Перебрав в голове несколько вариантов, решил что самым удачным будет использование шаблонизатора, тем более его внедрение назревало уже давно. С его помощью код сайта будет отделен от его представления(HTML кода). Таким образовым, не меняя PHP код мы сможем быстро менять представление сайта и тем самым получим возможность легкого добавления необходимого количества языков.
Споры по поводу применения готовых шаблонизаторов(и Smarty в частности) не угасают до сих пор, в комментариях к каждой статье на эту тему можно найти огромное количество записей про то, что использование готовых шаблонизаторов по совершенно разным причинам неоправданно. Проанализировав данные сообщения, лично я, пришел к выводу, что все они оставлены в основном начинающими программистами, а так же людьми которые очень любят все изобретать заново. Рано или позно, но веб-разработчик приходит к необходимости использования шаблонизатора.
В маленьких сайтах конечно использование шаблонов не слишком оправдано, но когда сайт достаточно большой и особенно если при создании задействованы несколько человек(один работает с кодом, а другой ничего не понимая в коде свободно может менять дизайн сайта), то использование шаблона просто необходимо. Появляется возможность достаточно легко масштабировать сайт и наращивать его функциональность. Да и просто просмотр и написание чистого PHP (или HTML) кода намного приятнее чем смеси из различных языков.
Сейчас в сети можно найти огромное количество различных шаблонизаторов и просто способов создания шаблонов(вплоть до простого применения str_replace). У меня не стоит задача рассматривать их все и поэтому я решил взять, пожалуй, один из самых популярных - Smarty. Главными его особенностями являются: компиляция в один проход, возможность включения PHP-кода прямо в шаблон, встроенный механизм кэширования, возможность подключения плагинов, наличие отладочной консоли и ещё много разнообразных функций. Данный шаблонизатор обладает довольно мощными механизмами для расширения функционала(маштабируемость) и о его более продвинутом применении будет рассказано в следующих статьях.
Итак, давайте рассмотрим как же все это работает. По умолчанию Smarty заточена под схему разработки модель-представление-контроллер(Model-view-controller). Model (ядро) здесь — совокупность источника данных и функций, работающих с этими данными на базовом уровне (прочитать, записать, изменить). View — шаблон, отвечающий за внешний вид страницы. Controller (контроллер) — совокупность прикладной логики веб-приложения, которая обеспечивает обработку данных, полученных от ядра или пользователя, выбор шаблона и вывод результата на экран. Если объяснить совсем по простому, то это выглядит примерно так: вы пишите код, который создает набор данных для шаблона, отдаете вместе с названием шаблона Smarty и тот все объединяет, выводя в браузер результат. Это и есть так называемая MVC.
- Model-view-controller
- templates - директория, где мы будем хранить созданные шаблоны;
- templates_c - директория, где Smarty будет хранить скомпилированные шаблоны;
- configs - директория для хранения конфигурационных файлов;
- cache - директория для кэша.
<html>
<head>
<title>{$title}</title>
</head>
<body> {* Комментарий, которого не будет в HTML коде *}
<p>{$body_text}</p>
<small>{$smarty.now|date_format:"%d-%m-%Y %H:%M:%S"}</small>
</body><!-- Комментарий, который будет в HTML коде -->
</html>
Файл index.php
require_once('Smarty.class.php'); //подключаем smarty
$smarty = new Smarty(); //создаем новый экземпляр класса
$smarty->template_dir = './templates/'; //задаем адреса для рабочих папок
$smarty->compile_dir = './templates/compile/';
$smarty->cache_dir = './templates/cache/';
$smarty->caching = false; //выключаем кэширование
$smarty->debugging = true; //включаем режим отладки(отладочную консоль)
$smarty->assign('title', 'Пример использования Smarty'); //назначаем переменные для шаблона
$smarty->assign('body_text', 'Это текст, выведенный ф-цией assign()');
$smarty->display('index.tpl'); //публикуем шаблон
Переменные в шаблоне могут быть нескольких типов:
- Переменные, значение которым присваивается в php-скрипте пользователя, должны иметь перед именем знак доллара. Например: {$first_name}
- Элементы массива, значения которых были присвоены в php-скрипте пользователя, доступны в шаблоне с помощью синтаксиса {$имя_массива.ассоциативный_ключ}. Например: {$person.last_name}
- Элементы не ассоциативного массива доступны с помощью синтаксиса квадратных скобок: {имя_массива[числовой_индекс]}. Например: {$person[2]}
- Свойства объектов, заданные в php-скрипте, доступны в шаблоне с помощью такого синтаксиса: {имя_объекта->имя_свойства}. Например: {$person->email}
- Переменные, загруженные из конфигурационных файлов , заключаются между символами #. Также они доступны как элементы ассоциативного массива $smarty.config. Например: {#bodyBgColor#} или {$smarty.config.bodyBgColor}
{include file='templates/header.tpl'}
Главная страница
{include file="$tpl_name.tpl"} {* Подключаем блок с заранее не известным именем *}
{include file='templates/footer.tpl'}
Очень полезной функцией является возможность использования оператора условия - {if}:
{if $var > 5}
Переменная, полученная шаблоном больше 5.
{else}
Переменная, полученная шаблоном меньше или равна 5.
{/if}
Для подключения JavaScript существует специальный блок - {literal}{/literal}, который выключит обработку шаблона в данном месте. Необходимость его применения появится когда Вы захотите вставить в шаблон скрипт содержащий фигурные скобки - {} (например JQuery скрипт). Поскольку такие скобки используются самим Smarty для обозначения переменных, он резонно выдаст ошибку на инородную конструкцию.
{literal}
<script type=”text/javascript”>
function hello()
{
alert(“Hello world!”);
}
</script>
{/literal}
А теперь я приведу более сложный пример иллюстрирующий вывод массива данных.
Файл news.php
require_once('Smarty.class.php'); //подключаем smarty
$smarty = new Smarty(); //создаем новый экземпляр класса
$smarty->template_dir = './templates/'; //задаем адреса для рабочих папок
$smarty->compile_dir = './templates/compile/';
//Получаем массив данных из таблицы MySQL
$news = $DB->query("SELECT id, title, description FROM news ORDER BY id");
$smarty->assign('news', $news); // передаем массив в шаблонизатор
$smarty->assign('title', 'Список новостей');
$smarty->display('news.tpl'); //публикуем шаблон
Файл news.tpl
<html>
<head>
<title>{$title}</title>
</head>
<body>
{* подключаем шапку шаблона *}
{include file='header.tpl'}
{foreach from=$news item=item}
Заголовок новости: {$item.title}
Текст новости:
{item.description}
<a href="index.php?page=news&id={$item.id}">Подробнее...</a>
{/foreach}
{* подключаем footer шаблона *}
{include file='footer.tpl'}
</body>
</html>
Важно запомнить, что все отображаемые данные должны быть сформированы в скрипте до передачи в шаблонизатор! Работать с данными в самом шаблоне не нужно, он не для этого.
Думаю для понимания смысла работы механизма шаблонов Smarty этого будет достаточно, теперь вы свободно сможете создавать простые шаблоны, а немного потренировавшись и более сложные.
Замечу, что представленный шаблонизатор довольно тяжелый и поэтому появилась его облегченная версия - TemplateLite. Вот результаты тестов с официального сайта выполненные на PHP 5.1.1.
[caption id="attachment_185" align="aligncenter" width="300"]
Сравнение скорости работы Smarty и TemplateLite[/caption]
На этом пожалуй все. Кто хочет более глубоко изучить возможности Smarty, может посмотреть список модификаторов или доступных функций описанных в документации с официального сайта (на русском).
{literal}
