Введение в шаблонизатор 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/