Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Простейший компилирующий шаблонизатор

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Реализация простейшего компилирующего шаблонизатора, для общего понимания
Haron
Отправлено: 29 Октября, 2012 - 03:39:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Данный класс представляет собой - простейший компилирующий шаблонизатор, который компилирует шаблон 1 раз, в дальнейшем отображая его из скомпилированной в php-код версии, без необходимости дальнейшей компиляции. Дабы не усложнять - в нём намеренно имеется ТОЛЬКО реализация назначения переменных шаблона, компиляция, отображение и больше ничего.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class tpl
  4. {
  5.         public $tpl_vars = array();
  6.        
  7.         /*
  8.          * Назначает переменные шаблона
  9.          * @param string $name имя переменной
  10.          * @param string $value значение переменной
  11.          * @return bool true
  12.          */
  13.         public function assign($name, $value)
  14.         {
  15.                 $this -> tpl_vars[$name] = $value;
  16.                 return true;
  17.         }
  18.        
  19.         /*
  20.          * Компилирует файл шаблона и записывает
  21.          * результат компиляции в файл.
  22.          * @param string $template имя файла шаблона
  23.          * @return bool
  24.          */
  25.         private function compile($template)
  26.         {
  27.                 $template = file_get_contents($template);
  28.                 foreach ($this -> tpl_vars as $name => $value)
  29.                 {
  30.                         if (strpos($template, '{$' . $name . '}'))
  31.                         {
  32.                                 $template = str_replace('{$' . $name . '}', '<?PHP if (isset($this -> tpl_vars["' . $name . '"])) echo("' . $value . '"); ?>', $template);
  33.                         }
  34.                 }
  35.                 return file_put_contents('template.cache', $template);
  36.         }
  37.        
  38.         /*
  39.          * Отображает скомпилированный шаблон. Если скомпилированный
  40.          * шаблон не найден - производит компиляцию.
  41.          * @param string $template имя файла шаблона
  42.          */
  43.         public function display($template)
  44.         {
  45.                 if (file_exists($template . '.cache'))
  46.                 {
  47.                         include($template . '.cache');
  48.                         exit();
  49.                 }
  50.                 else
  51.                 {
  52.                         if ($this -> compile($template . '.html'))
  53.                         {
  54.                                $this -> display($template);
  55.                         }
  56.                         else
  57.                         {
  58.                                 echo 'Произошла ошибка!';
  59.                          }
  60.                 }
  61.         }
  62. }
  63.  
  64. $tpl = new tpl();
  65.  
  66. $tpl -> assign('title', 'Тестируем шаблонизатор');
  67. $tpl -> assign('link', 'http://php.su');
  68. $tpl -> assign('name', 'Учи похап!!!11');
  69.  
  70. $tpl -> display('template');


Содержимое шаблона "template.html"
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <title>{$title}</title>
  3. <a href="{$link}" />{$name}</a>
  4.  


Проще - некуда.

(Отредактировано автором: 29 Октября, 2012 - 03:44:45)



-----
И чё?
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Октября, 2012 - 03:45:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вместо проверки на isset при компиляции, я бы сделал $this->tpl_vars объектом с магией __get и __set, дабы на лету все свои свойства создавал и не генерило бы нотайсы.
 
 Top
Haron
Отправлено: 29 Октября, 2012 - 03:48:24
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Согласен, но тут цель - максимально упрощённо и понятно Улыбка.


-----
И чё?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB