Как создать собственный фильтр для шаблонов Template Toolkit

Материалов по теме "Как создать собственный фильтр для шаблонов Template Toolkit" достаточно, как на русском, так и на английском языках.

А вот примеров кода реально работающего фильтра практически нет. Восполняю этот пробел, возможно кому-нибудь пригодится.

Далее изложено 3 варианта создания фильтра, все - работающие. Разъяснений и комментариев в этот раз не будет. Для изучения теории создания шаблонов рекомендую несколько публикаций, ссылки на которые приведены в заключительной части.

Варианты кода для создания фильтра

Примеры разработаны для решения задачи:
Есть строка текста неопределенной длины. Надо эту строку сократить до определенного администратором числа символов.

Вариант 1. Самый простой

1) В модуле, где происходит создание объекта шаблона, создать подпрограмму-фильтр.

Например:

Фильтр, в данном случае, выполняет следующие действия: принимает данные для обработки, проводит обработку, возвращает измененные данные. В общем, это самая обыкновенная функция.

Кстати, можно разместить фильтр в другом модуле, а потом его просто подключить с помощью use.

2) В опции, которые задаются при создании объекта TemplateToolkit, добавляем параметр FILTERS.

Пример:

3) Фильтр создан и его можно использовать в шаблонах Template Toolkit, как любой другой фильтр:

Вариант 2

Создаем фильтр в виде подключаемого в шаблонах плагина.

1) Создаем плагин.

2) Плагин-фильтр должен располагаться пространстве имен, которое задается опциями, при создании объектов Template Toolkit.

3) Используем получившийся плагин в шаблонах Template Toolkit.

Вариант 3. Самый правильный

Не знаю, как Вам, но мне не нравится указывать в шаблонах фильтр, с помощью знака доллара: FILTER $MyNewFilter . Если уж добавлять фильтр, как плагин, то и использовать, как обычный стандартный
фильтр: FILTER MyNewFilter.

Поэтому, продолжаем поиски. И находим третий вариант создания фильтра.

1) Создаем модуль плагина-фильтра:

Стоит отметить, что метод install_filter предлагают использовать многие руководства по Template::Plugin::Filter, однако ни одно из них даже словом не упоминает, что необходимо создавать метод new, а так же - как его создавать. А без new стабильно работать будет только 500-ая ошибка сервера.

2) Не забываем, что плагин-фильтр должен быть размещен в определенном опцией PLUGIN_BASE пространстве имен.

3) Вот оно счастье - красивое использование фильтра:

Полезные ссылки

Разнообразные теоретические аспекты создания фильтров можно узнать по приведенным ниже адресам:

http://www.template-toolkit.ru/Modules/Template/Plugin/Filter.html

http://www.template-toolkit.ru/Modules/Template/Plugin.html

http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template/Plugin/Filter.pm

Книга: Perl Template Toolkit - O'Reilly - By Darren Chamberlain, David Cross, Andy Wardley