Template Toolkit

(русская редакция)

[ Пособия ] [ Руководство ] [ Модули ] [ Библиотеки ] [ Утилиты ] [ Вопросы ] [ Релиз ] [ Perl-ресурсы ]
 
Поиск
Template Toolkit | Руководство | Введение

Введение

[ Синтаксис ► ]
Введение в Template Toolkit.

Оглавление

ОПИСАНИЕ

Индекс ] [ Руководство ] [ Наверх ]

В разделе содержится общее введение в Template Toolkit, дается краткий обзор возможностей, приводятся примеры директив шаблонов и использования модуля Template.pm. Также описывается принцип, лежащий в основе системы: разделение элементов представления и логики приложения и данных.

Template Toolkit - это набор модулей, которые составляют быструю, гибкую, мощную и расширяемую систему по обработке шаблонов. Она первоначально разрабатывалась и остается наиболее полезной для генерации динамического контента web-сайта, но также эффективно может использоваться для работы с любыми текстовыми документами. Например, вся POD-документация этого модуля была подготовлена с помощью утилиты ttree.

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

    Dear [% name %],
    It has come to our attention that your account is in
    arrears to the sum of [% debt %].
    Please settle your account before [% deadline %] or we
    will be forced to revoke your Licence to Thrill.
    The Management.

По умолчанию, директивы шаблона заключены в последовательность символов '[%' ... '%]', но вы можете изменить эту и ряд других настроек, чтобы повлиять на поведение и работу Template Toolkit. Например, вы можете установить опцию INTERPOLATE, если вы предпочитаете использовать в шаблоне переменные в стиле Perl:

    Dear $name,
    It has come to our attention that your account is in
    arrears to the sum of $debt.
    ...

Template.pm

Template.pm - фронтенд к Template Toolkit, предоставляющий доступ ко всему спектру возможностей библиотеки через один модуль с простым интерфейсом. Он загружает все остальные необходимые модули и инициализирует группу объектов для обработки последующих запросов на обработку шаблонов. Параметры конфигурации можно передать конструктору new() модуля Template.pm, после этого они будут использованы для конфигурации основных объектов.

    use Template;
    my $tt = Template->new({
	INCLUDE_PATH => '/usr/local/templates',
	INTERPOLATE  => 1,
    }) || die "$Template::ERROR\n";

Объект Template предоставляет метод process() для обработки файлов шаблонов или текста. В качестве первого аргумента этому методу передается имя файла входного шаблона (или другой источник), следом передается ссылка хэш с определениями переменных для подстановки в шаблоне.

    my $vars = {
	name     => 'Count Edward van Halen',
	debt     => '3 riffs and a solo',
	deadline => 'the next chorus',
    };
    $tt->process('letters/overdrawn', $vars)
	|| die $tt->error(), "\n";

Метод process() возвращает истинное значение (1) в случае удачного завершения и отправляет результат обработки шаблона на STDOUT (по умолчанию). В случае ошибки метод возвращает неопределенное значение. После этого можно вызвать метод error(), который возвращает детальное описание ошибки.

Построение контента из компонентов

Несколько специальных директив (таких как INSERT, INCLUDE и PROCESS) позволяют строить контент из меньших шаблонов-компонентов. Это позволяет использовать модульный подход для создания веб-сайта или другого набора контента, основными достоинствами которого являются: возможность повторного использования компонентов, поддержка целостности внутри сайта, простота проектирования и последующей поддержки. Общие элементы, такие как шапки, подвалы, меню, таблицы и т.д., могут быть созданы в виде отдельных файлов-шаблонов, которые затем могут быть обработаны и включены в другие документы. Все определенные переменные наследуются этими шаблонами и могут быть использованы наряду с любыми другими указанными "локальными" переменными.

    [% PROCESS header
         title = "The Cat Sat on the Mat"
    %]
    [% PROCESS menu %]
    The location of the missing feline has now been established.
    Thank you for your assistance.
    [% INSERT legal/disclaimer %]
    [% PROCESS footer %]

Также можно определить шаблон с помощью директивы BLOCK внутри файла и включать его с помощью PROCESS, как это делатеся с любым другим шаблоном-файлом. Это может пригодиться для построения повторяющихся элементов, например таблиц, меню и т.д.

    [% BLOCK tabrow %]
       <tr><td>[% name %]</td><td>[% email %]</td></tr>
    [% END %]
    <table>
    [% PROCESS tabrow name="tom"   email="tom@here.org"    %]
    [% PROCESS tabrow name="dick"  email="disk@there.org"  %]
    [% PROCESS tabrow name="larry" email="larry@where.org" %]
    </table>

Связь между кодом и данными

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

    my $vars = {
	root   => 'http://here.com/there',
	menu   => [ 'modules', 'authors', 'scripts' ],
	client => {
	    name => 'Doctor Joseph von Satriani',
	    id   => 'JVSAT',
	},
	checkout => sub { my $total = shift; ...; return $something },
	shopcart => My::Cool::Shopping::Cart->new(),
    };

Template Toolkit самостоятельно определит, каким образом следует получить соответсвующую переменную и подставит ее значение в шаблон. Операция '.' используется для того чтобы получить доступ к элементам массивов или хэшей или для вызова методов объектов. Директива FOREACH используется для циклических операций с массивами, а для различных логических операций используются такие директивы как IF, UNLESS, ELSIF, ELSE, SWITCH, CASE и т.д.

    [% FOREACH section = menu %]
       <a href="[% root %]/[% section %]/index.html">[% section %]</a>
    [% END %]
    <b>Client</a>: [% client.name %] (id: [% client.id %])

    [% IF shopcart.nitems %]
       Your shopping cart contains the following items:
       <ul>
       [% FOREACH item = shopcart.contents %]
	  <li>[% item.name %] : [% item.qty %] @ [% item.price %]
       [% END %]
       </ul>
       [% checkout(shopcart.total) %]
    [% ELSE %]
       No items currently in shopping cart.
    [% END %]

Расширенные возможности: фильтры, макросы, исключения, плагины

Template Toolkit также предоставляет ряд дополнительных директив для более сложной обработки и возможности программирования. Модуль поддерживает выходные фильтры (FILTER), позволяет делать макроопределения (MACRO), содержит полноценную систему обработки исключений (TRY, THROW, CATCH, FINAL) и поддерживает архитектуру плагинов (USE), которая позволяет подгружать и использовать с минимальными затратами специальные модули-плагины и даже обычные модули Perl. Template Toolkit "всего лишь" процессор шаблонов, но вы можете легко расширить его, объединив с функциональностью любого модуля Perl. Таким образом, это также масштабируемая и расширяемая основа, идеально подходящая для управления слоем представления для серверов приложений, систем управления контентом и других веб-приложений.

Разделение представления и логики приложения

В отличие методов, использующих включение perl-кода или кода других языков сценариев непосредственно в документы-шаблоны, Template Toolkit поддерживает возможность хранить функциональные компоненты (то есть perl-код) в отдельности от компонентов представления (например, HTML шаблонов). Переменные шаблона обеспечивают интерфейс между двумя слоями, позволяя либо генерировать данные в коде и затем передавать их в шаблон для вывода (модель канала - pipeline model), либо связывать функции или ссылки на объекты с переменными, которые затем могут быть вызваны из шаблона в случае необходимости (модель вызова - callback model).

Директивы, которые предоставляет Template Toolkit, составляют собственный небольшой язык программирования, но в действительности они не разрабатывались для серьезного программирования общего назначения. Для этих целей больше подходит Perl. Если вы включаете логику приложения (например, фрагменты кода Perl или другого языка сценариев) в HTML шаблон, вы рискуете потерять четкое разделение между функциональностью и представлением. Становится сложнее изолировано поддерживать два этих элемента и гораздо сложнее, а часто и невозможно использовать код или само представление повторно. Гораздо лучше писать кож приложения в отдельных модулях, библиотеках или скриптах Perl, а затем использовать шаблоны для того чтобы управлять представлением результирующих данных. Таким образом, язык Template Toolkit следует рассматривать как набор директив для управления видом вывода данных, но не для их вычисления.

Тем не менее следует сказать, что Template Toolkit не навязывает вам тот или иной подход. Он оставляет выбор лучшего пути для решения задачи вам. Так, если вы установите опцию EVAL_PERL вы сможете спокойно включать perl-код в ваши шаблоны, заключая его между директивами PERL ... END.

Характеристики

Template Toolkit использует быстрый синтаксический анализатор, подобный YACC, который компилирует шаблоны в perl-код для достижения максимальной эффективности во время исполнения. Также он имеет развитый механизм кеширования, который управляет скомпилированными шаблонами в памяти и на диске (т.е. долгоживущими - persistent). Модули, которые составляют библиотеку очень гибко настраиваются и архитектура, вокруг которой они построены, разработана с возможностью ее расширения. Template Toolkit предоставляет мощный каркас, вокруг которого можно строить сложные системы по созданию и доставке контента, и в то же время для широкого использования предоставляет простой интерфейс модуля Template.

АВТОР

Индекс ] [ Руководство ] [ Наверх ]

Энди Уардли (Andy Wardley <abw@andywardley.com>)

http://www.andywardley.com/

ВЕРСИЯ

Индекс ] [ Руководство ] [ Наверх ]

Template Toolkit версия 2.14, дата релиза - 4 октября 2004.

АВТОРСКИЕ ПРАВА

Индекс ] [ Руководство ] [ Наверх ]

  Copyright (C) 1996-2004 Andy Wardley.  All Rights Reserved.
  Copyright (C) 1998-2002 Canon Research Centre Europe Ltd.

Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl.

[ Синтаксис ► ]

[ Пособия ] [ Руководство ] [ Модули ] [ Библиотеки ] [ Утилиты ] [ Вопросы ] [ Релиз ] [ Perl-ресурсы ]

http://www.template-toolkit.ru/