|
|
|
| собственно, сабж. Штука получилась занятная. Умеет включать другие шаблоны. Поддерживает циклы, в том числе и вложенные.
Вот с вложенными циклами у меня некоторое беспокойство: так как данные вставляются в шаблон, который снова передается обработчику, то по идее, вероятен случай, когда в данных встретятся теги, аналогичные тегам шаблона. Попытался смоделировать такую ситуацию - все работает нормально. Короче, похоже что я уже устал искать дырки в своем коде. Может у кого-нибудь получится, а то работает, зараза, как ни в чем не бывало:)
В аттаче пример работы.
Это код самого шаблонизатора
<?
//функция подцепляет из файла шаблон $tpl_name, после чего передает его функции parse_template
function tpl($tpl_name, $content)
{
$tpl=file_get_contents("$tpl_name.tpl");
$page=parse_template($tpl, $content);
return $page;
}
//функция разбирает на части шаблон переданный ей через переменную $tpl
function parse_template($tpl, $content)
{
//находим все инклуды в шаблоне
preg_match_all('/{include src="(.*?)"}/i', $tpl, $incs);
//находим все циклы в шаблоне
preg_match_all('/{foreach[\\s]*src="(.*?)"}([\\w\\W]*?){\/foreach[\\s]*"\\1"}/i', $tpl, $fors);
//если присутствуют включаемые шаблоны, то рекурсивно их вызываем
if (count($incs))
foreach($incs[1] as $val)
{
//вызов шаблона из мессива
$incs_data=tpl($val, $content);
//замена шаблона результато работы включаемого шаблона
$tpl=preg_replace('/{include src="'.$val.'"}/i', $incs_data, $tpl);
}
//вызов циклов встреченных в шаблоне
if (count($fors))
foreach ($fors[1] as $key=>$val)
{
//вызов функции в названии цикла с кодом шаблона в качестве параметра
$fors_data=$val($fors[2][$key]);
//замена цикла полученным результатом
$tpl=preg_replace('/{foreach[\\s]*src="'.$val.'"}([\\w\\W]*?){\/foreach[\\s]*"'.$val.'"}/i', $fors_data, $tpl);
}
//если в качестве $content передан массив, то заменяем в шаблоне теги на переменные этого массива.
if (is_array($content))
{
$tpl=replace_tpl($tpl, $content);
}
return $tpl;
}
//функция заменяет все спецтеги на их конечные значения
function replace_tpl($tpl, $content)
{
foreach ($content as $key=>$val)
{
$tpl=str_replace("{".$key."}", $val, $tpl);
}
return $tpl;
}
|
Да, и еще: из шаблоно можны вызывать функции, но не определился я как быть с их параметрами: так как все вызовы происходят из другой функции, то либо делать их глобальными, либо в шаблоне делать значения по умолчанию. Оба пути мне не нравятся. Может у кого-то есть идеи? | |
|
|
|
|
|
|
|
для: Loki
(10.05.2006 в 10:48)
| | Зачем заново изобретать велосипед? Или это все для собственного развития? В любом случае, отлично работающий пример можно посмотреть тут: http://smarty.php.net | |
|
|
|
|
|
|
|
для: mtxd
(10.05.2006 в 11:42)
| | А зачем писать форумы, гостевые, счетчики, каталоги и прочее? Все уже написано - только качай. | |
|
|
|
|
|
|
|
для: mtxd
(10.05.2006 в 11:42)
| | Люди пишут свои собственные гостевые, форумы и т.д. для того, чтобы не использовать те же публичные phpBB в которых дыр больше, чем в дуршлаге. | |
|
|
|
|
|
|
|
для: Loki
(10.05.2006 в 10:48)
| | А как работает? Можно примерчик? | |
|
|
|
|
|
|
|
для: cheops
(10.05.2006 в 14:14)
| | Пример находится в аттаче первого поста | |
|
|
|
|
|
|
|
для: Loki
(10.05.2006 в 14:16)
| | up | |
|
|
|