Template Toolkit

12.12.2020

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 "; $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

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


    Имя:*
    E-Mail:
    Комментарий: