Давыдов Денис
Многие
программеры сталкивались с проблемой, когда дизайнеру "нужна свобода" в
написании 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"> </td> <td class="th"
style="background-color:#000000; color:white"> <!-- TOTAL
--> </td> </tr> </table></div>
</body> </html>
|
rows.htm
<tr> <td align="right"
class="th" style="background-color:<!-- COLOR -->;
color:black"> <!--
PWD --> </td> <td class="th"
style="background-color:<!--
COLOR -->; color:black"> <!-- FILESIZE
--> </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()
//
Вывести на экран function printit()
Если возникнут какие-либо
комментарии, пишите на null@magelan.ru. Также выслушаю
замечания и поправки. Огромное спасибо Fil (fil@apb.farlep.net) за некоторые
дополнения и замечания :) И всем тем, кто откликнулся!
Денис Давыдов.
|