Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Генерация контента сайта с использованием Template Toolkit

Источник: realcoding.net

[1 страница]

ОПИСАНИЕ



Этот пособие представляет собой введние в Template Toolkit и показывает несколько типичных способов использования этой библиотеки для генерации контента сайта. Пособие описывает генерацию статических страниц с использованием утилит tpage и ttree и динамических страниц с использованием CGI скриптов и обработчиков Apache/mod_perl.


Знакомство, краткое описание и объяснение с использованием примеров различных возможностей Template Toolkit. Дополнительная информация приведена в pod-документации Template, Template::Manual и в подразделах, например


perldoc Template # использование модуля Template.pm

perldoc Template::Manual # содержание документации

perldoc Template::Manual::Config # опции конфигурации


Документация также поставляется в HTML формате (или точнее, в форме HTML шаблонов). Смотрите каталог docs пакета для получения дополнительной информации о построении HTML документации.


Если же вы читаете это руководство как часть HTML документации, значит вам не нужно беспокоится об этом. Вы можете присесть, расслабиться и наслаждаться чтением остальной части пособия...

ВВЕДЕНИЕ



Template Toolkit - это набор модулей Perl, который в совокупности реализуют систему по обработке шаблонов. В данном контексте шаблон - это текстовый документ, содержащий специальные разметочные теги, называемые директивами. Директива это инструкция процессору шаблонов выполнить некоторое действие и заменить директиву в документе на результат этого действия. Директивы используются для определения или вывода значения переменной, выполнения циклических операций с массивами (FOREACH), выполнения условных операций (IF/UNLESS/ELSE), включения и выполнения других шаблонов (INCLUDE) и т.д.


Во всем остальном, документ это обычный текстовый файл и может иметь любое содержимое (например HTML, XML, RTF, LaTeX, и т.п.). Директивы включаются в документ внутри специальных разметочных тегов. По умолчанию, в качестве таких тегов используются [% и %], но они могут быть заменены на другие через опции конфигурации модуля. Пример HTML документа с дополнительными директивами Template Toolkit.

[% INCLUDE header

title
= This is an HTML example

%]


<
h1>Some Interesting Links</h1>


[%
webpages = [

{
url => http://foo.org, title => The Foo Organisation }

{
url => http://bar.org, title => The Bar Organisation }

]

%]


Links:

<
ul>

[% FOREACH
link = webpages %]

<
li><a href=[% link.url %]>[% link.title %]</a>

[%
END %]

</
ul>


[% INCLUDE
footer %]

Этот пример показывает как директива INCLUDE используется для загрузки, обработки и включения в текущий документ отдельных шаблонов header и footer. Эти файлы могут выглядеть например так:


header:

<html>

<
head>

<
title>[% title %]</title>

</
head>


<
body bgcolor=#ffffff>


footer:


<
hr>


<
center>

© Copyright 2000 Me, Myself, I

</center>


</
body>

</
html>

Также в примере показано использование директивы FOREACH для построения таблицы ссылок с помощью цикла по массиву webpages. Мы определяем внутри шаблона массив, содержащий несколько ссылок на хэши, состоящих из двух элементов url и title. Директива FOREACH проходит по массиву, используя link в качестве указателя на каждый элемент массива (ссылка на хэш). Затем директивы [% link.url %] и [% link.title %] получают соответсвующие значения хэша и вставляют их в документ.


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

ГЕНЕРАЦИЯ СТАТИЧЕСКИХ СТРАНИЦ



Создав шаблон, мы теперь можем обработать его и получить некоторый вывод. Наиболее быстрый и простой способ для этого использование утилиты tpage. Она поставляется как часть библиотеки Template Toolkit и должна быть установлена в каталог с исполняемыми файлами perl.


Если вы сохранили свой шаблон как файл mypage.html, вам нужно выполнить команду:


tpage mypage.html


Эта команда запустит обработку шаблона, а вывод будет отправлен на STDOUT (т.е. пролетит по вашему экрану). Вы может перенаправить вывод в файл, но будьте осторожны, не указывайте то же имя файла, что и имя шаблона, иначе вы перезапишите его. Вы можете использовать для шаблонов и обычных файлов различные расширения. Например, для шаблонов используйте расширение .atml (видимо Another Template Markup Language?) и привычное .html для выходных файлов (преполагается, что вы создаете HTML). Или, вы можете перенаправить вывод в другой каталог, например

tpage mypage.atml > mypage.html

tpage templates
/mypage.html > html/mypage.html

Утилита tpage довольно проста и предназначена для того, чтобы дать возможность просто обработать шаблон без необходимости писать perl-код. Более гибкая утилита ttree описанна ниже, но сейчас нам достаточно вывода сгенерированного командой из примера выше (для краткости пустые строки удалены):

<html>

<
head>

<
title>This is an HTML example</title>

</
head>


<
body bgcolor=#ffffff>


<
h1>Some Interesting Links</h1>


Links:

<
ul>

<
li><a href=http://foo.org>The Foo Organisation</a>

<
li><a href=http://bar.org>The Bar Organisation</a>

</
ul>


<
hr>


<
center>

© Copyright 2000 Me, Myself, I

</center>


</
body>

</
html>

Шаблоны header и footer включены (предполагается, что вы их создали и они находятся в текущем каталоге) и данные о ссылках преобразованы в список в HTML-файле.


Утилита ttree, также поставляемая в составе библиотеки Template Toolkit, предоставляет более гибкий способ обработки шаблонов. При первом запуске утилиты, вам будет предложено создать конфигурационный файл, в большинстве случаев называемый .ttreerc в вашем домашнем каталоге. Ответьте y, чтобы создать файл.


Документация по ttree описывает, как вы можете изменить расположение это файла, а также описывает синтаксис и назначение различных опций в этом файле. Конфигурационный файл, приведенный в качестве примера, содержит комментарии, которые также могут помочь.

perldoc ttree

ttree
-h

Коротко говоря, конфигурационный файл описывает каталоги, в которых хранятся шаблоны (src), и куда будут сохраняться соответсвующие файлы (dest), и некоторые другие каталоги (lib), которые могут содержать файлы шаблонов, которые вы планируете включать с помощью директивы INCLUDE в ваши исходные шаблоны. Также в конфигурационном файле можно указать опции парсера (такие как verbose и recurse) и при помощи регулярных выражений ограничить список файлов, которые необходимо обрабатывать парсером (ignore, accept) или указать файлы, которые вместо обработки нужно скопировать (copy).


Пример файла .ttreerc:

$HOME/.ttreerc:


verbose

recurse


# каталог, в котором хранятся другие конфигурационные файлы ttree

cfg = ~/.ttree


src
= ~/websrc/src

lib
= ~/websrc/lib

dest
= ~/public_html/test


ignore
= b(CVSRCS)b

ignore
= ^#

Можно создать много других конфигурационных файлов и сохранить их в каталоге, указанном в опции cfg, как показано выше. Затем вы можете указать команде ttree опцию -f filename, чтобы использовать файлы из этого каталога.


Когда вы запускаете скрипт, он сравнивает все файлы в каталоге src (включая файлы в подкаталогах, если установлена опция recurse) с файлами в каталоге dest. Если выходного файла не существует или он имеет более раннее время модификации, чем соответсвующий исходный файл (шаблон), то исходный файл будет обработан парсером и вывод записан в выходной файл. Опция -a вынуждает скрипт обработать все файлы вне зависимости от времени модификации.


Скрипт не обрабатывает файлы из каталога lib, но он включает каталог в переменную INCLUDE_PATH, передаваемую процессору шаблонов для того чтобы он мог определить местонахождение файлов, указываемых в директивах INCLUDE или PROCESS. Таким образом, каталог lib - хорошее место для хранения элементов, используемых в шаблонах, таких как header, footer, и т.п., которые не являются документами в полном смысле этого слова.


Также в конфигурационном файле можно указать различные опции Template Toolkit. Для получения подробной информации обратитесь к документации ttree и краткой справке (ttree -h). Например,

$HOME/.ttreerc:


pre_process = config

interpolate

post_chomp

Опция pre_process позволяет указать шаблон, который будет обработан перед каждым файлом. Неудивительно, что также есть опция post_process для добавления шаблона, обрабатываемого после обработки файла. В приведенном выше фрагменте мы указываем, что шаблон config будет использован в качестве префиксного шаблона. Мы можем создать этот файл в каталоге lib и использовать его для определния некоторых общих переменных, включая определенные ранее ссылки на веб-страницы и которые мы можем захотеть использовать в других шаблонах. Также в этот файл мы можем включить голову и заголовок HTML-документа, или меню, которые затем будут включаться в начало любого шаблона, но пока мы будем использовать для этих целей отдельный файл header.


$lib/config:

[% root = ~/abw

home = $root/index.html

images = $root/images

email = abw@wardley.org

graphics = 1

webpages
= [

{
url => http://foo.org, title => The Foo Organsiation }

{
url => http://bar.org, title => The Bar Organsiation }

]

%]

Подготовив шаблоны header и footer из приведенного ранее примера и поместив их в каталог lib, вы можете начинать создавать в вашем каталоге src веб-страницы, подобные приведенной ниже, и обрабатывать их с помощью ttree.


$src/newpage.html:

[% INCLUDE header

title
= Another Template Toolkit Test Page

%]


<
a href=[% home %]>Home</a>

<
a href=mailto:[% email %]>Email</a>


[% IF
graphics %]

<
img src=[% images %]/logo.gif align=right width=60 height=40>

[%
END %]


[% INCLUDE
footer %]

Здесь мы показали, как использовать предопределенные переменные в качестве флагов для включения различных возможностей (например, graphics) и определять общие переменные, такие как адрес email, URLы домашней страницы, каталога с картинками и т.д. Такой подход позволяет определить эти перемнные один раз, и таким образом поддерживать их целостность на всех страницах и обеспечить возможность легко изменить их значения на новые.


После запуска ttree, вы должны увидеть схожий с приведенным ниже вывод (предполагается, что флаг verbose установлен).


ttree 1.14 (Template Toolkit version 1.02a)

Source: /home/abw/websrc/src

Destination
: /home/abw/public_html/test

Include Path: [ /home/abw/websrc/lib ]

Ignore: [ b(CVSRCS)b, ^# ]

Copy: [ ]

Accept: [ * ]

+ newpage.html


+ перед newpage.html показывает что файл был обработан процессором, а вывод сохранен в каталоге назначения. Если вы снова запустите эту команду, вы увидите, что в этой строке вывода вместо + будет выведен - и будет приведена причина по которой файл не был обработан процессором.


- newpage.html (not modified)


Процессор обнаружил страницу newpage.html в каталоге назначения с датой модификации большей, чем у исходного файла, и не стал тратить время на его повторную обработку. Для того, чтобы принудительно обработать все исходные файлы, используйте опцию -a. Дополнительно вы можете один или более исходных файлов в качестве аргументов командной строки для утилиты ttree:


ttree newpage.html


Полученный после обработки процессором файл будет выглядет следующим образом.


$dest/newpage.html:

<html>

<
head>

<
title>Another Template Toolkit Test Page</title>

</
head>


<
body bgcolor=#ffffff>


<
a href=~/abw/index.html>Home</a>

<
a href=mailto:abw@wardley.org>Email</a>


<
img src=~/abw/images/logo.gif align=right width=60 height=40>


<
hr>


<
center>

© Copyright 2000 Me, Myself, I

</center>


</
body>

</
html>

Вы можете добавить сколько угодно документов в каталог src и ttree обработает их аналогично. Таким образом можно полностью построить статическое содержимое сайта с помощью одной команды. Дополнительная выгода заключается в том, что вы можете быть уверены в целостности ссылок, едином стиле шапки и всех прочих компонентов, реализованных через общие шаблоны и переменные.

ДИНАМИЧЕСКАЯ ГЕНЕРАЦИЯ СТРАНИЦ С ПОМОЩЬЮ CGI СКРИПТОВ



Модуль Template обеспечивает простой интерфейс к библиотеке Template Toolkit для использования в CGI-скриптах и обработчиках Apache/mod_perl. Просто включите в ваши скрипты модуль Template с помощью команды use, создайте экземпляр объекта с помощью метода new(), а затем вызывайте метод объекта process(), передавая в качестве параметра имя файла шаблона. Второй передаваемый параметр - ссылка на хэш с переменными, которые мы хотим сделать доступными в шаблоне:

#!/usr/bin/perl -w


use strict;

use
Template;


my $file = src/greeting.html;

my $vars = {

message => Hello Worldn

};


my $template = Template->new();


$template->process($file, $vars)

die
Template process failed: , $template->error(), n;

Для того чтобы наши скрипты работали с шаблонами из предыдущих примеров, мы можем добавить некоторые опции конфигурации в вызове конструктора, чтобы сообщить парсеру о нашем окружении:

my $template->new({

# где искать файлы шаблонов

INCLUDE_PATH => /home/abw/websrc/src:/home/abw/websrc/lib,

# предварительно обработать lib/config, чтобы определить дополнительные переменные

PRE_PROCESS => config,

});

Заметьте, что здесь мы определяем в опции PRE_PROCESS файл config. Это означает, что шаблоны, которые мы будем обрабатывать могут использовать те же глобальные переменные, которые мы определили раньше для использования в статических страницах. Нам не нужно повторно определять их в скрипте. Тем не менее, мы можем предоставить дополнительные данные и функциональность, специфичную для скрипта через хэш переменных, передаваемый методу process().


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


Приведем более детальный пример для дальнейшего рассмотрения. Среди различных переменных шаблона, определенных в $vars, мы создали ссылку на объект CGI и ссылку на функцию get_user_projects.

#!/usr/bin/perl -w


use strict;

use
Template;

use
CGI;


$ =
1;

print
Content-type: text/htmlnn;


my $file = userinfo.html;

my $vars = {

version => 3.14,

days => [ qw( mon tue wed thu fri sat sun ) ],

worklist => &get_user_projects,

cgi => CGI->new(),

me => {

id => abw,

name => Andy Wardley,

},

};


sub get_user_projects {

my $user = shift;

my @projects = ... # заполняем данными

return @projects;

}


my $template = Template->new({

INCLUDE_PATH => /home/abw/websrc/src:/home/abw/websrc/lib,

PRE_PROCESS => config,

});


$template->process($file, $vars)

die
$template->error();


Ниже приведен пример шаблона, который мы можем использовать в скрипте.


$src/userinfo.html:


[% INCLUDE
header

title
= Template Toolkit CGI Test

%]


<
a href=mailto:[% email %]>Email [% me.name %]</a>


<
p>This is version [% version %]</p>


<
h3>Projects</h3>

<
ul>

[% FOREACH
project = worklist(me.id) %]

<
li> <a href=[% project.url %]>[% project.name %]</a>

[%
END %]

</
ul>


[% INCLUDE
footer %]

Этот пример показывает как можно разделить perl-реализацию (код) и представление (HTML), что не только делает проще поддержку изоляции, но и позволяет многократно использовать существующие шаблонные элементы, такие как шапки, подвалы и т.п. Используя шаблоны для организации вывода CGI скриптов, вы можете обеспечить такую же целостность, какой мы добились при построении статических страниц с помощью ttree и других средств.


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



Похожие статьи:
- Дополнительные возможности JpGraph
- Краткое описание регулярных выражений: POSIX и PCRE
- Установка и конфигурация веб сервера Apache с поддержкой PHP, JSP и MySQL на Windows XP
- Subsys_JsHttpRequest: подкачка данных без перезагрузки страницы (AJAX)
- Доступ к базам данных под управлением СУБД POSTGRES95
- Perl & XML. Библиотека программиста
- Генерация контента сайта с использованием Template Toolkit
- Создание приложения, работающего с XML-данными
- Модуль Apache mod_rewrite
- Пишем правильный online WYSIWYG-редактор
- Хороший дизайн
- Создание динамических элементов страницы с помощью CSS.
- Поиск по сайту - статичный контент (Perl)


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]