Расширение шаблонизатора Blitz

Доброе утро, давно использую blitz, мне он сразу понравился, можно сказать любовь с первого взгляда))
Я сделал не большой апгред для blitz, а именно научил его итерировать сквозь шаблоны, не знаю почему Алексей Рыбак не сделал это сразу, возможно на то были причины.
Blitz в сочетании с этим апгрейдом становится еще более удобен, советую всем кто использует blitz попробовать его.
Если буду идеи как улучшить алгоритм пишите, даже больше нуждаюсь в критике.
Полное описание апгрейда и сам код class'a с примерами находится на сайте extendlife.ru.
 

fixxxer

К.О.
Партнер клуба
нифига не понял если честно :)

по идее эта задача решается через fetch в шаблоне
 
если коротко
[696e.blitz] - это 1 файл шаблона
[3b47.blitz] - это 2 файл шаблона

одно php строкой мы
интерируем /start/main1 в шаблоне [3b47.blitz] в нем же в переменную {{ $body1 }} мы вкладываем итерацию /list{column/item другого шаблона [3b47.blitz]

$blitz->block('/start/main1/body1[696e.blitz]/start/main2/body1[3b47.blitz]/list{column/item', $item);

Класс полностью контролирует:
1) вложенность шаблонов
2) нужность/не нужность повторных итераций в корневых шаблонах.
 
fetch не контролирует вложенность и к тому же он становится статичным если его использовать в шаблоне.
 
Вот как бы мы собирали к примеру такие шаблоны:
<code>
Шаблон: tp1.blitz
{{ BEGIN block }}hello {{ $body }} {{ END }}

Шаблон: tp2.blitz
{{ BEGIN block }} {{ $name }} {{ END }}
</code>

Без апгрейда:
<code>
<?php
$tp1 = new Blitz('tp1.blitz');
$tp2 = new Blitz('tp2.blitz'); // приходится в ручную создавать еще один инстанс Blitz
$tp2->block('/block',array(array('name'=>'Петя', array('name'=>'Вася')));
$tp1->block('/block',array(array('body'=>$tp2->parse()))); // опять же в ручную вставляем результат метода parse
echo $tp1->parse();
</code>

С апгрейдом:
<code>
<?php
$tp1 = new myBlitz2('tp1.blitz');
// А здесь уже сразу связываем два шаблона одной строкой
$tp1->block('/block/body[tp1.blitz]/body',array(array('name'=>'Петя', array('name'=>'Вася')));
echo $tp1->parse();
</code>
 

AmdY

Пью пиво
Команда форума
не знаю почему Алексей Рыбак не сделал это сразу, возможно на то были причины.
Он вроде как писал, что написал шаблонизатор потому что у него был легаси код с шаблонами на xtemplate или вроде того, соотвественно он сделал это для того. Синтаксис этого шаблонизатора дерьмо полнейшее и он был писан до того как умным людям пришла идея делать компилированные шаблоны.

Зачем вам такие грабли городить в контроллере, если можно писать нормальный код сразу и не дублировать переменные.
 
  • Like
Реакции: WMix
Он вроде как писал, что написал шаблонизатор потому что у него был легаси код с шаблонами на xtemplate или вроде того, соотвественно он сделал это для того. Синтаксис этого шаблонизатора дерьмо полнейшее и он был писан до того как умным людям пришла идея делать компилированные шаблоны.

Зачем вам такие грабли городить в контроллере, если можно писать нормальный код сразу и не дублировать переменные.
Конечно же в контроллере такое не пишется, это же всего лишь примеры.
Если к Рыбаку зайти вы у него уведите похожие примеры.
Я предлагаю использовать новые возможности, а не примеры.
 

AmdY

Пью пиво
Команда форума
Не дай бог поддерживать такие возможности с пёрлосинтаксиом в именах шаблонов. Блитх не даёт удобства по сравнению с php синтаксисом, а по скорости проигрывает. Трвиг медленнее и php, и blitz, и даже smarty, зато прекрасно расширяется и позволяет экомить кучу сил за счёт наследования и макросов, легко подключается кеширование
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
перенес в раздел модулей и шаблонизаторов

Amdy прав, посмотрите на twig и smarty 3 с 2-уровневой шаблонизацией через наследование
 
Не дай бог поддерживать такие возможности с пёрлосинтаксиом в именах шаблонов. Блитх не даёт удобства по сравнению с php синтаксисом, а по скорости проигрывает. Трвиг медленнее и php, и blitz, и даже smarty, зато прекрасно расширяется и позволяет экомить кучу сил за счёт наследования и макросов, легко подключается кеширование
Нет-нет, логику в шаблоны, спасибо наелся на всю жизнь(
 

Фанат

oncle terrible
Команда форума
Нет-нет, логику в шаблоны, спасибо наелся на всю жизнь(
Откробю маленький секрет:
Логика в шаблонах всегда есть.
Просто при использовании одних шаблонизаторов она прописана явно, и любой может её прочесть.
А при использовании других её надо держать в уме - либо каждый рез лезть в когд, чтобы узнать, какую конкретно логическую конструкцию реализует данный якобы безличный блок.

Если у тебя в коде итерируется определенный блок - то как ни прячь голову в песок, но это будет цикл.
Разница только в том, что его можно либо обозначить его циклом явно, либо стыдливо обозвать анонимным блоком. Но циклом от от этого быть не перестанет.
 
Откробю маленький секрет:
Логика в шаблонах всегда есть.
Просто при использовании одних шаблонизаторов она прописана явно, и любой может её прочесть.
А при использовании других её надо держать в уме - либо каждый рез лезть в когд, чтобы узнать, какую конкретно логическую конструкцию реализует данный якобы безличный блок.

Если у тебя в коде итерируется определенный блок - то как ни прячь голову в песок, но это будет цикл.
Разница только в том, что его можно либо обозначить его циклом явно, либо стыдливо обозвать анонимным блоком. Но циклом от от этого быть не перестанет.
Согласен малая часть логики есть и там, но я говорю про разделения кода и представления результатов кода на психологическом уровне.
Что бы когда зайдя в шаблон думать только о верстке и все.
 

Фанат

oncle terrible
Команда форума
Что бы когда зайдя в шаблон думать только о верстке и все.
Невозможно, зайдя в шаблон, думать только о верстке.
Когда у нас стоит блок, который означает условный переход, зашедшиий должен понимать, что при определенных условиях здесь будет показан красненький цветочек, а при других - зелененький.
Или - больше того - заглушка "данных по запросу не найдено" или развесистый список с сортировкой и фильтрами.

Когда у нас стоит итерируемый блок, внутри которого прописана в шаблоне единственная строчка, зашедший обязан держать в голове, что строк на самом деле будет больше, причем неизвестное количество.

Самое главное - не нужно путать HTML вёрстку с резкой шаблона.
Первое должен делать професиональный верстальщик, и ему о логике действительно думать не надо. Он верстает страницу, как есть. Хотя там да - тоже нюансы, на которых бадушники меня подловили в свое время. Но для простоты примем, что думать ему не надо.
А вот резкой, по хорошему, должен уже заниматься не верстальщик (хотя может), но бэкенд программист. Но если даже это делает и фронтендщик, то на время резки он превращается в бэкендщика. потому что сам шаблон, при верстке которого думать о логике не нужно, он уже сверстал. А при резке шаблона, собственно, кроме его логики и думать не о чем.

При просмотре, при правке вёрстки в уже готовом шаблоне - да, нужно думать и о том и о другом. Но от логики в шаблоне "с логикой" абсрагироваться так же легко.

Собственно, шаблон "с логикой" отличается от шаблона "без логики" только тем, что в первом случае блоки надписаны - на них помечено, чем конкретно блок занимается. А в шаблоне "без логики" в тех же самых местах стоят блоки - но анонимные, и об их предназначении можно или только заранее знать, или догадываться.

Вот чего в шаблоне действительно не должно быть ни под каким видом - это бизнес-логики.
И всё неприятие "логики" в шаблонах идет от тех криворучек, которым лень написать дву лишних строчки в контроллере, и они начинают обрабатывать исходные данные в шаблоне.
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Но от логики в шаблоне "с логикой" абсрагироваться так же легко.
Занимательная опечатка...
А мне вот интересно правильно ли в контроллере написать так:
PHP:
if($user->isSuperAdmin()) {
   return ['projects' => $repo->findAll()];
} else {
   return ['projects' => $repo->findBy(['user' => $user])];
}
А в шаблоне опять таки узнать супер-админ или не супер и разделить логику отображения? или это должно делать два контроллера и два шаблона?
 
Все всё правильно говорят. Все молодцы!)
Я просто почему эту писанину снова затеял.
Тут смотрел фильм про Стива Джопса он сказал что полезными становятся те вещи которые ты изначально делал для себя так как тебе было это необходимо.
Мне этот функционал помогает и он мне необходим, поэтому я предположил что он будет полезен и вам.
Вообщем то свое дело я сделал, все описал и на вопросы ответил, и на сайте выложил).
 
Занимательная опечатка...
А мне вот интересно правильно ли в контроллере написать так:
PHP:
if($user->isSuperAdmin()) {
   return ['projects' => $repo->findAll()];
} else {
   return ['projects' => $repo->findBy(['user' => $user])];
}
А в шаблоне опять таки узнать супер-админ или не супер и разделить логику отображения? или это должно делать два контроллера и два шаблона?
Я бы сделал так чтобы это разделение было один раз в контролере.
Иначе предется потом синхронизировать изменения если таковы появятся
 

MiksIr

miksir@home:~$
Тут смотрел фильм про Стива Джопса он сказал что полезными становятся те вещи которые ты изначально делал для себя так как тебе было это необходимо..
Вот и я говорю, что полезными становятся те вещи, которые ты изначально делал для Стива.
 

fixxxer

К.О.
Партнер клуба
Он вроде как писал, что написал шаблонизатор потому что у него был легаси код с шаблонами на xtemplate или вроде того, соотвественно он сделал это для того. Синтаксис этого шаблонизатора дерьмо полнейшее и он был писан до того как умным людям пришла идея делать компилированные шаблоны.
Вот эта жесть с block действительно исключительно для совместимости с php_templates. Я не понимаю тех, кто эту жесть использует.
Обычно blitz используется в простейшей форме
$tpl = new Blitz($filename);
$tpl->parse(array(...));
где в array уже сложены все итерации.

И, да, большинству проектов не нужен blitz и намного лучше подойдет twig. Надо быть *****, чтобы упереться в производительность template engine. =)

Еще надо понимать что blitz писался во времена php4. Сейчас производительность самого php значительно выросла (кому интересно за счет чего это может быть в таких банальных вещах как код шаблона - почитайте https://wiki.php.net/rfc/performanceimprovements).
 
Последнее редактирование:
Сверху