Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Написал я тут шаблонизатор
 
 автор: Loki   (10.05.2006 в 10:48)   письмо автору
 
 

собственно, сабж. Штука получилась занятная. Умеет включать другие шаблоны. Поддерживает циклы, в том числе и вложенные.
Вот с вложенными циклами у меня некоторое беспокойство: так как данные вставляются в шаблон, который снова передается обработчику, то по идее, вероятен случай, когда в данных встретятся теги, аналогичные тегам шаблона. Попытался смоделировать такую ситуацию - все работает нормально. Короче, похоже что я уже устал искать дырки в своем коде. Может у кого-нибудь получится, а то работает, зараза, как ни в чем не бывало:)

В аттаче пример работы.

Это код самого шаблонизатора
<?
//функция подцепляет из файла шаблон $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;
}


Да, и еще: из шаблоно можны вызывать функции, но не определился я как быть с их параметрами: так как все вызовы происходят из другой функции, то либо делать их глобальными, либо в шаблоне делать значения по умолчанию. Оба пути мне не нравятся. Может у кого-то есть идеи?

   
 
 автор: mtxd   (10.05.2006 в 11:42)   письмо автору
 
   для: Loki   (10.05.2006 в 10:48)
 

Зачем заново изобретать велосипед? Или это все для собственного развития? В любом случае, отлично работающий пример можно посмотреть тут: http://smarty.php.net

   
 
 автор: Loki   (10.05.2006 в 12:24)   письмо автору
 
   для: mtxd   (10.05.2006 в 11:42)
 

А зачем писать форумы, гостевые, счетчики, каталоги и прочее? Все уже написано - только качай.

   
 
 автор: ZC   (10.05.2006 в 13:08)   письмо автору
 
   для: mtxd   (10.05.2006 в 11:42)
 

Люди пишут свои собственные гостевые, форумы и т.д. для того, чтобы не использовать те же публичные phpBB в которых дыр больше, чем в дуршлаге.

   
 
 автор: cheops   (10.05.2006 в 14:14)   письмо автору
 
   для: Loki   (10.05.2006 в 10:48)
 

А как работает? Можно примерчик?

   
 
 автор: Loki   (10.05.2006 в 14:16)   письмо автору
 
   для: cheops   (10.05.2006 в 14:14)
 

Пример находится в аттаче первого поста

   
 
 автор: Loki   (12.05.2006 в 13:38)   письмо автору
 
   для: Loki   (10.05.2006 в 14:16)
 

up

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования