The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Обзор Perl модулей для работы с шаблонами (perl template cgi web)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: perl, template, cgi, web,  (найти похожие документы)
From: salw at newmail.ru Date: Mon, 28 Feb 2004 14:31:37 +0000 (UTC) Subject: Обзор Perl модулей для работы с шаблонами Оригинал: http://cgiscripts.r2.ru/docs/template.shtml http://cgiscripts.r2.ru/docs/template2.shtml Использование модуля для работы с шаблонами. Существует достаточное количество модулей для работы с шаблонами 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. Я надеюсь что и Вы найдете, что-то полезное для себя в этом модуле и возможно включите его в некоторые разработки. salw@newmail.ru Скачать модуль: http://cgiscripts.r2.ru/cgi-bin/get.cgi?STemplate-2.04
Использование модуля для работы с шаблонами ч.2. Разобравшись с основными принципами работы с шаблонами в perl, рассмотрим еще один способ облегчения жизни программисту. Основной инструментарий - новая версия модуля STemplate. Очень удобно, было бы обрабатывать шаблоны на лету, по аналогии с JSP, PHP и ASP. Это можно осуществить двумя способами: в случае с mod_perl описать модуль как handler(сам модуль потребует некоторого изменения, возможно в следующей статье я опишу это), и второй способ - с помощью .htaccess установить обработчик, в котором будет загружен модуль STemplate. Рссмотрим более подробно второй способ. Для начала выберем расширение для наших шаблонов. Пусть это будет .psp (perl server pages). Таким образом .htaccess будет выглядеть следующим образом. AddType application/x-psp psp Action application/x-psp /cgi-bin/psp_parser.cgi DirectoryIndex index.psp Первая строка устанавливает тип mime для нового типа файлов. Во второй описан скрипт-обработчик шаблонов. Важный момент! Полный путь запрашиваемого файла *.psp для psp_parser.cgi будет находиться в $ENV{'PATH_TRANSLATED'}. Третья строка устанавливает файл загружаемый по умолчанию. Теперь рассмотрим psp_parser.cgi use STemplate; my $temp = new STemplate; print "Content-type: text/html\n\n"; $ENV{'PATH_TRANSLATED'} =~ m|([\w/]+)/([^/].*?)$|; my $dir = $1; my $file = $2; my %data = (ID => '1'); $temp->template($dir,$file,\%data); Модуль должен находится в той же директории, что и psp_parser.cgi. В шаблонах psp можно подключать модули, соединяться с БД и т.д. При открытии файлов рекомендуется задавать абсолютный путь. Вместо заключения приведу пример простейшей psp страницы. А уже просмотрев код, Вы сами сможете сделать вывод о применении данной технологии. <% use CGI; $query = new CGI; $hello = $query->param('hello'); %> <HTML> <TITLE>test psp</TITLE> <BODY bgcolor=#000000 text=#ffffff> <CENTER><H1><% print "Hello: ".$hello."<BR>" %></H1></CENTER> <psp: [for ($j = 1; $j <= 25; $j++)]> <h1> $j: It Worked!- $hello </h1> </psp> <psp: [ ]> <h3> OK </h3> </psp> </BODY> </HTML>

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, Панко (?), 14:37, 12/10/2004 [ответить]  
  • +/
    Не надо из Perl делать PHP
     
  • 2, Anrdrew (?), 11:28, 31/07/2007 [ответить]  
  • +/
    Вы забили рассказать о HTML::Mason
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру