Изменения

Template Toolkit

1828 байтов добавлено, 16:24, 5 октября 2010
м
«Не используйте Template Toolkit!»
* '''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 ===