Акын: блоки
Я тут, если помните, принялся описывать свой шаблонизатор «Акын», многие просили. Сейчас попробую продолжить. Итак, часть вторая: блоки.
Частые паттерны — скрыть целый блок разметки или повторить его несколько раз, решается в «Акыне» одной конструкцией: описанием блока. Что именно будет происходить с блоком, шаблон «не знает». Блок идентифицируется своим именем и описывается следующим образом:
<:имя>
Значение переменной: <b>{$var}</b><br />
</:имя>
В API шаблонизатора есть два метода-алиаса с именами iterate и show, которые в реальности полностью взаимозаменяемы и разделены только для наглядности (и, возможно, последующей оптимизации двух этих операций). На вход каждый метод принимает имя блока, с которым он будет работать. Важно помнить, что если к блоку не применить show или iterate, то его содержимое показано не будет.
Пусть блок, описанный выше, нужно повторить три раза, заменяя «var» каждый раз на определённый текст, вот как это выглядит в коде:
$t = rt::t('template');
for ($i = 0; $i<3; $i++) {
$t->var = $i;
$t->iterate('имя');
}
echo $t;
Чтобы просто показать содержимое этого блока можно вызвать $t->show(’имя’). Вложенные секции работают точно так же: нужно сначала проитерировать вложенную секцию, потом внешнюю. Уровень вложенности неограничен.
В предыдущей части я забыл упонянуть ещё одну важную конструкцию, позволяющую включать один шаблон в другой. Выглядит она, на мой взгляд, очень логично:
<$+шаблон>
<$+шаблон секция>
Конструкция предпроцессорная (обрабатывается первым проходом), т. е. все блоки, переменные и прочее будут включены в шаблон из которого она вызвана.
В следующий раз опишу actions, а так же дальнейшие планы. На этом описательная часть закончится, если по этой части не потребуются разъяснения.
Учить ещё один язык шаблонизации? Не-не-не :-)
Комментарий для razetdinov.ya.ru:
Учить? Чего тут учить? :)
Это всё равно что выучить свой новый адрес при переезде. А кроме того, я никого ни к чему не принуждаю :) Это мой шаблонизатор, который писал для себя.
Каждый русский программист должен:
100 раз в этом уже убедился ... :)
а смысл? в чём отличия?
Комментарий для companyowner.myopenid.com:
1) done
2) done
3) done
4) done
Комментарий для veged.ya.ru:
Смысл чего? Отличия от чего?
Комментарий для companyowner.myopenid.com:
Вы так говорите, как будто это плохо.
Шаблон отдельно, итерация отдельно?
По моему хорошо, когда шаблон знает об итерациях внутри себя.
Со стороны шаблона в таком случае понятно, почему <li> обёрнуто в какую-то специальную конструкцию, а <ul> не обёрнуто.
Комментарий для alisey.myopenid.com:
Не вижу в этом смысла. Зачем шаблону вообще что-то знать? Он источник данных, как СУБД.
Комментарий для Евгения Степанищева:
Любой код — это источник данных. Но мы же не выносим тело PHP-цикла в СУБД, чтобы потом его достать и проитерировать.
Иногда телу цикла нужно знать, что оно является телом цикла. Зачем разделять шаблон на два уровня, активный и пассивный? Не вижу в этом смысла.
Комментарий для alisey.myopenid.com:
Не понял про разделение шаблонов на два уровня. Какие два?
Комментарий для Евгения Степанищева:
Часть презентационной логики у вас в шаблоне, а часть вне шаблона.
Если тот iterate — это не презентационная логика, то шаблонизатор либо вообще не преследует цель разделения модели и вида, либо преследует, но плохо её достигает.
Я предпочитаю писать эти части отдельно. Какие-то данные пойдут строками таблицы, какие-то попадут в json_encode, какие-то переведутся в картинку специальным хелпером, о котором модель даже не догадывается. Вот как время у вас сбоку от поста. Офигеть, оно даже выделяется. По поему когда шаблон принимает решение о том, каким образом итерировать данные, и итерировать ли их вообще, это самый стабильный «энергетический уровень», любые последующие изменения будут локальными.
Комментарий для alisey.myopenid.com:
Я не задаюсь теми целями, которые вы обозначаете и MVC для меня вовсе не божество :) Мне работать с этим шаблонизатором удобно, дизайн править удобно, значит он хорош.
Комментарий для Евгения Степанищева:
MVC не предполагает религиозного поклонения. Где-то подходит, где-то нет.
А удобство бывает обманчиво, многим программистам удобно использовать копи-пейст и глобальные переменные. Другое дело, когда удобство можно сравнить, но сравнения (почему хорошо именно так, а не по другому) не было. Думаю как раз это всем было бы интересно.
Комментарий для Евгения Степанищева:
Почему плохо? С гордостью. :)
Вот я сейчас работаю с индийскими программистами — вот там дела куда хуже обстоят. Каждый индийский программист:
и так далее...
Комментарий для alisey.myopenid.com:
У меня большой опыт, в том числе разработки своих шаблонизаторов и использования чужих, опыт не только частный, но и в коллективе.
Подход без логики в шаблоне мне, при работе в коллективе понравился больше. В частном порядке мне это тоже более удобно, тут вообще никаких «обманчиво» быть не может, весь процесс «внутри меня», я просто вижу — работает или нет. Работает.
Сравнений, увы, не хочу проводить, это вопрос очень длительного исследования, времени на это пока нет.
Комментарий для alisey.myopenid.com:
Хотябы для того, что если следовать концепции разделения обязанностей, то получится, что в подходе bolk’a —
M — данные, переменные PHP
V — «пассивный» шаблон
C — активная часть, которая говорит «как» отображать данные.
Некоторые шаблонные движки берут часть этих функций от контроллера, но отсутствие этой возможности не нарушает общей концепции. :)
Комментарий для companyowner.myopenid.com:
Я тут ещё подумал, правильнее сказать что тут не Controller а Presenter. В итоге мы имеем полноценный MVP...
Комментарий для companyowner.myopenid.com:
О том под какую концепцию подводить я не думал и не думаю. Под какую-то подходит? Бог с ней. Для меня главное — решает или не решает какие-то мои задачи :)
Комментарий для Евгения Степанищева:
А зря...С опытом начинаешь понимать, что помимо Manual’а надо почитать и Gang of Four и Fowler’а — из всего этого формируется более глубокое понимание в программирование, особенно в ООП подходах.
Комментарий для companyowner.myopenid.com:
У меня есть глубокое понимание и все прочие понты :)
Я говорю, что к какой-то идеологии я не подводил и подводить не собираюсь. Мне незачем, я гений ;)
Комментарий для companyowner.myopenid.com:
Рисование табличек контроллером — это не дело, тут не о чем говорить.
Вот Болк «так чувствует», этот подход я понимаю.
очоч, нету никаких нотификаций о каментах =(
я переформулирую вопрос: правда, что существенным поводом написать «ещё один шаблонизатор» было ощущение что это весёлый/интересный/тп. процесс, просто как игра (не ради результата)?
а если нет, то в чём основные отличия от других шаблонизаторов? предыдущие посты я читал, если вдруг считаешь что они отвечают на вопрос -- можешь не отвечать =)
Комментарий для veged.ya.ru:
Как это нет нотификации? А вот справа от твоего ника в форме коммента RSS-иконку видишь? :)
Правда, что существенным поводом написать «ещё один шаблонизатор» было то, что меня не устраивает куда идёт существующая шаблонизация: к написанию ещё одного языка программирования.
Комментарий для veged.ya.ru:
Если предыдущие посты читал, то откуда вопрос-то?
хо! подписался =)
а вопрос... ну вот возник в итоге всёравно =)
ну и раз уж тут разговаривать теперь можно, скажу, хороших же языков программирования мало (особенно под специфичные задачи) ;-)
Комментарий для veged.ya.ru:
Мало, ага, но это не причина писать на PHP ещё один :)