Template Toolkit

Template Toolkit — мощная «легковесная» perl-библиотека для работы с шаблонами, позволяющая разделять код, данные и представление.

«Легковесная» в данном случае обозначает, что взаимодействие с пользователем, работа с базой данных, вызов шаблонов на обработку и отображение производится через perl-скрипты, содержащие всю логику работы (см. бизнес-логика), а сами шаблоны отвечают преимущественно за дизайн/представление.

Это — в отличие от «полновесных» систем разработки (frameworks), в которых Перл очень тесно интегрируется с HTML, и предоставляющих дополнительную функциональность для работы с веб-страницами, например сессии.

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

Возможности/преимущества/специфика 
В Template Toolkit используется свой язык, обладающий богатым, но простым для изучения синтаксисом.

Простой пример шаблона:
 <html>
 <head><title>[% title %]</title></head>
 <body>
   Вывод списка:
   <ul>
   [% FOREACH i = items %]
     <li>[% i %]</li>
   [% END %]
   </ul>
 </body>
 </html>

И скрипт, вызывающий его:
# !/usr/bin/perl
use Template;

my $tt2 = new Template({
    INCLUDE_PATH=>'/path/to/templates' #Путь к каталогу с шаблонами
});
my $vars={
    title=>'Заголовок страницы',
    items=>['Один', 'Два', 'Три']
};

print "Content-type: text/html\n\n";
$tt2->process("page1.htm", $vars);

По умолчанию в качестве разделителей блоков кода используются [% и %]. Но можно использовать любую другую последовательность символов, например <% %>, <? ?> и так далее. Причём изменять последовательность можно в любое время прямо внутри шаблона.

Ниже представлен список некоторых возможностей Template Toolkit:
 Позволяет без затруднений разрабатывать страницы сайта по любой схеме: сверху вниз, снаружи внутрь и изнутри наружу.

 Использует унифицированный синтаксис для всех типов данных:
hash.key — обращению к ключу хэша
array.1 — элемент массива с индексом 1
object.method — вызов метода объекта
Таким образом, получается, что неважно, что содержится в переменной: строка, функция, блок или что-то другое — всё вызывается единообразно.

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

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

 Развитая система написания плагинов и фильтров позволяет легко написать собственные плагины/фильтры, или использовать множество уже существующих (поставляются вместе с Template Toolkit).

 Позволяет вставлять внутрь шаблонов «сырой» Перл.
 В качестве блоков могут выступать как отдельные файлы, так и блоки, определяемые внутри внешнего или текущего файла.
 Появившееся со второй версии нововведение — «виды» (views), позволяет создавать шаблоны с применением объектно-ориентированного подхода.
 Может обрабатывать XML файлы, преобразуя их в HTML, и представляя, таким образом, альтернативу XSLT.
 В поставку входят скрипты-утилиты, позволяющие из произвольного набора файлов-шаблонов сгенерировать требуемый набор HTML-страниц.
 Хорошая документация, которая многими признаётся «золотым стандартом» документации среди библиотек Перла.

Полный список возможностей Template Toolkit очень велик. Более подробно с ними можно ознакомиться по документации, которую можно найти по ссылкам внизу страницы.

Недостатки 
Из-за того, что в Перле присутствуют переменные разных типов, а в Template Toolkit все они вызываются одинаково, возникают неоднозначности.

Есть особенности работы с объектами-хэшами, и объектами-массивами:

При попытке прохода по объекту-массиву через FOREACH выяснится, что в списке будет присутствовать только один элемент — сам объект.

А при обращения к элементу arrayobj.$index, где index — индекс требуемого элемента, Template Toolkit попытается вызвать метод с таким именем. А методов с именами 0, 7, 12 и т. д. в языках программирования, в общем-то, не бывает.

Для решения этих проблем в код класса нужно добавить метод as_list() — именно его Template Tookit вызывает при использовании FOREACH.

sub as_list { [@{$_[0]}] }

Смысл этого кода состоит в том, что берётся сам объект, превращается в обычный массив, и сразу же преобразуется в ссылку на массив — то, что нужно для FOREACH.

Как as_list() помогает при выборке конкретных элементов из объекта?

aref = aref_object.as_list();
aref.0;
aref.1;

Проблемы вызывает присутствие в классе функции AUTOLOAD:
 она перехватывает все вызовы виртуальных методов Template Toolkit
 так как Template Toolkit пытается сначала найти метод объекта с указанным именем, и только при неудаче — найти одноимённый ключ хэша, становится понятно, что AUTOLOAD также перехватывает все вызовы к ключам хэша

Вторую проблему можно решить так:

sub AUTOLOAD {
   my ($sub_name) = $AUTOLOAD=~/([^:]+)$/; #Найти имя запрашиваемого метода
   if (exists $_[0]{$sub_name}) { #Если у объекта существует ключ с именем  $sub_name,
      return $_[0]{$sub_name}      #то вернуть его
   }
}

Подсказки 
Имеется массив aref, и переменная ix. Мы хотим вывести элемент массива по индексу, указанному в ix.

Так будет неправильно:
aref.ix
В этом случае будет произведена попытка вызова метода ix.

А так — правильно:
aref.$ix
Знак доллара $ используется для подстановки значения переменной в выражение.

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

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

Авторы 
Создатель библиотеки Andy Wardley. Загрузить последнюю версию библиотеки (Template-Toolkit-N.NN.tar.gz) можно из CPAN. Ссылки на ресурсы см. ниже.

Ссылки

Внешние ресурсы 
 Официальный сайт
 Сайт на русском языке
 Страница скачки на официальном сайте
 Раздел CPAN, где можно найти последнюю версию Template Toolkit
 Версия для C#
 Версия для Haskell
 Плагин для Eclipse

Разработчики, использующие Windows, могут скачать архив всё-в-одном, содержащий Apache 2, Perl 5.x, mod perl 1.99, и множество полезных библиотек, не входящих в стандартную поставку языка Perl, среди которых есть Template Toolkit 2 и Apache::Template. Архив находится здесь: ftp://theoryx5.uwinnipeg.ca/pub/CPAN.

Библиотеки для работы с шаблонами в Perl 
 Легковесные, MVC
 Template Toolkit
 HTML::Template
 Text::Template
 CGI::FastTemplate
 Системы разработки приложений
 Embperl
 Apache::ASP
 HTML::Mason

Модули Perl
Свободные библиотеки программ
Шаблонные системы