Web - Использование модуля для работы с шаблонами - PRCY⮭net
Существует достаточное количество модулей для работы с шаблонами HTML.

Все они имеют свои преимущества и недостатки. Описываемый в данной статье модуль не способен стать лидирующем, да и такая цель при его создании не ставилась. Эта библиотека расчитана на определенный круг задач, и наверное для крупных Web-проектов она не подойдет. Хотя есть достаточно серьезные коммерческие работы, использующие данный модуль.

Модуль является разработкой автора и не претендует на размещение на CPAN.

Не буду останавливаться на том, насколько удобным является использование шаблонов. Остановлюсь лишь на предлагаемых вариантах реализации (причем приведенные способы не являются исчерпывающими). А потом приведу краткое описание предлагаемого модуля.

Модуль Text::Template

Здесь код perl вставляется в шаблон, используя фигурные скобки. Сам механизм написания шаблона показался неестественным и запутанным. Тем более, что если ваши шаблоны будет редактировать дизайнер, ему будет довольно трудно отличить промежеточные переменные, от того что необходимо вывести на странице. (Здесь подразумевается сложная организация шаблонов - с использованием циклов и т.д.)

Модуль Template

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

Так же интерпретация(разбор) таких шаблонов займет гораздо больше времени, чем скажем реализация даной логики на perl. Да к тому же данный модуль не входит в поставку perl и установлен далеко не на всех хостингах. А о бесплатных и говорить не приходится (www.f2s.com, webservis.ru, wallst.ru, holm.ru, hut.ru). Способ простого копирования модуля работает лишь в 50%. Если Вы пишете коммерчесий продукт, то данное обстоятельство может уменьшить круг потенциальных покупателей.

Модуль CGI::FastTemplate

Все бы хорошо. И возможно на этом модуле можно было прекратить поиск.

Но и тут не все так, как хотелось бы видеть. При работе с таблицами (где количество строк определяется в процессе работы, а так же и в некоторых других случаях) приходится разные элементы хранить в разных файлах. Это по моему мнению жутко неудобно как для дизайнера, так и для программиста. При написании средней программы (сужу по своему опыту) количество таких файлов может достичь порядка 20-25 шт (при использовании этого модуля). А так как обычно все шаблоны хранятся в одной директории, то можно просто в них запутаться.

Модуль HTML::EmbPerl

Самый подходящий вариант. Но как и вслучае с Template установлен не везде. И мне пришлось отказаться от его использования. Так же имеет внушительный размер. Сам механизм встраивания кода perl в страницу показался не очень удобным, хотя это на любителя.

А теперь о главном

У меня давно была задумка - встраивать код perl в страницы (наподобие PHP), еще до знакомства с вышеперечисленными модулями. И эта задумка была реализована в описываемом модуле. Модуль занимает всего несколько килобайт и не зависит от операционной системы.

Идея проста. Код perl заключается в теги <% %>. Что бы было понятнее, приведу пример шаблона.

<body>

<center><h3>Test Page</h3></center><br><br>

<%

print "<font color=red><h3> $MESG </h3></font>" if $MESG;

%>

<table cellpaddind=1 cellspasing=1>

<tr bgcolor=#91af6d>

<td>N</td>

<td>1</td>

<td>2</td>

<td>3</td>

<td>4</td>

<td>5</td>

<td>6</td>

<td>7</td>

<td>8</td>

<td>9</td>

<td>10</td>

</tr>

<%

# === Perl Code

for ($x = 0; $x < scalar(@$STAT); $x++) {

if (int($x/2) == ($x/2)) { $bgcolor = "#ffffff" }

else { $bgcolor = "#c0d8bc" }

print qq{<tr bgcolor=$bgcolor>};

print qq{<td>${\($x+1+$INDEX)}</td>};

print qq{<td>$STAT->[$x][1]</td>

<td>$STAT->[$x][2]</td>

<td>$STAT->[$x][3]</td>

<td>${\($STAT->[$x][4] == 0 ? $STAT->[$x][4] : "YES" )}</td>

<td>$STAT->[$x][5]</td>

<td>$STAT->[$x][9]</td>

<td>$STAT->[$x][10]</td>

<td>$STAT->[$x][6]</td>

<td>$STAT->[$x][7]</td>

<td>$STAT->[$x][8]</td>};

print qq{</tr>\n};

last if $x == ($STOP-1);

}

# ===

%>

Если на странице нужно просто вывести значение переменной, то это делается так <% print $VAR %>. Обратите внимание на 'print'. Он является обязательным.
Передача параметров шаблону осуществляется так:

use STemplate;

my $temp = STemplate->new();

my %data = (

$MESG => 'Y',

$SSS => ($ee == 1 ? 'Y' : 'N'),

$STAT => [$array_ref1,$array_ref2,...],

$STOP => getstop() # процедура

# возвращающая

# скаляр

);

print "Content-type: text/html\n\n";

$temp->template($TEMP_DIR,$TEMP_FILE,\%data) || die;

Таким образом все ключи хеша %data становятся переменными в шаблоне.

В качестве значений %data можно передавать только скаляры (подразумевается что ссылки так же являются скалярами).

Если наполнение(контент) страницы берется из Базы Данных, то в качестве ключа %data можно задать объект базы данных. А в самом шаблоне вызывать через него необходимые методы.

$dbh = DBI->connect(....);

...

$data{'DBH'} = $dbh;

...

шаблон

...

$sel = $DBH->prepare('SELECT * FROM TABLE');

$sel->execute() || die;

$table = $sel->fetchall_arrayref();

$sel->finish();

...

В $table находится массив массивов, содержащий все строки из таблицы.

Доступ к определенному атрибуту осуществляется -

$table->[НОМЕР_СТРОКИ-1][НОМЕР_АТРИБУТА-1].

Если вы не хотите выводить результат обработки наблона на экран, а скажем, нужно сохранить все в файле. То тогда перед вызовом метода 'template' откройте файл (open(FILE,....)), а потом установите поток вывода по умолчанию - select(FILE).

Если есть доступ к настройкам Apache, то можно задать обработчик для всех страниц с определенным расширением. Скажем .plhtm.

Я надеюсь что и Вы найдете, что-то полезное для себя в этом модуле и возможно включите его в некоторые разработки.
Information
  • Posted on 27.04.2013 15:29
  • Просмотры: 1213