Использование шаблонов в PHP4

Автор: Денис Давыдов Сайт: http://www.pauk2001.h1.ru/
   
   Многие программеры сталкивались с проблемой, когда дизайнеру "нужна свобода" в написании html, а программеру "чистота" кода :) У меня такое приключилось при написании виртуального веб-магазина. В общем, недолго думая я стал искать различные PHP-классы для создания "динамических сайтов" с использованием так называемых шаблонов. И нашел один, который отвечал всем моим требованиям, но слишком уж он оказался "большим и тяжелым". Называется этот класс FastTemplate (уж не помню, где я его скачал). Недолго думая, я решил написать свой класс, взяв за основу функциональность FastTemplate. Мои результаты в написании своего класса получились практически такими как у FastTemplate, но, как мне кажется, ни чуть не хуже (прим.: код я не копировал, а создавал сам с нуля).
   
   Итак, для начала работы Вам необходимо скачать мой класс template.
   Скачали? Теперь можно пробовать на простом примере. Сделаем пример листинга файлов текущего каталога с подсчетом кол-ва байт каждого файла, при этом динамически создав таблицу. Итак, создайте следующие файлы:
   
   main.htm
   
   
   <html>
   <head>
   <title><!-- ABOUT --></title>
   <link rel="stylesheet" type="text/css" href="/styles.css">
   </head>
   <body>
   
   <p align="center" class="b"><!--
   
   ABOUT
   
   --><br>
   Localtime is <!-- LOCALTIME -->
   </p><br>
   
   <div align="center"><table STYLE="border-collapse:collapse" class="th">
   <tr>
   <td colspan="2" class="th" align="center" style="background-color:#000000; color:white">File listing</td>
   </tr>
   <!--
   TABLE_CONTENT
   -->
   <tr>
   <td class="th" align="right" style="background-color:#000000; color:white">&nbsp;</td>
   <td class="th" style="background-color:#000000; color:white">&nbsp;<!-- TOTAL -->&nbsp;</td>
   </tr>
   </table></div>
   
   </body>
   </html>
   
   
   
   
   rows.htm
   
   
   <tr>
   <td align="right" class="th" style="background-color:<!-- COLOR -->; color:black">&nbsp;<!-- PWD -->&nbsp;</td>
   <td class="th" style="background-color:<!-- COLOR -->; color:black">&nbsp;<!-- FILESIZE -->&nbsp;</td>
   </tr>
   
   
   
   
   index.php
   
   
   <?php
   
   require ('templates.php'); // Включаем класс для работы с шаблонами
   
   // Определяем теги
   $meta = array( "ABOUT" => ":: template class example ::",
   "LOCALTIME" => date("M-d-Y H:i:s"));
   
   $t = new template;
   
   // Инициализируем файлы и дескрипторы
   $t->init(array( index => "main.htm", rows => "rows.htm"));
   
   // Устанавливаем ограничители (delimiter-ы)
   $t->delimiters("<!--", "-->");
   
   // Определяем теги
   $t->assign($meta);
   
   $d = dir(".");
   
   $colors = array("#d4d4d4", "#a0a0a0"); $i = 0;
   $totalbytes = 0;
   while ($entry = $d->read()) {
   if (preg_match("/^(.|..)$/", $entry)) continue;
   $color = $colors[$i];
   $t->assign("FILENAME", $entry); // Определяем под тегом FILNAME имя файла
   $t->assign("COLOR", $color); // под COLOR текущий цвет
   $t->assign("PWD", realpath ($entry)); // Полный путь
   if (($size = filesize($entry)) > 1024) {
   $totalbytes += $size;
   $size = sprintf("%0.2f Kbytes", ($size / 1024));
   } else {
   $totalbytes += $size;
   $size .= " bytes";
   }
   $t->assign("FILESIZE", $size); // связываем с тегом FILESIZE длинну файла
   
   // Обрабатываем файл с дескриптором rows, при этом полученные результаты
   // закрепляем под тегом TABLE_CONTENT (путем добавления)
   $t->parseit(rows, "TABLE_CONTENT");
   $i = (++$i >= count($colors)) ? 0 : $i;
   
   // Под этим тегом у нас будет общее кол-во байт найденых файлов
   $t->assign("TOTAL", ( ($totalbytes > 1024) ? sprintf("%0.2f Kbytes", ($totalbytes / 1024)) : $totalbytes." bytes"));
   }
   
   $d->close();
   
   // Обрабатываем страницу с дескриптором index. Т.е. при обработке
   // все попадающиеся теги будут заменены на определенное значение.
   $t->parseit(index);
   
   // Выводим все
   $t->printit();
   $t->freshall();
   
   ?>
   
   
   
   Результаты выполнения можно увидеть здесь http://null.magelan.ru/php/templates Данный класс работает очень шустро, обработчик построен на основе регулярных выражений.
   
   
   Детальное описание
   
   В классе определенны массивы:
   $filelist - ассоциативный массив дексрипторов и файлов
   $assign - ассоциативный массив определенных тегов
   $root - корневой каталог
   $arr - массив с результатом
   $delmiters - ограничители
   
   
   // init - Инициализация шаблонов
   // arr - ассоциативный массив (см.пример) с дескрипторами и файлами
   // root - корневой каталог, где лежат файлы (по-умолчанию текущий)
   // delimit - тут можно указать ограничитель из двух символов, например "{}"
   function init($arr = "", $root = "", $delimit = "")
   
   // Установка корневого каталога шаблонов
   function setroot($root = "")
   
   // Добавление дескрипторов и файлов для работы с шаблонами
   // list - ассоциативный массив
   function listit($list = "")
   
   // Обработка шаблона
   // $d - дескриптор файла ИЛИ МАССИВ!
   // $temp - обработка в тег $temp (если не указать, данная ф-ия обработает
   // декср.файла и добавит его к массиву с результатами)
   function parseit($d = "", $temp = "")
   
   // Получить обработанный массив, возвращает string
   // $array - массив
   function getparsed($array)
   
   // Указать ограничители
   // $d1 - левый, $d2 - правый
   // Например $t->delimiters("<!--", "-->");
   function delimiters($d1 = "", $d2 = "")
   
   // Как listit, только добавить можно не ассоциативный массив, а
   // простую строку
   // $d - дескриптор файла
   // $name - имя файла
   function addtolist ($d = "", $name = "")
   
   // Используется для очистки всех массивов в классе
   function freshall()
   
   // Используется для очистки результатов обработки
   // Очищается $arr
   function fresh()
   
   // Вывести на экран.
   // В v1.02 - если указан $tag, выводит тег $this->assign["$tag"]
   function printit([$tag])
   
   
   

Опубликовано: HTTP://WWW.R-T-F-M.INFO, pauk ©® 2000-2011.
All rights reserved.
При перепечатки ссылка на сайт обязательна.
Мнение администрации сайта не всегда совпадает с мнением автора..