//smarty.net/manual/ru/ї
3. Детали реализации
Итак, начнём с установки
движка. Для этого посетите страницу //www.smarty.net/download.php и скачайте
последнюю версию. На текущий момент это версия от 5-го марта 2007 года. В архиве
находится каталог Smarty со всеми необходимыми для работы классами и плагинами.
Всё что нам потребуется знать о ней в рамках данной статьи – это каталоги templates
и templates_c. Каталогу templates_c необходимо дать права на запись, т.к. в неё
будут сохраняться системой откомпилированные шаблоны.
Рассмотрим работу с движком на уровне кода:
<?php
//Инициализация класса и установка начальных параметров:
//инициализируем смарти
require_once('smarty/Smarty.class.php');
//Создаём обьект класса
$smarty = new Smarty();
//Устанваливаем папки шаблонов
$smarty->template_dir = 'templates';
$smarty->compile_dir = 'templates_c';
//Передача данных из БД в шаблон:
//открытие соединения
//Получение данных их БД
$DB->query("SELECT * FROM news ORDER BY ID LIMIT 0,10");
//Передача массива с данными в шаблон в переменную news
//Примечание: в методе fetchrowset() данные были предварительно помещены в ассоциативный
//массив, имя которого соответсвует полю в таблице
$smarty->assign('news', $DB->fetchrowset());
//Допустим что наша задача была в простом выводе данных в шаблон, что мы уже и сделали, и это
//конечный этап – вызываем метод display() класса smarty, который выводит, передаёт данные в
//шаблон, перекомпилирует (если были изменения) и выводит контент.
//Методу передается имя файла шаблона, в котором как предполагается был обработан нужным
//образом массив news
$smarty->display('index.tpl.html');
?>
Теперь рассмотрим непосредственно файл шаблона index.tpl.html, фактически это обычный html с
вставками переменных и конструкций циклов. Все переменные в движке заключены в фигурные скобки.
Следующий пример демонстрирует.
<html>
{foreach from=$news item=item}
Заголовок: {$item.title}
Teкст новости:
{item.description}
Полная версия: <a href="index.php?id={$item.id}">Подробнее...</a>
{/foreach}
</html>
Вот собственно и всё, это рабочий пример, который будет выводить 10 извлечённых нами новостей из базы данных.
Теперь рассмотрим далее, как реализуется манипуляция загрузкой шаблонов для вывода например подробной новости если
запрошен параметр id, в противном случае главной страницы:
В каталог templates поместим ещё два файла, home.tpl.html и full.tpl.html
Добавим в код php условие запроса подробной новости
if(isset($_GET['id']))
{ //Запросы к БД, обработка данных
//В переменную main_content_template поместили имя шаблона, который будет загружен в главный index.tpl.html шаблон
$smarty->assign('main_content_template', 'full.tpl.html');
}
Else
{
$smarty->assign('main_content_template', 'home.tpl.html');
}
Немного модифицируем html файл, поместив цикл в файл home.tpl.html
Теперь подключим дополнительный шаблон:
<html>
{include file=$main_content_template}
</html>
Сейчас в файл index.tpl.html будет подключаться дополнительный файл, в соответствии с переменной main_content_template,
т.е. либо контент на главной – либо контент в подробнее.
Обычные значения переменных передаться тем же методом assign(), только в шаблон выводяться непосредственно {$name},
которое было определенно в первом аргументе метода.
Управляющие структуры реализуются аналогично,
{if $param == 10} html код, либо любые другие операторы, циклы, управляющие структуры и т.п. {/if}
И немного о реализации многоязычности.
Допустим сайт должен поддерживать два языка: русский и английский.
Добавим соответствующие параметры на сайте, выбрав которые данные о выбранном языке будут записаны в сессию,
БД или куда угодно ещё.
Создадим языковой два языковых файла, с набором констант такого вида:
<?php
define('BUTTON_LOGIN', 'логин');
//…
?>
Аналогично англоязычный файл и сколько угодно других.
Т.е. инклудим в скрипте соответствующий языковой файл.
В шаблонах смарти доступ к константам осуществляется следующим образом:
{$smarty.const.BUTTON_LOGIN} – соответственно BUTTON_LOGIN имя константы.
Если вдруг появится необходимость использовать php код прямо в шаблоне,
то помещаем в шаблоне блок {php}{/php} – между тегами php код, без параметров .
Ещё существует проблема, когда в коде шаблона вставлены блоки java script, некоторые его операторы,
в частности if, компилятор smarty будет рассматривать как операторы smarty.
Поэтому JS код лучше выносить в отдельные файлы, либо вокруг кода ставить оператор
{literal}{/literal}, внутри этого оператора компилятор не будет искать другие операторы smarty.
В статье не раскрыто очень много, она лиш создана для минимального ознакомления с возможностями и назначением движка.
Smarty предоставляет больше половины функций php по работе со строками в шаблонах, математические функции и прочее.
Подробно все функции описаны в официальном мануале на //smarty.net/manual/ru/ї
Автор: Виталий Колесникї