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
Форумы портала PHP.SU :: Версия для печати :: Простейший компилирующий шаблонизатор
Форумы портала PHP.SU » PHP » Пользовательские функции » Простейший компилирующий шаблонизатор

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

1. Haron - 29 Октября, 2012 - 03:39:19 - перейти к сообщению
Данный класс представляет собой - простейший компилирующий шаблонизатор, который компилирует шаблон 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.  


Проще - некуда.
2. DeepVarvar - 29 Октября, 2012 - 03:45:09 - перейти к сообщению
Вместо проверки на isset при компиляции, я бы сделал $this->tpl_vars объектом с магией __get и __set, дабы на лету все свои свойства создавал и не генерило бы нотайсы.
3. Haron - 29 Октября, 2012 - 03:48:24 - перейти к сообщению
Согласен, но тут цель - максимально упрощённо и понятно Улыбка.

 

Powered by ExBB FM 1.0 RC1