Основы использования шаблонизатора Smarty

Smarty Template EngineПоявилась необходимость создания сайта работающего на нескольких языках. Перебрав в голове несколько вариантов, решил что самым удачным будет использование шаблонизатора, тем более его внедрение назревало уже давно. С его помощью код сайта будет отделен от его представления(HTML кода). Таким образовым, не меняя PHP код мы сможем быстро менять представление сайта и тем самым получим возможность легкого добавления необходимого количества языков.

Споры по поводу применения готовых шаблонизаторов(и Smarty в частности) не угасают до сих пор, в комментариях к каждой статье на эту тему можно найти огромное количество записей про то, что использование готовых шаблонизаторов по совершенно разным причинам неоправданно. Проанализировав данные сообщения, лично я, пришел к выводу, что все они оставлены в основном начинающими программистами, а так же людьми которые очень любят все изобретать заново. Рано или позно, но веб-разработчик приходит к необходимости использования шаблонизатора.

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

Сейчас в сети можно найти огромное количество различных шаблонизаторов и просто способов создания шаблонов(вплоть до простого применения str_replace). У меня не стоит задача рассматривать их все и поэтому я решил взять, пожалуй, один из самых популярных — Smarty. Главными его особенностями являются: компиляция в один проход, возможность включения PHP-кода прямо в шаблон, встроенный механизм кэширования, возможность подключения плагинов, наличие отладочной консоли и ещё много разнообразных функций. Данный шаблонизатор обладает довольно мощными механизмами для расширения функционала(маштабируемость) и о его более продвинутом применении будет рассказано в следующих статьях.

Итак, давайте рассмотрим как же все это работает. По умолчанию Smarty заточена под схему разработки модель-представление-контроллер(Model-view-controller). Model (ядро) здесь — совокупность источника данных и функций, работающих с этими данными на базовом уровне (прочитать, записать, изменить). View — шаблон, отвечающий за внешний вид страницы. Controller (контроллер) — совокупность прикладной логики веб-приложения, которая обеспечивает обработку данных, полученных от ядра или пользователя, выбор шаблона и вывод результата на экран. Если объяснить совсем по простому, то это выглядит примерно так: вы пишите код, который создает набор данных для шаблона, отдаете вместе с названием шаблона Smarty и тот все объединяет, выводя в браузер результат. Это и есть так называемая MVC.

Model-view-controller

Перед началом работы нужно создать директории, необходимые для работы Smarty, по умолчанию имеющие такие имена(мы создадим немного другие, см. пример):

  • templates — директория, где мы будем хранить созданные шаблоны;
  • templates_c — директория, где Smarty будет хранить скомпилированные шаблоны;
  • configs — директория для хранения конфигурационных файлов;
  • cache — директория для кэша.

Рассмотрим простейший пример использования шаблона.  Для этого нам понадобятся два файла: файл шаблона — index.tpl и файл логики — index.php

Файл index.tpl — обычный html документ со специальными вставками

<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}

В Smarty допускается использование модификаторов, чтобы их применить  нужно указать его название после вертикальной черты, следующей за именем переменной, функции или строкой, к которой он применяется. Например, чтобы перевести значение переменной {$title} в верхний регистр, нужно применить к ней модификатор upper, т.е. написать следующее: {$title|upper}. Или как мы сделали в нашем примере, используя модификатор date_format для формирования текущей даты на основе переменной {$smarty.now}.

Для удобства пользования шаблоны можно разбивать на блоки, при вызове метода display(‘index.tpl’) главного шаблона, опубликуются все дочерние. Если имя одного из блоков задается только после обработки php скрипта, то имя блока можно передать внутри переменной. В таком случае имя подключаемого файла заключается не в одинарные кавычки, а в двойные.

Файл index.tpl

{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.

Сравнение скорости работы Smarty и TemplateLite

Сравнение скорости работы Smarty и TemplateLite

На этом пожалуй все. Кто хочет более глубоко изучить возможности Smarty, может посмотреть список модификаторов или доступных функций описанных в документации с официального сайта (на русском).

{literal}
Запись опубликована в рубрике HTML, PHP с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *