Использование шаблонов при программировании WEB-приложений
ЗАЧЕМ ВООБЩЕ ИСПОЛЬЗОВАТЬ ШАБЛОНЫ?
Может, кто-то скажет, а зачем выносить HTML код в отдельный файл если его можно спокойно писать в скрипте? Да конечно в скрипте можно писать HTML код, но просмотреть полностью «собранную», или частично «собранную» страницу которую выводит скрипт, возможно только при его нормальной работе, а во время отладки скрипта, как правило, возникают некоторые трудности. Потом при смене дизайна, опять же, править HTML код в скрипте сущая каторга, сколько раз я слышал о нареканиях со стороны Web-мастеров, что понять какие куски кода и в какой последовательности выносятся невозможно, так как, по большей части, они не программисты и вникать в код скрипта не намерены. И так далее и тому подобное, поэтому, все-таки будем разделять скрипты от HTML кода…
КАКАЯ ДОЛЖНА БЫТЬ СТРУКТУРА ШАБЛОНОВ
Сначала, вынося HTML код из скриптов, я каждый кусок записывал в отдельный файл. Да когда нет особых сложностей в сборке страницы (шапка, основа, подвал), то трудностей нет, но когда страница имеет сложные внедрения, такие как списки, причем одновременно разных видов (например список страниц и список товаров текущей страницы), количество файлов начинало возрастать с неимоверной быстротой (у меня дошло до того, что страница стала собираться из 28 файлов!!!), и опять возникли трудности, неимоверное количество кусков кода, настолько усложнило их обработку и редактирование, что я пришел опять к изначальной точке… Потом пришла идея – использовать в качестве шаблона, всего 1 файл, который легко редактировать и который легко предварительно просмотреть визуально. То есть использовать в качестве шаблона уже практически готовую страницу, а разбивать её на куски будет сам скрипт.
ПРИМЕР ВЫВОДА СТРАНИЦЫ СПИСКА ТОВАРОВ С ИСПОЛЬЗОВАНИЕМ ОДНОГО ШАБЛОНА
Страницы, причем вся строка, так как в зависимости от того, сколько у нас будет товаров, у нас будет либо постраничный вывод, либо все товары уместятся на одной странице. Отдельно из этой строки нам понадобится текущая страница, и ссылка на другую страницу;
Что получается? Перед каждой строкой определенного блока кода мы вставили небольшой комментарий в виде <!-- цифра -->, и в тех местах, где мы должны вставить код мы добавили по дополнительному комментарию (<!--pages -->, <!-- list_pages -->, <!-- list_goods -->). Причем комментарий <!--pages --> у нас получился в середине куска кода который мы отметили как <!-- 1 -->! Почему мы использовали именно комментарии? Да потому, что при просмотре этого шаблона мы увидим все как положено, без лишних вещей:
Список товаров категории %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 = <TMP>; close ($file);
* Примечание: Почему мы забираем всего 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 /<!-- pages -->/@temp_list/gi; } }
* Примечание: Подобную процедуру можно производить и в конце во время окончательной обработки шаблона.
Конечно использование данного метода может немного замедлить работу скрипта, так как проводится довольно много циклов, но убрав HTML-код из скрипта мы, тем самым, уменьшили его размер, а собрав шаблон в один файл, мы упростили дальнейшую работу с ним.