|| разделы:: | |
|| поиск по сайту:: | |
|| реклама:: | |
|| новости почтой:: | |
Популярные статьи |
|
Hot 5 Stories |
|
|| рекомендуем:: |
|
| |
Шаблонизация приложений. Smarty.
1. Введение
Каждый рано или поздно
начинает задумываться об оптимизации своих приложений, структуризации кода и конечно
же полном отделении дизайна от логики. Именно о шаблонизации дизайна мы сегодня
и поговорим. В статье будет описан шаблонный движок Smarty. Почему именно Smarty?
Потому что это лучший на сегодняшний день бесплатный продукт, проверенный временем.
Мало того, он позволяет кэшировать шаблоны, предварительно компилируя их, в результате
чего может работать быстрее, чем приложения, в которых не используется шаблонизации
вообще. И так, обо всё по порядку.
2. О рассматриваемых в статье вопросах
В рамках текущей статье
будут рассмотрены основные моменты, наиболее часто применяемые в проектах средней
сложности. Это подключение шаблонизатора, передача значений и массивов в шаблон,
для дальнейшей обработки. Так же мы рассмотрим немало важный аспект – реализация
многоязычности приложений. И второй, и основной момент – работа с этими данными
в шаблоне. В пределах данной статьи я не буду рассматривать кэширование и принципы
написания плагинов для движка. С этим вы сможете ознакомиться самостоятельно, почитав,
мануал на //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/
Автор: Виталий Колесник
|
::::: sd1074 пишет 15.05.2007 @ 16:59 | |
Блин, ни фига себе... Три месяца занимаюсь веб-программированием на Перл. Слышал, что существуют шаблонизаторы. В рамках поставленной мной себе задаче пишу свой шаблонизатор... поразительно. Он жутко похож на этот Смарти! вполнть до фигурных скобок, хотя до этого момента не читал ничего про шаблонизаторы.
|
|
А теперь объясните мне, в чем выгода использования "пхп, написанного на пхп"? Чем проще использование смарти в данном конкретном случае? Вы хотите сказать, что код смарти - это есть "отделение дизайна от логики"? Т.е. мало того, что программисту надо изучать новые заморочки в новом языке, так этот язык шаблонов надо учить еще и дизайнеру,чтобы не напороть случайно ничего такого в этих самых tpl-ах, из-за расширения которых, кстати сказать, о подстветке синтаксиса в некоторых хтмл-редакторах можно забыть.
Блин, я все-таки серьезно туплю наверно, но я НИКАК не могу понять, в чем упрощение между:
{foreach from=$news item=item}
Заголовок: {$item.title}
Teкст новости: {item.description}
Полная версия: <a href="index.php?id={$item.id}">Подробнее...</a>
{/foreach}
и тем же например:
while(list($title, $text) = mysql_fetch_row($query)
{
Заголовок: =$title;
Teкст новости: =$text;
}
И это все при том, что для этого смарти еще надо кучу всего посоздавать, чтобы эта штука начала работать так, как работает 4 строчки чистого пхп кода.
|
|
::::: Артем пишет 21.05.2007 @ 23:45 | |
Для таких задач действительно лучше использовать php. Однако, когда проект большой - шаблонизатор в 80% случаях большая экономия времени и сил.
для банального foreach ты вряд ли будешь использовать Smarty. Но что может быть проще, чем Smarty, когда тебе надо:
- организовать многоязычность
- организовать возможность смены представления для пользователей
К тому же в Smarty включены плагины, которые позволяют создавать группу радио-кнопок одним тегом, использовать сторонние интересные приблуды типа overLib, datatable и т.д.
|
::::: Roman пишет 27.08.2007 @ 15:09 | |
ИХМО, статья - баян.
Smarty больше 5 лет, а статья не открывает ничего нового.
"Мало того, он позволяет кэшировать шаблоны, предварительно компилируя их, в результате чего может работать быстрее, чем приложения, в которых не используется шаблонизации вообще" - скомпилированные шаблоны - тот же php-код, так с какой стати он будет работать быстрее того же php-кода?!!!
|
::::: Алексей пишет 19.09.2007 @ 13:23 | |
Потому что он компилит шаблоны а кэширует все приложение. То есть к примеру нет необходимости делать повторный запрос к БД.
|
::::: Costic пишет 07.11.2007 @ 15:37 | |
В ПХП предусметрено кэширование, в том числе и кэширование результатов запросов, MySQL тоже кэширует запросы и их результаты, в результате - несколько пользователей активно пробежались по ссылкам и ВСЕ приложение у сервера в кэше с морем вариантов запросов. А то, что слабо кэшируется, оно и из-под Смарти стэком вылетит из кэша. Вывод - о какой компиляции может идти речь?
Если программеру по привычке допустимо и не очень заморочно освоить новую технологию, чтобы в будущем не перекраивать шаблоны, то попробуй заставь художника, ака дизайнера, который рисует на планшетке и знать ничего не хочет о том, что в HTML есть только два типа типа отображаемых элементов - построчные и блочные, и не хочет этого понимать, так вот заставь его изучить скриптовый язык и пусть он ковыряет шаблоны.
Слабо верится в выхлоп от использования этой системы, особенно после того, как посмотрел какого объема дока, одно радует - кроме супостатского есть дока и на идиотском русском, читать которую сложнее чем супостатскую.
|
|
Идиотский шаблонизатор. Шаблоны, более сложные чем например Integrated Template (HTML/Template/IT.php) - в топку. Особенно четко это видно, когда пробуешь пользоваться для их редактирования какой-нибудь Dreamweaver. Шаблон служит для отделения HTML от кода, точка. Так нет, Смарти и иже с ним опять мешает все в кучу. Начинается с маленького - вот сейчас мы выражения вычисляемые введем, затем регулярку подтянем, ну без циклов тоже никак. И по сути изобрели еще одну интерпретирующую прослойку. Для действительно сложных шаблонов очень давно придумана связка XML/XSLT со стандартными тулкитами. Не стоит заниматься изобретением N+1-го велосипеда.
К слову, использую для всех своих проектов упомянутый IT.php - который требует всего двух файлов, PEAR.php и IT.php, достаточно лёгок, и немаловажный плюс - очень прост для дизайнера, который не хочет грузить свои мозги какими-то там скриптами. Единственное, что пришлось сделать к стандарту - единожды написать обёртку для класса, которая разворачивает SSI директиву #include file="some.htm" (самое стандартное средство для включения повторяющихся элементов шаблона, опять же с оглядкой на Dreamweaver).
|
|
::::: Vufer пишет 24.01.2008 @ 11:16 | |
Господа... каждому свое. на тему "идиотский шаблонизатор" - напишите для начала нечто хоть отдаленно напоминающее смарти. Очень радует что вы используете IT, но статья была не о нем. Да нового в ней ничего нет но...
В дримвивере шаблоны смарти редактируются ИДЕАЛЬНО. Как раз он представляет собой практически чистый хтмл, без единого куска пхп кода.
Порадовала фраза про слабый выхлоп после оценки обьема доки... Уважаемый, вы видели справку винды? Или маны линухов? Тоже выхлоп слаб? Документация пхп?
Отчего все так любат затевать холивары на пустом месте... Или просто понты? :)
|
::::: Yury пишет 23.03.2009 @ 01:44 | |
Прошу прощения, но по моему полная ерунда. PHP шаблонизатор? Да нет ничего проще. Ну например здесь http://acvarif.info/wbsphp/movephp/tempphp.html Там кстати есть и развитие этой темы в виде простейшей любительской CMS с неплохим шаблонизатором на борту.
|
Я в поисках нормального руководства по смарти (от установки - до использования) наткнулась на эту статью, в которой для новичка нифига не понятно, например, в каком месте мы подключаем запрос к базе данных (ну откуда брать эту таблицу news???) и еще вы отсылаете на smarty.netб который не работает, так откуда же все брать?
|
::::: гость пишет 15.06.2009 @ 21:39 | |
спасибо, хорошая статья. может быть небольшой готовый проект на smarty в следующей статье?
|
Без сомнения, смарти избыточен и в ряде случаев только усложняет разработку скрипта, но пример шаблонизатора, который предлагает Yury - это пример новичкам, как делать не надо!
Первое, забить на глобальные переменные - это удар по безопасности. Второе, изначально задаваемые для преобразования переменные невелируют полезность данной методики. В итоге, получается, что для каждой страницы нужно писать свой "шаблонизатор" и при этом следить, чтобы переменные скрипта не были переопределены (или наоборот).. Такая методика может сойти, ИМХО, только лишь для 3-х страничного сайта, где есть потребность иметь несколько шаблонов дизайна.
|
| |