Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Акын: блоки

Я тут, если помните, принялся описывать свой шаблонизатор «Акын», многие просили. Сейчас попробую продолжить. Итак, часть вторая: блоки.

Частые паттерны — скрыть целый блок разметки или повторить его несколько раз, решается в «Акыне» одной конструкцией: описанием блока. Что именно будет происходить с блоком, шаблон «не знает». Блок идентифицируется своим именем и описывается следующим образом:

<:имя>
Значение переменной: <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, а так же дальнейшие планы. На этом описательная часть закончится, если по этой части не потребуются разъяснения.

27 комментариев
Азат Разетдинов (razetdinov.ya.ru) 2008

Учить ещё один язык шаблонизации? Не-не-не :-)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для razetdinov.ya.ru:

Учить? Чего тут учить? :)

Это всё равно что выучить свой новый адрес при переезде. А кроме того, я никого ни к чему не принуждаю :) Это мой шаблонизатор, который писал для себя.

Owner (companyowner.myopenid.com) 2008

Каждый русский программист должен:

  1. Написать на Assemblere вирус;
  2. Написать engine (3D график, шаблонизатор, и т. д.);
  3. Изобрести велосипед;
  4. Увидеть чужой код. Сказать, что это го%но и переписать его.

100 раз в этом уже убедился ... :)

veged (veged.ya.ru) 2008

а смысл? в чём отличия?

Евгений Степанищев (bolknote.ru) 2008

Комментарий для companyowner.myopenid.com:

1) done
2) done
3) done
4) done

Евгений Степанищев (bolknote.ru) 2008

Комментарий для veged.ya.ru:

Смысл чего? Отличия от чего?

Евгений Степанищев (bolknote.ru) 2008

Комментарий для companyowner.myopenid.com:

Вы так говорите, как будто это плохо.

Alisey (alisey.myopenid.com) 2008

Шаблон отдельно, итерация отдельно?
По моему хорошо, когда шаблон знает об итерациях внутри себя.
Со стороны шаблона в таком случае понятно, почему <li> обёрнуто в какую-то специальную конструкцию, а <ul> не обёрнуто.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для alisey.myopenid.com:

Не вижу в этом смысла. Зачем шаблону вообще что-то знать? Он источник данных, как СУБД.

Alisey (alisey.myopenid.com) 2008

Комментарий для Евгения Степанищева:

Любой код — это источник данных. Но мы же не выносим тело PHP-цикла в СУБД, чтобы потом его достать и проитерировать.
Иногда телу цикла нужно знать, что оно является телом цикла. Зачем разделять шаблон на два уровня, активный и пассивный? Не вижу в этом смысла.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для alisey.myopenid.com:

Не понял про разделение шаблонов на два уровня. Какие два?

Alisey (alisey.myopenid.com) 2008

Комментарий для Евгения Степанищева:

Часть презентационной логики у вас в шаблоне, а часть вне шаблона.
Если тот iterate — это не презентационная логика, то шаблонизатор либо вообще не преследует цель разделения модели и вида, либо преследует, но плохо её достигает.
Я предпочитаю писать эти части отдельно. Какие-то данные пойдут строками таблицы, какие-то попадут в json_encode, какие-то переведутся в картинку специальным хелпером, о котором модель даже не догадывается. Вот как время у вас сбоку от поста. Офигеть, оно даже выделяется. По поему когда шаблон принимает решение о том, каким образом итерировать данные, и итерировать ли их вообще, это самый стабильный «энергетический уровень», любые последующие изменения будут локальными.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для alisey.myopenid.com:

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

Alisey (alisey.myopenid.com) 2008

Комментарий для Евгения Степанищева:

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

Owner (companyowner.myopenid.com) 2008

Комментарий для Евгения Степанищева:

Почему плохо? С гордостью. :)

Вот я сейчас работаю с индийскими программистами — вот там дела куда хуже обстоят. Каждый индийский программист:

  1. Целый день (неделю) может что-то активно делать, а результат будет 0.
  2. Может долго слушать и махать головой, при этом продолжать делать лажу.
  3. Сделать из простой задачи очень сложную. С массой классов и пропертис, причём обязательно в этом решение есть как минимум 2 класса которые делают одно и тоже.
  4. Работать с сервером через флэшку ибо обычно скорость с сервером, который находиться с ним в одном офисе 30кб/с.
  5. Если надо переиспользовать код, он его просто Copy&Paste’ит.
    и так далее...

 

Евгений Степанищев (bolknote.ru) 2008

Комментарий для alisey.myopenid.com:

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

Подход без логики в шаблоне мне, при работе в коллективе понравился больше. В частном порядке мне это тоже более удобно, тут вообще никаких «обманчиво» быть не может, весь процесс «внутри меня», я просто вижу — работает или нет. Работает.

Сравнений, увы, не хочу проводить, это вопрос очень длительного исследования, времени на это пока нет.

Owner (companyowner.myopenid.com) 2008

Комментарий для alisey.myopenid.com:

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

Хотябы для того, что если следовать концепции разделения обязанностей, то получится, что в подходе bolk’a —
M — данные, переменные PHP
V — «пассивный» шаблон
C — активная часть, которая говорит «как» отображать данные.

Некоторые шаблонные движки берут часть этих функций от контроллера, но отсутствие этой возможности не нарушает общей концепции. :)

Owner (companyowner.myopenid.com) 2008

Комментарий для companyowner.myopenid.com:

Я тут ещё подумал, правильнее сказать что тут не Controller а Presenter. В итоге мы имеем полноценный MVP...

Евгений Степанищев (bolknote.ru) 2008

Комментарий для companyowner.myopenid.com:

О том под какую концепцию подводить я не думал и не думаю. Под какую-то подходит? Бог с ней. Для меня главное — решает или не решает какие-то мои задачи :)

Owner (companyowner.myopenid.com) 2008

Комментарий для Евгения Степанищева:

А зря...С опытом начинаешь понимать, что помимо Manual’а надо почитать и Gang of Four и Fowler’а — из всего этого формируется более глубокое понимание в программирование, особенно в ООП подходах.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для companyowner.myopenid.com:

У меня есть глубокое понимание и все прочие понты :)

Я говорю, что к какой-то идеологии я не подводил и подводить не собираюсь. Мне незачем, я гений ;)

Alisey (alisey.myopenid.com) 2008

Комментарий для companyowner.myopenid.com:

Некоторые шаблонные движки берут часть этих функций от контроллера

Рисование табличек контроллером — это не дело, тут не о чем говорить.
Вот Болк «так чувствует», этот подход я понимаю.

veged (veged.ya.ru) 2008

очоч, нету никаких нотификаций о каментах =(

я переформулирую вопрос: правда, что существенным поводом написать «ещё один шаблонизатор» было ощущение что это весёлый/интересный/тп. процесс, просто как игра (не ради результата)?
а если нет, то в чём основные отличия от других шаблонизаторов? предыдущие посты я читал, если вдруг считаешь что они отвечают на вопрос -​-​ можешь не отвечать =)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для veged.ya.ru:

Как это нет нотификации? А вот справа от твоего ника в форме коммента RSS-иконку видишь? :)

Правда, что существенным поводом написать «ещё один шаблонизатор» было то, что меня не устраивает куда идёт существующая шаблонизация: к написанию ещё одного языка программирования.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для veged.ya.ru:

Если предыдущие посты читал, то откуда вопрос-то?

veged (veged.ya.ru) 2008

хо! подписался =)

а вопрос... ну вот возник в итоге всёравно =)

ну и раз уж тут разговаривать теперь можно, скажу, хороших же языков программирования мало (особенно под специфичные задачи) ;-)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для veged.ya.ru:

Мало, ага, но это не причина писать на PHP ещё один :)