Когда-то на заре своей карьеры программиста мне в голову пришла, как тогда казалось, гениальная идея – отделить логику от представления. Я принялся писать свой парсер html-страниц :). Позже, я узнал, и для меня это было шоком, что все уже придумано до меня. Мне посоветовали Smarty, я попробовал, оказалось, что игрушка интересная. Но на одном проекте, это был большой сайт одного клуба по боям без правил, заказчик захотел, чтобы использовался совершенно неизвестный мне шаблонизатор — HTML_Template_IT из библиотеки PEAR.
Он совершенно отличается по своему принципу от Smarty – это, так называемый, пассивный шаблонизатор. В данном типе шаблонизаторов циклы, условия обрабатываются в php-файле, а страница разбита на блоки, которые парсятся отдельно друг от друга.
Но начнем с азов – инициализация шаблонизатора и подгрузка шаблона.
$Template = new HTML_Template_IT(); $Template-> loadTemplatefile(‘мой_файл.tpl’, true, true);
Кстати, в примере, который можно скачать (внизу поста) все выглядит несколько иначе, там все реализовано через класс BasicTemplate, который наследуется от HTML_Template_IT. Зачем он нужен, я опишу ниже, не отвлекаемся 🙂
Итак, переменные в шаблоне выглядят просто — {имя_переменной}. Подставить нужное вам значение можно в php-файле следующим образом:
$Template->setVariable(‘имя_переменной’, ‘значение переменной’);
Если вам необходимо за один раз установить несколько переменных, то можно в качестве параметра передать ассоциативный массив. В таком случае предыдущий пример будет выглядеть так:
$aVars = array(‘имя_переменной’ => ‘значение переменной’); $Template->setVariable($aVars);
Блоки — наиболее интересная часть этого шаблонизатора. Итак, допустим, нам нужно вывести какой-то див несколько раз с различными значениями. В шаблоне создаем, например, вот такой код:
<h3>Пример цикла</h3> Цифры от одного до пяти: <!-- BEGIN test_for --> <strong>{var_test_for}</strong> <!-- END test_for -->
Как некоторые уже догадались, блок выглядит так:
<!-- BEGIN имя блока --> Тело блока – все что вы хотите в нем отображать <!-- END test_for -->
Парсить блок можно также двумя способами – задать заранее блок потом определить ему переменные или вначале задать переменные, потом запарсить блок, я использую второй – он короче.
Итак, первый способ будет выглядеть так (выводим числа от одного до 5):
for($i=1;$i<6;$i++) { $Template ->setCurrentBlock('test_for ); $Template ->setVariable('var_test_for', $i); $Template ->parseCurrentBlock(); }
Второй, так:
for($i=1;$i<6;$i++) { $Template ->setVariable('var_test_for', $i); $Template ->parse('test_for'); }
Некоторые замечания по работе с блоками:
- Имя блока обязательно должно быть отделено пробелами
- Блок, для которого вы не установили ни одной переменной, не будет отображен при выводе, даже если вы вызовете: $Template ->parse(‘test_for’);
- Также наоборот – если вы установили какую-то переменную, но не вызвали $Template ->parse(‘test_for’), блок отобразится
Для того чтобы при определенном условии отобразить блок, в котором переменные не нужны можно использовать два способа – кривой:
Засунуть в блок переменную и запарсить её с пустым значением, типа:
$Template->setVariable('var_test_for', '');
И нормальный способ – вызвать touchBlock(), например:
$this->touchBlock('without_vars');
Ну и финальное – это отображение результата парсинга:
print $Template->show();
Вот наш результат. Архив, который вы можете скачать, содержит работающий код, приведенных примеров, но там есть класс BasicTemplate, от которого и наследуются все страницы. Он нужен для следующих целей: когда страниц много, для них всех есть одинаковые переменные, типа адреса сайта, папки со стилями, javascript файлами, картинками. Для того чтобы не парсить по нескольку раз одно и тоже, и создан этот класс, конечно не только, но об этом в следующих постах.
Кстати, стал замечать, что с курса где-то 5-го от интенсивной работы за компьютером мое зрение стало падать, раньше, были две единицы, еще в своем армейском взводе снайпером числился, сейчас, не уверен, что все так хорошо. Но, кажется, выход есть, друг моего блога С. Леднёв, опубликовал несколько способов сохранить зрение при работе за компьютером. Надеюсь, кому-нибудь, да поможет данная ссылка, ведь программист без зрения, как маршрутчик без перегара – если и есть, то ненадолго
Скачать архив с примером. Распаковываем себе на локалку, вызываем http://my-server:my-port/example.php, любуемся.
p.s. Сегодня город, который я считаю родным празднует день освобождения от немецко-фашистских захватчиков, жаль что я далеко.
Хорошая статья. Но, имхо, есть один недостаток — Вы не упомянули о том, что можно делать вложенные блоки. Например есть такая конструкция:
<!-- BEGIN table -->
{TABLE_header}
<!-- BEGIN row -->
{ROW_data}
<!-- END row -->
<!-- END table -->
Можно выполнить следующий код:
for(...)
{
$Template ->setCurrentBlock('row');
$Template ->setVariable('ROW_data', $smth_var);
$Template ->parseCurrentBlock();
}
$Template ->setCurrentBlock('table');
$Template ->setVariable('TABLE_header', $smth_data);
$Template ->parseCurrentBlock();
Да конечно, вы правы вложенные блоки делать можно. И не упомнялу я о них, т.к. думал, что оно понятно, например, на вложенных блоках сделана выпадающая меню на сайте Волковыска — Volkovysk.org
В одном из следующих постов приведу пример как с помощью этих шаблонов и php сделать листалку данных(навигатор) с сортировкой, постаничным выводом — формирует таблцицу из запроса
По моему, это кошмар.
Cейчас работаю над проектом, где используется шаблонизатор похожего принцыпа.
Это один геморой отделять блоки комментариями (хоть их и не видно юзеру), пустая трата набора символов. Вложенность блоков — просто тихий кошмар. Писать такой код не приятно, не читабельно, и сильно раздражает.
Грамотной составленный принцип движка дает возможность отказаться от подобных костылей.
Да и сам php замечательный парсер.
Опять же, все зависит от целей. Лично мне жутко не нравится смешивание php и html в одном файле. Вложенные блоки согласен, не самая простая работа, с одним меню выпадающим сколько навозился, вспомнить страшно :). Но я все-же склоняюсь больше к смарти, а о данном шаблонизаторе написал, т.к. он далеко не самый популярный, но в тоже время имеет право на жизнь, да и в блоге я рассказываю о своих буднях — вот и с таким пришлось столкнуться
с утра блог отдавал 500 ошибку…
Спасибо, гляну логи 🙂
Алекс то спамовый коммент, у меня такие же приходят, только для меня запятые не так критичны как для вас, то есть для ПХП
Спасибо, теперь с такими комментаторами Акисмет разбирается, а запятые интересовали так как хочется писать грамотно, стыдно за ошибки — пол родни учителя-гумманитарии, чего-то один я «технарь» уродился 🙂
ну ошибки в постах с запятыми, для меня не сильно критичны, всеже блог это дневник, а в дневнике как говорил князь с мультика — Что хочу то и ворочу 🙂 хотя как первый такой коммент пришел то немного не по себе было…
Просто как знаю, для кодера неправильный знак в коде это катастрофа 🙂
Ну если в коде то конечно 🙂 Но весь(вроде бы) код, который выкладываю сюда вначале проверяю на работоспособность