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

Многие программеры сталкивались с проблемой, когда дизайнеру «нужна свобода» в написании 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();

?>

Данный класс работает очень шустро, обработчик построен на основе регулярных выражений.

Детальное описание

В классе определенны массивы:
$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() 

// Вывести на экран 
function printit()

Если возникнут какие-либо комментарии, пишите на null@magelan.ru. Также выслушаю замечания и поправки.
Огромное спасибо Fil (fil@apb.farlep.net) за некоторые дополнения и замечания 🙂 И всем тем, кто откликнулся!