Введение в шаблонизатор Blitz
Введение в шаблонизатор Blitz
В теории - очень быстрый шаблонизатор. Буду тестить. Ниже введение в шаблонизатор Blitz... Из документации о Blitz: Чрезвычайно быстрый и мощный шаблонизатор для очень больших интернет-проектов.
Приведу несколько фактов:
Blitz — это блочный шаблонизатор, что принципиально отличает его от Smarty и подобных.
Smarty по сравнению с Blitz — язык программирования.
Синтаксис шаблонов Blitz основан на 3х конструкциях:
Циклы, условыне операторы и другой «богатый» синтаксис отсутствует. Это гарантирует разделение логики
приложения от логики представления. Как следствие, шаблоны с ростом проекта не превращаются в кашу.
С точки зрения организации кода, компонент View (MVC) можно условно разделить на две части:
Контроллер шаблона несет всю избыточную для шаблона логику с которой программисты справляются гораздо
эффективнее чем верстальщики.
Шаблон template.tpl:
скрипт:
Для экспериментов с Blitz вы можете загрузить
шаблон прямо в коде скрипта из переменной:
Блок это часть шаблона, которая может быть отображена при необходимости:
По умолчанию, этот шаблон выводит строку «hello », блок будет скрыт.
Следующий код выведет блок один раз:
Результат
Синоним Блока — контекст. Вывод блока называется итерацией.
Для наглядности можно указать название блока после оператора END:
{{ END block }}.
Каждый блок может быть «итерирован» несколько раз для вывода списков (аналог циклов в Smarty), код контроллера шаблона:
Выполнив данный код для шаблона из предыдущего примера, мы увидим:
Теперь попробуем вывести тот же список, но разделенный запятыми.
Это можно сделать двумя способами: использовать блок или оператор if.
Для начала используем блок:
и проитерируем его в цикле:
По мне, так выглядит не слишком изящно. В таких простых случаях уместнее использовать оператор if:
В Blitz для блоков есть предустановленные переменные: $_first (первая итерация),
$_last (последняя итерация), $_total (общее кол-во), $_num, $_even, $_odd.
По названием легко догататься о назначении. Также можно определить
свои переменные из контроллера шаблона.
Еще пара примеров if:
Вместо блока можно использовать комбинацию трех низкоуровневых методов:
context, set и iterate. Метод context принимает один параметр — полный или относительный
путь, все дальнейшие set-ы и относительные пути будут использовать этот путь по умолчанию:
Метод context работает как консольная команда cd;
метод iterate «выводит» блок.
Использования block проще, но во многих случаях Вам понадобятся
низко-уровневые операции с контекстом и итерированием.
Каждое состояние шаблона может быть описано определенной структурой данных.
Если добавить следующий код к предыдущему примеру:
в $data будет следующая структура:
Это внутреннее состояние шаблона перед вызовом метода parse.
Чтобы Вы не делали с шаблоном используя методы block, set, iterate, context —
Blitz модифицирует данный массив. Когда вызывается метод parse — blitz рендерит
шаблон на основе этой структуры.
Попрактикуйтесь с разными вызовами и посмотрите, что будет в дампе, для быстрой отладки
вашего кода.
some.tpl:
Тот же самый результат, что и в предыдущих примерах, но
без использования методов block/context/iterate.
результат исполнения:
Если вы поймете как это работает — вы полностью осознали
контексты и итерации.
Иногда удобно взять часть шаблона (блок) независимо от всего шаблона:
Это можно сделать с помощью метода fetch:
some.tpl:
код:
Следующий код
означает,
то что вы вызываете метод my_test с параметрами.
Функцию my_test добавим следующим образом:
Результат:
Это введение было написано как вольный перевод туториала: Quck Geek Blitz Tutorial.
Оно лишь иллюстрирует основы использования этого шаблонизатора, за деталями
стоит обратиться к документации.
Сайт проекта Blitz: alexeyrybak.com/blitz/blitz_ru.html
Примеры шаблонов и бенчмарк: alexeyrybak.com/blitz/lebowski_bench.tar.gz
Приведу несколько фактов:
- Это шаблонизатор используемый Хабром;
- Этот шаблонизатор используется на высоко-нагруженных проектах, он написан на C, подключается как расширение PHP;
- Его скорость сопоставима с самим php (бенчмарк под катом);
- Верстальщики будт счастливы, так как в шаблонах нет логики приложения, нет циклов, ветвлений и т.д.;
- Один из его авторов Алексей Рыбак fisher.
Blitz — это блочный шаблонизатор, что принципиально отличает его от Smarty и подобных.
Smarty по сравнению с Blitz — язык программирования.
Синтаксис шаблонов Blitz основан на 3х конструкциях:
- блоки (они же контексты): {{BEGIN blockName}}содержимое блока{{END}}
- переменные: {{$var}}
- вызовы функций {{myFunc($params)}}
Циклы, условыне операторы и другой «богатый» синтаксис отсутствует. Это гарантирует разделение логики
приложения от логики представления. Как следствие, шаблоны с ростом проекта не превращаются в кашу.
С точки зрения организации кода, компонент View (MVC) можно условно разделить на две части:
- шаблон (HTML-файл с Blitz-тегам);
- контроллер шаблона — это объект Blitz управляющий обработкой шаблона (не путать с контроллером веб-приложения).
Контроллер шаблона несет всю избыточную для шаблона логику с которой программисты справляются гораздо
эффективнее чем верстальщики.
Несколько примеров:
1. По традиции: Hello, world!
Шаблон template.tpl:
Code: |
Hello, {{ $name }}! |
скрипт:
Code: |
$template = new Blitz('template.tpl'); echo $template->parse(array('name' => 'world')); |
2. Шаблон можно загрузить не только из файла:
Для экспериментов с Blitz вы можете загрузить
шаблон прямо в коде скрипта из переменной:
Code: |
$template = new Blitz(); $template->load('Hello, {{$name}}!'); echo $template->parse(array('name' => 'world')); |
3. Блоки (контексты):
Блок это часть шаблона, которая может быть отображена при необходимости:
Code: |
hello {{ BEGIN block }} {{ $name }} {{ END }} |
По умолчанию, этот шаблон выводит строку «hello », блок будет скрыт.
Следующий код выведет блок один раз:
Code: |
$template = new Blitz('some.tpl'); $template->block('/block', array('name' => 'Dude')); echo $template->parse(); |
Результат
Code: |
"hello Dude ". |
Синоним Блока — контекст. Вывод блока называется итерацией.
Для наглядности можно указать название блока после оператора END:
{{ END block }}.
4. Вывод блока несколько раз (списки или циклы):
Каждый блок может быть «итерирован» несколько раз для вывода списков (аналог циклов в Smarty), код контроллера шаблона:
Code: |
foreach (array('Dude', 'Sobchak', 'Donny') as $i_name) { $template->block('/block', array('name' => $i_name); } |
Выполнив данный код для шаблона из предыдущего примера, мы увидим:
Code: |
"Hello Dude Donny Sobchak " |
5. Условия
Теперь попробуем вывести тот же список, но разделенный запятыми.
Это можно сделать двумя способами: использовать блок или оператор if.
Для начала используем блок:
Code: |
hello {{ BEGIN block }}{{ BEGIN comma }},{{ END }} {{ $name }} {{ END }} |
и проитерируем его в цикле:
Code: |
$need_comma = FALSE; foreach (array('Dude', 'Sobchak', 'Donny') as $i_name) { if ($need_comma) { $template->block('/block/comma'); } else { $need_comma = TRUE; } $template->block('/block', array('name' => $i_name); } |
По мне, так выглядит не слишком изящно. В таких простых случаях уместнее использовать оператор if:
Code: |
hello {{ BEGIN block }}{{ if($_first,'',',') }} {{ $name }} {{ END }}. |
В Blitz для блоков есть предустановленные переменные: $_first (первая итерация),
$_last (последняя итерация), $_total (общее кол-во), $_num, $_even, $_odd.
По названием легко догататься о назначении. Также можно определить
свои переменные из контроллера шаблона.
Еще пара примеров if:
Code: |
{{ if(TRUE,'2+2=4','2+2=5'); }} {{ if($a,"b",$c); }} |
6. Использование контекстов и итераций
Вместо блока можно использовать комбинацию трех низкоуровневых методов:
context, set и iterate. Метод context принимает один параметр — полный или относительный
путь, все дальнейшие set-ы и относительные пути будут использовать этот путь по умолчанию:
Code: |
$template->context('/block'); foreach (array('Dude', 'Sobchak', 'Donny') as $i_name) { $template->iterate(); $template->set(array('name' => $i_name)); } |
Метод context работает как консольная команда cd;
метод iterate «выводит» блок.
Использования block проще, но во многих случаях Вам понадобятся
низко-уровневые операции с контекстом и итерированием.
7. Все является итерацией
Каждое состояние шаблона может быть описано определенной структурой данных.
Если добавить следующий код к предыдущему примеру:
Code: |
$data = $template->getIterations(); |
в $data будет следующая структура:
Code: |
array( 0 => array( 'block' => array( 0 => array('name' => 'Dude'), 1 => array('name' => 'Sobchak'), 2 => array('name' => 'Donny') ) ), ) |
Это внутреннее состояние шаблона перед вызовом метода parse.
Чтобы Вы не делали с шаблоном используя методы block, set, iterate, context —
Blitz модифицирует данный массив. Когда вызывается метод parse — blitz рендерит
шаблон на основе этой структуры.
Попрактикуйтесь с разными вызовами и посмотрите, что будет в дампе, для быстрой отладки
вашего кода.
8. Все тоже самое, через массив:
Code: |
$data = array( 0 => array( 'block' => array( 0 => array('name' => 'Dude'), 1 => array('name' => 'Sobchak'), 2 => array('name' => 'Donny') ) ), ); $template = new Blitz('some.tpl'); echo $template->parse($data); |
some.tpl:
Code: |
{{ BEGIN block }}{{ if($_first,'',',') }} {{ $name }} {{ END }} |
Тот же самый результат, что и в предыдущих примерах, но
без использования методов block/context/iterate.
9. Вложенные итерации
Code: |
$data = array( array( 'who' => 'soldiers', 'what' => array( 0 => array( 'verb' => 'going', 'details' => array( 0 => array('item' => 'nowhere'), ) ), 1 => array( 'verb' => 'blinded', 'details' => array( 0 => array('item' => 'by'), 1 => array('item' => 'their'), 2 => array('item' => 'faith') ) ) ) ) ); $template = new Blitz(); $template->load('{{ $who }} {{ BEGIN what }}{{ $verb }} {{ BEGIN details }}{{ $item }} {{ END }}{{ END }}'); $template->set($data); echo $template->parse(); |
результат исполнения:
Code: |
soldiers going nowhere blinded by their faith |
Если вы поймете как это работает — вы полностью осознали
контексты и итерации.
10. Можно работать с частями шаблона
Иногда удобно взять часть шаблона (блок) независимо от всего шаблона:
Это можно сделать с помощью метода fetch:
some.tpl:
Code: |
{{ BEGIN hello }} hello, {{ $name }} {{ END }} {{ BEGIN bye }} bye, {{ $name }} {{ END }} |
код:
Code: |
echo $template->fetch('/hello', array('name' => 'Lena')); // hello, Lena echo $template->fetch('/bye', array('name' => 'Sveta')); // bye, Sveta |
11. Вызовы функций в шаблоне:
Следующий код
Code: |
{{ my_test($a, "foo", 'bar', TRUE, 2005); }} |
то что вы вызываете метод my_test с параметрами.
Функцию my_test добавим следующим образом:
Code: |
class View extends Blitz { function my_test($a) { return 'user method called ('.__CLASS__.','.__LINE__.'), a = '.$a; } } $template = new View(); $template->load('user method call test: {{ my_test("test") }}'); echo $template->parse(); |
Результат:
Code: |
user method call test: user method called (blitztemplate,5), a = test |
В заключение:
Это введение было написано как вольный перевод туториала: Quck Geek Blitz Tutorial.
Оно лишь иллюстрирует основы использования этого шаблонизатора, за деталями
стоит обратиться к документации.
Ссылки
Сайт проекта Blitz: alexeyrybak.com/blitz/blitz_ru.html
Примеры шаблонов и бенчмарк: alexeyrybak.com/blitz/lebowski_bench.tar.gz
Схемы ускорения веб-сайта / Mysql + Шаблонизаторы и кеширвоание Источник: http://habrahabr.ru/post/93720/