Многие программеры сталкивались с проблемой, когда дизайнеру "нужна свобода"
в написании html, а программеру "чистота" кода :) У меня такое приключилось при
написании виртуального веб-магазина. В общем, недолго думая я стал искать
различные PHP-классы для создания "динамических сайтов" с использованием так
называемых шаблонов. И нашел один, который отвечал всем моим требованиям, но
слишком уж он оказался "большим и тяжелым". Называется этот класс FastTemplate
(уж не помню, где я его скачал). Недолго думая, я решил написать свой класс,
взяв за основу функциональность FastTemplate. Мои результаты в написании своего
класса получились практически такими как у FastTemplate, но, как мне кажется, ни
чуть не хуже (прим.: код я не копировал, а создавал сам с нуля).
Итак,
для начала работы Вам необходимо скачать мой класс template.
Скачали? Теперь можно пробовать на простом примере. Сделаем пример листинга
файлов текущего каталога с подсчетом кол-ва байт каждого файла, при этом
динамически создав таблицу. Итак, создайте следующие файлы:
$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])
Если возникнут какие-либо
комментарии, пишите на null@magelan.ru. Также выслушаю
замечания и поправки. Огромное спасибо Fil (fil@apb.farlep.net) за некоторые
дополнения и замечания :) И всем тем, кто
откликнулся!