обсуждение шаблонизатора Blitz

Фанат

oncle terrible
Команда форума
Да я понимаю, что вместо циклов контексты.
просто это размазывание логики между шаблоном и скриптом, и оно мне лично не нравится.

А чем тебе лично понравился Blitz? По каким причинам ты на него перешёл?
 

Develar

Новичок
Фанат
Контексты позволяют не размазывать логику. Они ее полностью переносят в контроллер. Вся прелесть и мощь blitz в них. Почему перешел - раньше все шаблоны писались на чистом PHP, который вызывал API системы для получения данных и их оформлял (то есть в них были только if, foreach и вызовы API). Все было хорошо до тех пор, пока не стали возникать задачи, оформление которых требовало хитрой логики, которую ни вынести в класс системы, ни разнести шаблон на подшаблоны&макеты - сам через день запутаюсь в маленьких файликах. Вид шаблона с 5-6 вложенными if и несколькими foreach меня особо не пугал, чуть-чуть нервировал - а вот верстальщик на меня смотрел подозрительно. Переверстал на blitz (шаблон, что вызвал сыр-бор, тогда не заработал - blitz стал стабилен только к ноябрю, но не суть) - нагрузка на мозг упала, файлов стало в два раза больше - view разделился на template и controller - но и читать шаблон стало легче.

Но это полдела. Контексты позволяют на лету оформлять данные так, как это нужно, без необходимости сложных преобразований. Есть класс Tree и он выдает данные только в таком виде http://phpclub.ru/paste/1569 А нам надо вывести эти данные в виде http://phpclub.ru/paste/1570 Какой по объему и сложности нам придется написать PHP код? На blitz это получилось интуитивно легко и быстро http://phpclub.ru/paste/1571 а верстальщик остался доволен http://phpclub.ru/paste/1572

Но и это еще не все, то, что можно натворить интуитивно легко и просто с помощью fetch - отдельная тема.

Ну и без ООП никуда - а blitz ОО-расширение PHP (фактически без возможности наследования и прочих ОО-штук blitz ничего не значит и я вряд ли бы на него перешел).
 

Фанат

oncle terrible
Команда форума
Они ее полностью переносят в контроллер.
О!
Именно это мне и не нравится.
Что логика отображения переносится в приложение.

Но это ещё пол-беды. Если бы она переносилась! Но она именно размазывается. Часть в шаблоне, часть - в уме у верстальщика, часть - в приложении.

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

blitz ОО-расширение PHP (фактически без возможности наследования и прочих ОО-штук blitz ничего не значит и я вряд ли бы на него перешел).
Спасибо.

-~{}~ 12.12.06 22:09:

Все было хорошо до тех пор, пока не стали возникать задачи, оформление которых требовало хитрой логики
Мне бы, пожалуйста, вот про эту саксес-стори поподробнее.
Что было, как стало. С примерами.
А то я, как-то, не очень пойму, как сложная логика на пхп превратилась в простую на blitz

-~{}~ 12.12.06 22:20:

совсем недавно я рисовал дерево с помощью пхп-шаблона.
да, конструкция получилась не слишком простая.
PHP:
<? foreach ($TREE as $item): ?>
<? if($item['li']=="open"): ?><ul><?endif?>
<? if($item['li']=="close"): ?></ul><?endif?>
<? if($item['id']!=0): ?>
<? if($id==$item['id']): ?>
<li>
<?=$row['title']?>
<a href="?id=0&parent=<?=$item['id']?>">[Add]</a>
</li>
<? else: ?>
<li>
<a href="?id=<?=$item['id']?>"><?=$item['title']?></a>
</li>
<?endif?>
<?endif?>
<? endforeach ?>
Но как с этой задачей справится Blitz?
 

Develar

Новичок
А то я, как-то, не очень пойму, как сложная логика на пхп превратилась в простую на blitz
Мне то же было непонятно. Тут все дело в том, что blitz не стеснительно называет цикл контекстом. Просто такого понятия нет как цикл. И это не подмена понятий, а введение нового. 5 глава документации. Понять сходу сложно. Контекст это неизмеримо большее чем цикл.

Про счастливую историю - как и сказал до ноября blitz был не стабилен и я оставил все как есть, посмотрите пример реализации сразу на blitz и представьте код на чистом php (или я сейчас напишу ради эксперимента).

У вас пример идеален, там уже откуда то есть такое как open и close - из базы такое приходит или кто-то до вывода шаблона поработал над массивом $TREE?
 

Фанат

oncle terrible
Команда форума
У вас пример идеален, там уже откуда то есть такое как open и close - из базы такое приходит или кто-то до вывода шаблона поработал над массивом $TREE?
не понял.
А у вас что - никто не работает? Данные напрямую из базы попадают в шаблон?
Что значит - "откуда-то"? Из скрипта, разумеется. А разве бывает по-другому?
Мне тоже было непонятно. Понять сходу сложно
Как интересно. программист не понял, а верстальщик воткнул с пол-пинка? Вот это самое нововведённое неизмеримое понятие?
 

Develar

Новичок
Есть класс Tree. Он понятия не имеет кто вызовет его. И выдает данные в удобоваримом для всех виде.

У вас, видимо, до шаблонов есть еще один слой кода которые обрабатывает данные и только потом выдает эти данные в шаблон.

В моем случае иначе. Сам шаблон, в foreach ($TREE as $item) не использует $TREE, а вызывает $Toc->get(). Этот $Toc->get() выдает данные в стандартизованном формате - http://phpclub.ru/paste/index.php?show=1569

Получается, что в вашем случае, на каждый шаблон реализующий то или иное представление данных пишется еще "скрипт", который переводит стандартизованный формат данных в то, то нужно - скажем open или close устанавливает и т. п. так ведь логика начинает так же размазываться - откуда здесь какие-то open и close...
 

Фанат

oncle terrible
Команда форума
ты напиши на blitz вывод дерева.
а потом будем разговаривать

-~{}~ 12.12.06 23:01:

У вас, видимо, до шаблонов есть еще один слой кода которые обрабатывает данные и только потом выдает эти данные в шаблон.
а у вас, типа, такого слоя нету?
а по ссылке http://phpclub.ru/paste/1571 что находится? поэму Пушкина "приплыли"?
 

Develar

Новичок
Фанат
Нет. Вывод дерева я уже написал. данные - http://phpclub.ru/paste/1569 вывод - http://phpclub.ru/paste/1570 контроллер - http://phpclub.ru/paste/1571 шаблон - http://phpclub.ru/paste/1572

А ваше дерево мне не понятно. Нет таких данных как open и close

Но напишу, но, естественно, это будет шило на мыло с одним единственным плюсом.
 

Фанат

oncle terrible
Команда форума
У тебя не дерево, а простая двумерная таблица.
в массиве лежат заголовки столбцов, и содержимое.
какое же это дерево?

мой код выводит древовидные комментарии.
Вот вывод такого дерева я хочу увидеть на blitz
причём - желательно не объясняя верстальщику, что такое рекурсия

-~{}~ 12.12.06 23:17:

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

Develar

Новичок
я прошу прощения за некоторую резкость высказываний, просто немнго горячусь.
мы программисты

http://phpclub.ru/paste/index.php?show=1573

http://phpclub.ru/paste/index.php?show=1574

Что можно сказать об этом?

Выкинуть этот blitz и не парить нам мозги. Абсолютно верно.

А все из-за поэмы Пушкина "приплыли". Вы этот код не учитываете. В моем случае все на лету, а в вашем создается временная переменная $TREE. А где ваш код который так любезно расставляет open и close?

-~{}~ 12.12.06 23:38:

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

Фанат

oncle terrible
Команда форума
Вообще, я соглашусь.
Внеся в итак широкий список понятий, охватываемых контекстом, ещё и рекурсию, можно решить данную задачу просто и элегантно.

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

-~{}~ 12.12.06 23:46:

не так уж и большое дерево.
не понял.
какая _дереву_ разница - большое оно или маленькое? принцп дерева как раз в том, что никакой разницы нет. один и тот же код работает с любым размером
http://phpclub.ru/paste/index.php?show=1574
Что можно сказать об этом?
слушай, да не привязывайся ты к моему решению. оно мне самому не нравится!
просто напиши вывод дерева. как _тебе_ и Блицу удобнее.
 

Develar

Новичок
из контекста непонятно - цикл это, или условный переход, или инклюд - снижается читаемость и повышается завязанность программиста и верстальщика друг на друга
Когда вы производите рефакторинг и бьете что-то на отдельные методы, а потом читаете получившийся код - вам интересно что делает такой-то метод или вам интересно видеть картину целиком, а при необходимости уточнить - а что-же такое делает вызов этого метода?
обязательность слоя, который приводит полученные из базы данные к виду, удобному для шаблонизатора
а кто в вашем коде расставляет open и close ;)

просто напиши вывод дерева. как _тебе_ и Блицу удобнее.
Уже написал. В самом моем первом примере. Попробуйте то же самое написать на чистом PHP основываясь на том массиве данных. Вам понадобится взять этот массив и преобразовать в нужный вид - расставив open и close и отделив первый уровень от второго, причем вывести сначала первый для th и только потом для td второй уровень - а в массиве то они вперемешку двумерно. Blitz избавляет меня от этого.

-~{}~ 13.12.06 00:02:

шаблон - http://phpclub.ru/paste/1575
контроллер - http://phpclub.ru/paste/index.php?show=1576
вывод типа http://airs.ru/map

какой чистый PHP код был раньше - http://phpclub.ru/paste/index.php?show=1577

Нельзя сказать что мы много выиграли - только в понятности. Но здесь то - в этом выводе дереве ничего сложного и нет. Выгода blitz видна при шаблонах со сложной логикой.

Спасибо Фанат за дискуссию, благодарен без иронии.
 

Фанат

oncle terrible
Команда форума
а кто в вашем коде расставляет open и close ;)
в моём коде это не обязательно. требуется только в исключительных случаях.
в твоём же шаблонизатор должен кланяться на каждый чих в шаблоне.
Уже написал. В самом моем первом примере. Попробуйте то же самое написать на чистом PHP основываясь на том массиве данных. Вам понадобится взять этот массив и преобразовать в нужный вид - расставив open и close и отделив первый уровень от второго, причем вывести сначала первый для th и только потом для td второй уровень - а в массиве то они вперемешку двумерно. Blitz избавляет меня от этого.
Несколько пояснений.
У тебя выводится не дерево.
Для вывода этой фигни мне open и close не нужны. Ты просто не понял - для чего они понадобились, и результатом каких мук явились.
Что самое смешное: уже я - твой оппонент, догадался, как меня победить. А ты всё никак =)

-~{}~ 13.12.06 00:07:

Бляха-муха! =)
{BEGIN greater}
<ul>
{END}
Ну это же мои, родные open-close, на который ты так ополчилсо! =))))

-~{}~ 13.12.06 00:12:

Слушай, попробуй рекурсию-то сделать? а?
без всех этих опен клозов твоих, а простой блок
{BEGIN entry}
<ul>
{BEGIN item}
<li><a href="{$uri}">{$title}</a>
{END}
</ul>
{END}
 

Develar

Новичок
Ну это же мои, родные open-close, на который ты так ополчилсо! =))))
только они в самом шаблоне, а не приходят извне.

Сделать просто рекурсию - в таком простом примере применение blitz смешно и ничего не показывает. Вам не хватило рекурсии в предыдущих моих примерах?
 

Фанат

oncle terrible
Команда форума
только они в самом шаблоне, а не приходят извне.
не на до ля ля
$Template->iterate('greater');
ЭТО у тебя написано в шаблоне?

Сделать просто рекурсию - в таком простом примере применение blitz смешно и ничего не показывает.
не понял.
Ты шаблоны применяешь для того, чтобы кому-то что-то доказать?
МНЕ рекурсии хватило, спасибо.
Я думал, что _тебе_ интересно сократить шаблон в три раза и сделать его в сто раз понятнее.
Я думал, что это _тебе_ интересо воспользоваться преимуществами движка, который ты защищаешь.
но если тебе это не надо, то ради бога - я не настаиваю.

кстати.
Вам не хватило рекурсии в предыдущих моих примерах?
ткни дурака носом. ссылка:номер строки.
спасибо.
 

Develar

Новичок
Я не защищаю ничего - глупо - самому потом с этим мучиться. Я тоже пытаюсь понять. Только вот сделать понятным мне удалось лишь при помощи blitz, а размер кода - напишите php код для моего первого примера.

Я шаблон+контроллер рассматриваю как одно целое, так как раньше у меня так и было. Вы рассматриваете по частям, при этом я передаю в шаблон (то есть tpl + php) сырые данные, а вы уже готовые.

рекурсия - это везде где у меня block и iterate, так как во всех приведенных мною примерах цель - вывод дерева.

-~{}~ 13.12.06 00:37:

сейчас напишу чистый php код для первого примера - самому интересно чего-то я тут раскудахтался...
 

Фанат

oncle terrible
Команда форума
Странно. Мы друг друга не понимаем.
Тебе прямо упёрлось написать код для первого примера.
при том, что этот пример даже наш друг Solid решит с лёгкостью, двумя вложенными циклами.

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

с другой стороны, у тебя есть безоговорочная и чистая победа - убать в своём коде дурацкие опен клоуз и сделать чистый красивый шаблон. Но ты презрительно от этого отказываешься... Так, как будто я предлагаю сделать что-то мерзкое или подлое.
 

Develar

Новичок
Фанат
Я пытаюсь сказать, что в случае blitz костыль не выглядит костылем - манипулирование context/all iterations in one set/block доставляет большее удовольствие и более лучший код чем тупая обработка в циклах с введением временных переменных. Именно это для меня важно в первую очередь. Я не люблю когда меня тошнит от кода, даже если он неверен только с принципиальной точки зрения.

Сейчас вот начал написал первый пример на php - жуть.

Я думал, что _тебе_ интересно сократить шаблон в три раза и сделать его в сто раз понятнее.
так вы это о blitz говорили? А я думал что мне сейчас дадут удочку и фонарик.
 

Фанат

oncle terrible
Команда форума
да. всё в тебе хорошо, только с логикой нелады.
а точнее, глаза крепко зажмурены, как у всякого догматика.
манипулирование context/all iterations in one set/block доставляет больше удовольствие
но при этом абсолютно идентичная ситуация, когда манипулирование исходными данными доставляет столько же удовольствия, представляется муками адовыми.
детский сад.

так вы это о blitz говорили?
НЕТ!
{BEGIN entry} , {BEGIN item} - это всё были заклинания вуду. которыми я призывал злых духов на твою голову!

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

Develar

Новичок
Хорошо. Значит вы говорите, что первый мой пример можно так же легко решить на php? C тем же размером кода и так же понятно? И я просто дурак не могущий исправить свои недостатки? Какой вариант для вас лучше - вы пишите этот пример на чистом php и открываете мне глаза или я пишу этот пример на чистом php, показываю его вам - и вы аргументированно говорите что я идиот.
 
Сверху