Изменения

Template Toolkit

1859 байтов добавлено, 16:24, 5 октября 2010
м
«Не используйте Template Toolkit!»
* '''Блоков''': «функции» в шаблонах вредны — их полезно выносить в отдельные шаблоны, а если таковых очень много — это, скорее всего, какие-то сообщения, в этом случае их можно объединять в хеш-таблицу и в один файл «локализации», как делает MediaWiki (см. например, [http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesRu.php?revision=60129&view=markup русскую локализацию]).
* '''Фильтров''': чем фильтр не функция (имеется ввиду ''внешняя'' функция), зачем вводить дублирующий функционал?
* Инструкции '''SWITCHОператора выбора'''(SWITCH): её его нет даже в самом Perl’е и почему-то никто не страдает, зачем же она он в шаблонах?
* '''Макросов''': чем макрос не блок? Чем макрос не функция? Часто вы используете C-препроцессор в Perl-коде?
* '''Встраивания Perl-кода''': вредно для простоты шаблонов, неудобно (ибо Stash) и, возможно, опасно.
* '''Try/catch''': про то, что это очередная возможность усложнить шаблоны, упоминать как-то даже глупо. Исключения, как известно, придуманы не для шаблонов, а для сложных (по уровню вложенности вызовов функций) конфигураций обработки ошибок, которая в шаблонах опять-таки не полезна, а вредна. Можно было бы подумать, что это всё для обработки ошибок приложения, но лично я считаю, что шаблон ''не должен вызывать функций приложения'' — его предназначение заключается как раз в изоляции уровня приложения от уровня представления.
* '''«Обёрток»''' (wrapper’ов): чем это не фильтр, а чем фильтр не функция?
* '''TT не восстанавливает значение счётчика после выхода из FOREACH''': это поведение не так страшно в языках программирования типа PHP, где всё равно переменная обычно попадает в локальную область видимости функции, однако в шаблонах, особенно в сложных, приводит к различным относительно трудноуловимым багам.
Таким образом, остаётся ''приблизительно'' следующий набор: скаляры, хеши и массивы, функции, условный оператор, оператор цикла и включение другого шаблона. То есть, простейшие элементы. Так вот, именно их синтаксис в TT и логичен :-)
Кстати, раз обычный Stash — просто кошмар неиллюзорный, а Template Toolkit был (да и до сих пор) весьма популярен, в районе года 2000 появилась его XS-версия (то есть, переписанная на C) — {{CPAN|Template::Stash::XS}}. После этого TT-шаблонам, всё-таки, полегчало. Но, во-первых, Stash никогда не был единственным замедляющим работу TT уровнем, во-вторых, даже Stash::XS всё равно работает не так быстро, как мог бы, а в-третьих, Stash::XS долгое время имел различные баги — например, поддержка UTF-8 в {{CPAN|Template::Stash::XS}} появилась только 4 июля 2009 года. И ещё Stash::XS менее безопасен — делает меньше проверок на ошибки. Пример раскопок по данной причине: [http://m0r1k.livejournal.com/11794.html Perl + mod_perl + gdb]. Update от 25.06.2010. Ещё одним TT’шным идиотизмом является способ получения имени текущего шаблона, «в котором находишься». Его можно взять из обычного Stash’а, из '''специальных''' переменных с именами (!) «component» и «template». Гениально. Ну хотя бы «_» в начале имени поставили, или хотя бы верхним регистром написали. А так — конфликты обеспечены, та же Bugzilla на них нарывается. И опять-таки самое ужасное в том, что получение текущего шаблона вообще нелогично смешивать с данными шаблона — его логично вообще отделить в функцию, либо «сельф» какой-нибудь завести (<tt>$self/this</tt>).
=== Пример: Bugzilla ===