Статьи

Представляем HTML :: Template

Комплексная сеть архивов Perl (CPAN) содержит широкий набор модулей, которые значительно облегчают жизнь разработчику. Вы бы хорошо, чтобы просмотреть сокровища на http://cpan.org, прежде чем приступать к любому новому проекту.

В качестве примера в этом уроке я приведу краткий обзор того, как установить модуль HTML :: Template. Но сначала давайте посмотрим, как вы можете установить модуль Perl в вашей системе.

Установка Perl

Установка Perl в Windows

Perl для Windows доступен для бесплатной загрузки на http://www.activestate.com . Установка модуля на удивление проста; тем не менее, он требует, чтобы модуль был в формате ppd ActiveState.

Установка может быть выполнена из оболочки ppm :

 C:>ppm  PPM - Programmer's Package Manager version 3.1.  Copyright (c) 2001 ActiveState SRL. All Rights Reserved.   Entering interactive shell. Using Term::ReadLine::Stub as readline library.   Type 'help' to get started.   ppm> install HTML-Template 

Это так просто. Если какие-либо зависимости существуют, они будут установлены первыми. Обратите внимание, что не все модули Perl были упакованы для ppm . Чтобы узнать, доступен ли модуль, введите в командной строке search <module> .

Если вам нужен модуль, которого нет в репозитории ActiveState, возможно, кто-то еще его упаковал. Вы можете найти список дополнительных репозиториев, установив модуль PPM :: Repositories, а затем запустив этот код:

 use PPM::Repositories;   for my $rep ( keys %Repositories ) {    next unless $Repositories{$rep}->{Active};    next unless grep { $_ == 5.8 } @{ $Repositories{$rep}->{PerlV} };    print $rep, $/, $Repositories{$rep}->{location}, $/,      $Repositories{$rep}->{Notes}, $/, $/;  } 

В противном случае вы можете установить модуль вручную. Мы обсудим, как это сделать, в разделе Unix / Linux ниже.

Установка Perl в Unix / Linux

Установка Perl в Unix и Linux может быть выполнена двумя способами: вручную или автоматически.

Ручной Путь

Скачайте модуль, разархивируйте и распакуйте его.

 $ tar zxvf HTML-Template-xx.tar.gz  $ cd HTML-Template-xx  $ perl Makefile.PL  $ make  $ make test  $ make install 

Если вы хотите установить файл вручную под Windows, вам нужно скачать nmake.exe от Microsoft . Затем просто замените make на nmake в инструкциях выше.

Хотя большинство модулей являются чистыми Perl, некоторые могут содержать код на C, и в этом случае вам понадобится компилятор C. (Компилятор никогда не требуется для пакетов ppm ).

Убедитесь, что вы просматриваете файл README перед установкой модуля.

Автоматический Путь

Некоторые модули зависят от других модулей, которые, в свою очередь, могут иметь другие зависимости. Установка всех этих модулей может быть немного утомительной, но есть альтернатива: установить пакет CPAN . Затем просто вызовите оболочку cpan из командной строки:

 $ cpan 

При первом cpan настроится сам. Ответьте на запросы, и после завершения настройки вы сможете установить пакет:

 cpan> install HTML::Template 

Если существуют какие-либо зависимости, cpan может получить и установить их.

Теперь, когда вы знаете, как устанавливать модули Perl, давайте подробнее рассмотрим одно из шаблонных решений Perl: HTML :: Template.

Представляем HTML :: Template

Perl великолепен в качестве языка прототипов, потому что он очень выразителен: разработчики могут многое сделать в несколько строк. Следствием этого является то, что для небольшого приложения легко превратиться во что-то намного большее, чем ожидалось. Поддержка и расширение такого приложения может стать довольно обременительным.

Написание больших веб-приложений с использованием традиционных методов CGI — это подход, который не очень хорошо масштабируется. Если вы единственный разработчик, смешивание вашего HTML с вашим Perl может быть допустимым, но этот подход не работает, когда вы являетесь частью команды. Ваш типичный веб-дизайнер не захочет начинать изменять свой Perl-код, если необходимо изменить дизайн.

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

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

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

Простой пример

Ниже приведен пример простого шаблона, template1.tmpl . Обратите внимание, что он состоит в основном из стандартного HTML с одним нестандартным тегом, tmpl_var , где имя атрибута установлено на день.

 <html>  <head>  <title>Template 1</title>  </head>  <body>  Today is <tmpl_var name=day>  </body>  </html> 

Использовать template шаблона из Perl очень просто:

 1.  #!c:/perl/bin/perl -T  2.  use CGI qw(:all);  3.  use HTML::Template;  4.  use POSIX;  5.  print header;  6.  my $template = HTML::Template->new(filename => 'template1.tmpl');  7.  $template->param(day => strftime('%A', localtime()) );  8.  print $template->output(); 

В строке 1 просто указывается, где находится интерпретатор Perl. -T означает, что мы находимся в порочном режиме. Это обеспечивает дополнительный уровень безопасности для веб-приложений, сообщая Perl, что мы не должны доверять любому пользовательскому вводу, если мы явно не заявим обратное. Это хорошая практика: вы всегда должны включать этот переключатель как само собой разумеющееся.

Строка 2 импортирует модуль CGI.pm. В этом нет необходимости на 100%: мы могли бы написать собственные функции CGI вручную, но это может привести к появлению всевозможных ошибок и проблем безопасности. Модуль CGI очень хорошо протестирован, и вы всегда должны использовать его при написании приложений CGI.

В строке 3 мы импортируем модуль HTML :: Template. В Line 4 добавлены стандартные функции / POSIX. Это позволяет нам легко определить день недели позже. Имейте в виду философию Perl «Есть больше, чем один способ сделать это» (TMTOWTDI) — мы могли бы сделать это, используя любое количество модулей дат.

Строка 5 является сокращением CGI для print "Content-Type: text/htmlnn" . Нам нужно вернуть тип контента, прежде чем мы выведем остальную часть веб-страницы. В строке 6 мы создаем объект шаблона. Имя файла нашего шаблона указывается в качестве единственного параметра.

Строка 7 устанавливает <tmpl_var> с именем "day" в день недели. Если вы не знакомы с функцией POSIX strftime , %A — это сокращение для возврата дня недели. Те же маски форматирования доступны для PHP и C.

И, наконец, в строке 8 мы показываем веб-страницу.

Итак, теперь мы познакомились с базовой философией HTML :: Template: мы создаем в основном HTML-код и <tmpl> некоторые заполнители <tmpl> для динамического содержимого. Синтаксис поддерживается намеренно простым; Ваши веб-дизайнеры могут просто поддерживать внешний вид сайта с помощью стандартного HTML и небольшого количества дополнительных тегов.

Loops

Хотя <tmpl_var> чрезвычайно полезен, он сам по себе недостаточен. Часто нам нужно представлять набор данных в табличном формате. Вот где <tmpl_loop> тег <tmpl_loop> :

 <html>  <head>  <title>Template 2</title>  </head>  <body>  <table>  <tr>    <th>Language</th>    <th>Description</th>  </tr>  <tmpl_loop name="language">  <tr>    <td><tmpl_var name="language_name"></td>    <td><tmpl_var name="description"></td>  </tr>  </tmpl_loop>  </table>  </body>  </html> 

По сути, у нас есть цикл с именем language , и внутри него есть две переменные, называемые language_name и description . Что касается Perl, HTML :: Template ожидает, что циклы будут переданы как ссылка на массив ссылок на хеш (ассоциативный массив):

 1.  #!c:/perl/bin/perl -T  2.  use CGI qw(:all);  3.  use HTML::Template;  4.  my @languages = (  5.      {  6.          language_name => 'Perl',  7.          description   => 'Practical Extraction and Report Language'  8.      },  9.      {  10.          language_name => 'PHP',  11.          description   => 'Hypertext Preprocessor'  12.      },  13.      {  14.          language_name => 'ASP',  15.          description   => 'Active Server Pages'  16.      },  17.  );  18.  print header;  19.  my $template = HTML::Template->new( filename => 'template2.tmpl' );  20.  $template->param( language => @languages );  21.  print $template->output(); 

Строки 4-17 определяют массив ссылок на хеш. Имена ключей хеша должны совпадать с именами шаблонов <tmpl_var> внутри <tmpl_loop> . В строке 20 ссылка на массив языков передается тегу шаблона <tmpl_loop name=language> .

Ручная настройка данных цикла в нашем скрипте Perl достаточно проста, но в реальном мире мы, скорее всего, получим данные нашего шаблона из базы данных. Допустим, у нас есть таблица с именем "languages" , со столбцом "language_name" и другой с именем "description." Мы можем так же легко сгенерировать вывод из запроса:

 1.  #!c:/perl/bin/perl -T  2.  use CGI qw(:all);  3.  use HTML::Template;  4.  use DBI;   5.  my $dbh = DBI->connect('dbi:<driver>:<my db>', '<user>', '<password>');   6.  my $sql = "select * from languages";  7.  my $sth = $dbh->prepare($sql);  8.  $sth->execute();   9.  my $languages = $sth->fetchall_arrayref({  10.     language_name => 1,  11.     description   => 1}  12.  );   13.  print header;  14.  my $template = HTML::Template->new( filename => 'template2.tmpl' );  15.  $template->param( language => $languages );  16.  print $template->output(); 

В строке 4 мы вводим DBI, модуль базы данных Perl. Строка 5 соединяется с базой данных MySQL. Замените <driver> , <my db> , <user> и <password> что подходит для вашей системы. Это не рабочий код — мы обычно не кодируем эту информацию жестко, и мы обычно включаем проверки, чтобы увидеть, не произошло ли какое-либо взаимодействие с нашей базой данных.

Строки 6-8 готовят наш оператор выбора SQL и исполняют его. В строках 9-12 мы получаем весь набор результатов. DBI предлагает много разных форматов для данных. Ссылка на массив лучше всего подходит для нас, потому что это формат, который ожидает HTML :: Template. Мы можем указать в ссылке на хеш столбцы, которые мы хотим назвать в нашем массиве.

Conditionals

Наконец, мы можем захотеть изменить вывод на основе определенных условий. HTML :: Template предлагает теги IF и UNLESS . Предположим, например, что мы хотим представить специальное сообщение, если языки не найдены:

 <html>  <head>  <title>Template 3</title>  </head>  <body>  <table>    <tmpl_if name=language>  <tr>    <th>Language</th>    <th>Description</th>  </tr>  <tmpl_loop name="language">  <tr>    <td><tmpl_var name="language_name"></td>    <td><tmpl_var name="description"></td>  </tr>  </tmpl_loop>    <tmpl_else>  Sorry, no languages were found    </tmpl_if>  </table>  </body>  </html> 

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

  UNLESS аналогичен IF , за исключением того, что вместо проверки, является ли условие истинным, мы видим, не является ли оно (то есть, «если не верно, сделайте это»)

Несколько шаблонов на странице

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

 <tmpl_include name="menu.tmpl"> 
Это оно?

Мы рассмотрели основы HTML :: Template здесь. Сэм Трегар, его автор, был очень осторожен, чтобы не включать какие-либо навороты, которые могли бы подорвать философию отделения бизнес-логики от пользовательского интерфейса. Несмотря на ограниченный синтаксис шаблонов, у меня никогда не было требований к чему-то более сложному. Однако, вопреки здравому смыслу Сэма, он создал расширение под названием HTML :: Template :: Expr, которое позволяет разработчику добавлять поддержку выражений и функций.

Наконец, для программистов на PHP и Python HTML :: Template был перенесен на ваш язык. Дополнительную информацию можно найти по адресу http://htmltmpl.sourceforge.net/ .