Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Интернет технологии -> Perl -> Использование шаблонов при программировании web-приложений


Использование шаблонов при программировании web-приложений в среде Perl

Зачем вообще использовать шаблоны?

   Может, кто-то скажет, а зачем выносить HTML код в отдельный файл если его можно спокойно писать в скрипте? Да конечно в скрипте можно писать HTML код, но просмотреть полностью <собранную>, или частично <собранную> страницу которую выводит скрипт, возможно только при его нормальной работе, а во время отладки скрипта, как правило, возникают некоторые трудности. Потом при смене дизайна, опять же, править HTML код в скрипте сущая каторга, сколько раз я слышал о нареканиях со стороны Web-мастеров, что понять какие куски кода и в какой последовательности выносятся невозможно, так как, по большей части, они не программисты и вникать в код скрипта не намерены. И так далее и тому подобное, поэтому, все-таки будем разделять скрипты от HTML кода:

Какая должна быть структура шаблонов

   Сначала, вынося HTML код из скриптов, я каждый кусок записывал в отдельный файл. Да когда нет особых сложностей в сборке страницы (шапка, основа, подвал), то трудностей нет, но когда страница имеет сложные внедрения, такие как списки, причем одновременно разных видов (например список страниц и список товаров текущей страницы), количество файлов начинало возрастать с неимоверной быстротой (у меня дошло до того, что страница стала собираться из 28 файлов!!!), и опять возникли трудности, неимоверное количество кусков кода, настолько усложнило их обработку и редактирование, что я пришел опять к изначальной точке:
   Потом пришла идея - использовать в качестве шаблона, всего 1 файл, который легко редактировать и который легко предварительно просмотреть визуально. То есть использовать в качестве шаблона уже практически готовую страницу, а разбивать её на куски будет сам скрипт.


Пример вывода страницы списка товаров с использованием одного шаблона

<html>
<head>
   <title>Шаблон списка товаров</title>
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>
<table width="100%" border="0">
<tr>
       <td>
            Список товаров категории 1
       </td>
</tr>
<tr>
       <td>
           Страницы <
           <font color="red"><b>1</b></font>
           <a href="?category=1&page=1">2</a>
           <a href="?category=1&page=1">3</a>
           <a href="?category=1&page=1">4</a>
           >
       </td>
</tr>
<tr>
       <td>
              <table width="98%" border="0" >
              <tr>
                     <td>
№ п.п.</td>
                     <td>
Наименование товара</td>
                     <td>
Цена товара</td>
              </tr>
              <tr>
                     <td>
1</td>
                     <td>
Товар № 1</td>
                     <td>
100 р.</td>
              </tr>
              <tr>
                     <td>
2</td>
                     <td>
Товар № 2</td>
                     <td>
150 р.</td>
              </tr>
              <tr>
                     <td>
3</td>
                     <td>
Товар № 3</td>
                     <td>
200 р.</td>
              </tr>
              </table>
       </td>
</tr>
<tr>
       <td>

              Страницы <
              <font color="red"><b>1</b></font>
              <a href="?category=1&page=1">2</a>
              <a href="?category=1&page=1">3</a>
              <a href="?category=1&page=1">4</a>
              >
       </td>
</tr>
</table>
</body>
</html>

Выглядит наша таблица как:

Список товаров категории 1
Страницы < 1 2 3 4 >
№ п.п. Наименование товара Цена товара
1 Товар 1 100 р.
2 Товар 2 150 р.
3 Товар 3 200 р.
Страницы < 1 2 3 4 >


Какие блоки кода нам понадобятся:

  • Страницы, причем вся строка, так как в зависимости от того, сколько у нас будет товаров, у нас будет либо постраничный вывод, либо все товары уместятся на одной странице. Отдельно из этой строки нам понадобится текущая страница, и ссылка на другую страницу;
  • Строка с выводом товара;

Что нужно будет изменять на странице:

  • Заголовок страницы;
  • Заголовок таблицы (название категории);
  • Количество и номера страниц;
  • № п.п., Наименование товара и Цена товара

После обработки получаем такой HTML-код:

<html>
<head>
   <title>
Список товаров категории %name_category%, страница %n_page%</title>
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<table width="100%" border="0" >
<tr>
       <td>

              Список товаров категории %name_category%
       </td>
</tr>

<tr>
<td>
Страницы <
<font color="red"><b>%n_page%</b></font>
<a href="?category=%id_category%&page=%n_page%">%n_page%</a>

>
</td>
</tr>

<tr>
       <td>
              <table width="98%" border="0" >
              <tr>
                     <td>
№ п.п.</td>
                     <td>
Наименование товара</td>
                     <td>Цена товара</td>
              </tr>
<tr>
<td>
%npp%
</td>
<td>
%name_goods%
</td>
<td>
%price_goods%
</td>
</tr>

              </table>
       </td>
</tr>


</table>
</body>
</html>

Что получается? Перед каждой строкой определенного блока кода мы вставили небольшой комментарий в виде , и в тех местах, где мы должны вставить код мы добавили по дополнительному комментарию (, , ). Причем комментарий у нас получился в середине куска кода который мы отметили как !
Почему мы использовали именно комментарии? Да потому, что при просмотре этого шаблона мы увидим все как положено, без лишних вещей:

Список товаров категории %name_category%
Страницы < %n_page% %n_page% >
№ п.п. Наименование товара Цена товара
%npp% %name_goods% %price_goods%


   Мы можем проверить стили и общий дизайн <не отходя от кассы>.
Почему мы поставили комментарии напротив каждой строки, а не, скажем, просто метки начала и конца блока? Да потому, что в случае вывода строки списка номеров страниц, нам требуется <выкусить> часть блока, а потом, после обработки, вставить обратно, нам бы пришлось этот блок разбивать не на 3 части а на 4 (начало блока, текущая страница, ссылка на другую страницу, конец блока). Да и потом, мне лично визуально гораздо проще видеть эти блоки в коде.

Ну теперь когда мы сделали шаблон, попробуем его обработать:

У нас есть переменная $category - название категории;
У нас есть переменная $id_category - идентификатор категории;
У нас есть переменная $num_goods - количество товаров на странице;
У нас есть переменная $on_page - текущая страница;
У нас есть массив @goods - наши товары в виде - Наименование|цена|

Пишем код:

# Загружаем шаблон

$file = "list.html";
open (TMP, "$file");
@template = ;
close ($file);

# Разрезаем его на блоки:

foreach (@template) {
      if (m//) {
            $_ =~s ///g;                                                 #Избавляемся от ненужного комментария
            @line_pages = (@line_pages, $_);                                  #Собираем блок
            $_ = "";                                                                      #Обнуляем строку шаблона
      }
      if (m//) {
            $_ =~s ///g;                                                 #Избавляемся от ненужного комментария
            @on_page = (@on_page, $_);                                         #Собираем блок*
            $_ = "";                                                                      #Обнуляем строку шаблона
      }
      if (m//) {
            $_ =~s ///g;                                                 #Избавляемся от ненужного комментария
            @off_page = (@off_page, $_);                                        #Собираем блок*
            $_ = "";                                                                     #Обнуляем строку шаблона
      }
      if (m//) {
            $_ =~s ///g;                                                 #Избавляемся от ненужного комментария
            @line_goods = (@line_goods, $_);                                  #Собираем блок
            $_ = "";                                                                      #Обнуляем строку шаблона
      }
}

* Примечание: Почему мы забираем всего 1 строку в массив? да на всякий случай, вдруг завтра это выражение мы будем писать несколькими строчками в HTML коде.

# Собираем строку с номерами страниц

$number = @goods;
# Если количество товаров меньше или равно количеству товаров выводимых
# на странице, то обнуляем блок где выводится список номеров страниц
if ($number <= $number_page) {@line_pages = ();}
else {
      $number_page = $number/$num_goods;
      for ($i = 0; $i < $number_page; $i++) {
            $page = $i + 1;
# Проверяем текущую страницу, и в зависимости от этого присваиваем
# временному массиву соответствующий блок
            if ($page eq $on_page) {@temp_line = @on_page;}
            else {@temp_line = @off_page;}
# Обрабатываем текущий массив
           foreach (@temp_line) {
                $_ =~s /%id_category%/$id_category/gi;
                $_ =~s /%n_page%/$page/gi;
           }
# Прибавляем полученный массив к списку номеров старниц
           @temp_list = (@temp_list, @temp_line);
      }
# Обрабатываем блок с линией списка номеров страниц*
    foreach (@line_pages) {
          $_ =~s //@temp_list/gi;
     }
}

* Примечание: Подобную процедуру можно производить и в конце во время окончательной обработки шаблона.

# Собираем таблицу с товарами

$first_goods = ($page - 1)*$num_goods;
$last_goods = ($page)*$num_goods;
if ($last_goods > $number) {$last_goods = $number;}

for ($i = $first_goods; $i < $last_goods; $i++) {
     ($name, $price) = split(/|/,@goods[$i]);
# присваиваем временному массиву соответствующий блок
     @temp_line = @line_goods;
     $npp = $i + 1;
    foreach (@temp_line) {
          $_ =~s /%npp%/$npp/gi;
          $_ =~s /%name_goods%/$name/gi;
          $_ =~s /%price_goods%/$price/gi;
     }
# Прибавляем полученный массив к таблице товаров
      @list_goods = (@list_goods, @temp_line);
}

# Окончательная обработка шаблона

foreach (@template) {
     $_ =~s //@list_goods/gi;
     $_ =~s //@line_pages/gi;
     # $_ =~s //@temp_list/gi;*
}

* Примечание: Если мы подобную процедуру не произвели ранее

# Выводим результат на экран

print "Content-type: text/html; charset=windows-1251 ";
print "@template";
exit;

Заключение

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

Так же подобное решение использовано на сайте Пятиком.ру и других смежных проектах в динамичных разделах и административном интерфейсе, и пока не вызывало нареканий со стороны web-мастеров.

Автор: Phoinix (Томулевич Сергей)
Источник: www.asit.ru



 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


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

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.