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

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> 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



 
Популярные книги

Photoshop CS2 для пользователя

Подробнее

Общая информатика. Универсальный курс

Подробнее

Ремонт и обслуживание компьютера дома

Подробнее


 
Новости ИТ
04.12.2008  В Windows 7 запуск приложений Direct3D 10/10.1 будет возможен на CPU
04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с зашитой данных
04.12.2008  A-DATA выпускает двух- и трёхканальные наборы памяти DDR3-1800+ в серии XPG Plus
04.12.2008  MOTOROKR EM35
04.12.2008  Шведский производитель ковриков для мышей выпустил игровую гарнитуру
04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с защитой данных
04.12.2008  Вышла вторая бета-версия Windows Vista SP2
04.12.2008  Внешний SSD-накопитель с поддержкой eSATA и USB
04.12.2008  Флэшка OCZ со встроенным кард-ридером
04.12.2008  Весрия «ПАУ» 1.8.2 будет содержать новый функционал
04.12.2008  Компания «Русские Информационные Технологии» подготовила бета-версию программы «Печать конвертов!»
04.12.2008  Телефон премиум-класса с двумя SIM-картами
04.12.2008  High-end десктопы Asus Eee Box
04.12.2008  Видеокарта NVIDIA Quadro FX 4800 для профессионалов
04.12.2008  Экстремальные внешние HDD от Iomega
04.12.2008  MSI EX300 - 13.3 дюйма для развлечения
04.12.2008  SATA 3.0 появится в следующем году
04.12.2008  Mini-ITX-плата Zotac на основе логики NVIDIA и с поддержкой Wi-Fi
04.12.2008  Корпус NZXT Zero 2: улучшенное охлаждение и строгий дизайн
04.12.2008  Конвертеры: Xilisoft Video Converter v.5.1.7.1128
 
Полезно

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