Эта статья предназначена для тех кто не относится скептически к написанию того что уже написано, в общем она для энтузиастов, каким я сам и являюсь.
Начнем с того, что определим что будет уметь наш шаблонизатор:
выделение из шаблона на блоков
обработка блоков
подстановка переменных
Блоки.
Блоки могут быть "циклические" и "не циклические". К первым отнесем блоки приразборе которых шаблонизатор выполнит цикл с определенными параметрами и вставит "внутренности" блока в результирующую страницу несколько раз. Они нам понадобятся массовой для публикации данных (например список заголовков новостей). Ко вторым отнесем условные конструкции (зачастую без них не обойтись).
create table news
(
id int(10) unsigned NOT NULL auto_increment,
title varchar(128),
body text,
ndate date,
primary key (id)
);
нужно создать шаблон для вывода этих новостей и php скрипт обрабатывающий этот шаблон.
Договоримся - теги блоков и переменных будем заключать в HTML комментарии:
содержимое блока
теперь функция выделения блока или переменной:
function ParseTmpl($Block)
{
global $Blocks;
global $Vars;
// Ищем блоки
$Pos=0;
while (($Pos=strpos($Block,'';
if ($EndIndex=strpos($Block,$BlockEnd,$Pos))
{
$EndIndex+=strlen($BlockEnd);
for ($i=0; $i
{
$Begin=$Vars[$i];
while ($Pos=strpos($Block,'',$BeginIndex))
{
$Sub=substr($Block,$BeginIndex,$EndIndex-$BeginIndex+3);
$Block=substr($Block,0,$BeginIndex).
Variable($Sub,$i).substr($Block,$EndIndex+3);
}
}
}
return $Block;
}
В качестве аргумента ей передается шаблон или его фрагмент (почему фрагмент? Потому что в нутри блока может быть еще один блок, то есть "внутренность" блока необходимо обработать отдельно). Далее она ищет вхождения строки ',$Offset);
if (($Offset+4)!=$EndInd)
{
$S=substr($Block,$Offset+4,$EndInd-($Offset+4));
$Bl=explode(' ',$S);
$BlockName=$Bl[0];
for ($i=0; $i
{
if ($Blocks[$i][0]==$BlockName)
{
return $i;
}
}
}
return -1;
}
Рассмотри работу функции Block($Block, $BlockId):
function Block($Block, $BlockId)
{
global $Blocks;
$Ret='';
// Получаем параметры
$BeginStr=$Blocks[$BlockId][0];
$BeginLength=4+strlen($BeginStr);
$EndOperatorPos=strpos($Block,'-->');
$Operator=substr($Block,$BeginLength,$EndOperatorPos-$BeginLength);
$Args=explode(' ',trim($Operator));
$EndBlockPos=strpos($Block,'');
$SubBlock=substr($Block,$EndOperatorPos+3,$EndBlockPos-$EndOperatorPos-3);
if ($Blocks[$BlockId][2]) // блок не цикличный
{
if ($BeginStr($Args))
{
$Ret.=ParseTmpl($SubBlock);
}
}
else
{
while ($BeginStr($Args))
{
$Ret.=ParseTmpl($SubBlock);
}
}
return $Ret;
}
Ей передаются фрагмент шаблона, содержащий рассматриваемый блок, и индекс блока в массиве $Blocks. Для начала в ней мы разбираем строку открывающего тега, на предмет параметров (это на всякий случай, а вдруг Вам необходимо вывести не все новости а какое-то количество). То есть если блок новостей начинается со строки:
Где 5 - количество выводимых новостей.
Мы должны иметь возможность выделить именно определенное количество новостей. Далее выделяется "внутренность" блока в переменню $SubBlock, для дальнейшего парсирования. Далее в зависимости от результатов проверки на цикличность блока вызываем уже знакомую нам функцию ParseTmpl, либо при выполнении условия, либо в цикле до не выполнения условия. Условием является не нулевой результат выполнения функции одноименной с блоком.
Для каждого циклического блока необходимо создать функцию которая бы возвращала 0 или не 0 в зависимости от того нужно ли повторять разбор блока. Это может быть функция которая будет при каждом вызове выбирать очередную порцию данных из таблицы новостей и возвращать 1 если например количество выбранных новостей не больше количества вереданного ей в качестве одного из элементов массива аргументов блока.
Переменные.
Переменные будем хранить в массиве
$Vars=array('имя переменной');
Так же как и в случае с блоками создадим одноименные функции которые бы возвращали значения этих переменных (брали их, например, из базы данных). Вот участок функции ParseTmpl выделяющий переменные из шаблона и подставляющий их значения:
for ($i=0; $i
{
$Begin=$Vars[$i];
while ($Pos=strpos($Block,'',$BeginIndex))
{
$Sub=substr($Block,$BeginIndex,$EndIndex-$BeginIndex+3);
$Block=substr($Block,0,$BeginIndex).
Variable($Sub,$i).substr($Block,$EndIndex+3);
}
}
}
И функция Variable:
function Variable($Block, $VarId)
{
global $Vars;
$Ret='';
// Получаем параметры
$BeginStr=$Vars[$VarId];
$BeginLength=4+strlen($BeginStr);
$EndOperatorPos=strpos($Block,'-->');
$Operator=substr($Block,$BeginLength,$EndOperatorPos-$BeginLength);
$Args=explode(' ',trim($Operator));
return $BeginStr($Args);
}
Она похожа на функцию Block, но значительно проще.
Пример шаблона и функции блоков и переменных.
Шаблон вывода наших новостей:
[]
А вот код для работы с блоками и переменными:
$QueryResult_News=0;
$QueryRow_News=0;
function news($Args) // Блок news
{
global $QueryResult_News;
global $QueryRow_News;
$Active=$Args[0];
if ($QueryResult_News==0)
{
$QueryResult_News=mysql_query("select *
from news
by ndate desc limit $Active");
}
Ну вот и все простой шаблонизатор готов, все что я хотел сделал, Вам же теперь его модернизировать и усовершенствовать до тех пор пока он не станет удовлетворять всем Вашим ожиданиям :)
Удачи, искренне Ваш elrevin.
Опубликовал Kest
November 06 2008 16:46:14 ·
0 Комментариев ·
9375 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.