2010-06-30 3 views
0

Как я могу улучшить приведенный ниже сценарий, чтобы иметь возможность добавлять глобальные детали шаблона, такие как начало и конец страницы?PHP Template Engine

<?php 
    class simpleTemplate { 
     var $variables; 
     var $variables_callback; 
     var $contents; 
     var $preg; 
     var $regexps; 
     // Constructor, initialize default variables 
     function simpleTemplate(){ 
      // default sub regexp matches 
      $this->preg['var'] = '[a-zA-Z.\-_]{1,50}'; 

      //INSERT REGEXP 

      $this->php_start = "\necho '"; 
      $this->php_end = "';\n"; 
      // Main find-replace regexps 
      $this->regexps = array(
       // echo-variable statement: {(var)} 
       'echo' => array(
        'search' => '~\{((?:'.$this->preg['var'].')(?:\.)?)\}~sU', 
        'replace' => "'.\$this->_get('\\1').'" 
       ) 
     'include' => array(
      'search' => '', // UPDATE 
        'replace' => "" // UPDATE 
     ) 
      ); 
     } 
     // Load a file and convert it into native PHP code 
     function load($file){ 
      if (!is_readable($file)) 
       return FALSE; 
      $this->file = $file; 
      $this->contents = NULL; 
      if (!isset($this->contents)){ 
       $this->contents = file_get_contents($this->file); 
       $this->parse(); 
      } 
     } 
     // Load a converted template, apply variables and echo the output 
     function show(){ 
      ob_start(); 
      eval($this->contents); 
      ob_end_flush(); 
     } 
     // Main converter, call sub-convertors and perform some cleaning 
     function parse(){ 
      $this->contents = str_replace("'", "\'", $this->contents); 
      $this->contents = $this->php_start.$this->contents.$this->php_end; 
      foreach ($this->regexps as $regexp) 
       do { 
        if (isset($contents)) 
         $this->contents = $contents; 
        $contents = preg_replace($regexp['search'], $regexp['replace'], $this->contents); 
       } while ($contents != $this->contents); 
      $this->clean(); 
     } 
     // Clean trash in generated PHP code 
     function clean(){ 
      $this->contents = preg_replace("~([^\\\])''\.~", '\1', $this->contents); 
      $this->contents = str_replace(".''", "", $this->contents); 
      $this->contents = str_replace("\necho '';\n", "", $this->contents); 
      $this->contents = str_replace("else {}", "", $this->contents); 
      // Remove all whitespace from the template output 
      //$this->contents = preg_replace("~(\s{2,}|\n)~", '', $this->contents); 
      return; 
     } 
     // Get a variable from internal, or an external source 
     function _get($variableName){ 
      $variable = @eval('return $this->variables[\''.str_replace('.', "']['", $variableName).'\'];'); 
      if (!isset($variable)) { 
       if (isset($this->variables[$variableName])) 
        $variable = $this->variables[$variableName]; 
       else { 
        // Support for an external variable-source 
        $function_name = $this->variables_function; 
        if (isset($variables_callback)) 
         $variable = call_user_func($variables_callback, $variableName); 
       } 
      } 
      if (!isset($variable)) 
       return FALSE; 
      else 
       return $variable; 
     } 
     // Set an internal variable 
     function _set($variableName, $value){ 
      $this->variables[$variableName] = $value; 
      return TRUE; 
     } 
    } 
    ?> 

Sample .php страница выглядит, что

<?php 
require_once('tpl.php');  
$tpl = new simpleTemplate(); 
$data['user'] = array(
     'name' => 'Denis', 
     'surname' => 'Bobrovnikov' 
); 
$tpl->variables = $data; 
$tpl->load('index.tpl'); 
$tpl->show(); 
?> 

И шаблон следующий

My name is {user.name} {user.surname} 

Я хочу быть в состоянии сделать это в файле шаблона

{include=header.tpl} 
My name is {user.name} {user.surname} 
{include=footer.tpl} 

, где заголовок и нижний колонтитул также разобран

+1

http://www.smarty.net/ делает именно то, что вы пытаетесь сделать. Дайте ему шанс ... – DrColossos

ответ

1

1) вместо этого используйте шаблон MVC.
2) PHP - это шаблонный движок. Почему просто не использовать его?

+2

PHP - это отвратительный шаблонный движок. Шаблонные двигатели в MVC - это способ реализации V и связи от M и C до V. –

+0

Модели не должны связываться с Views в MVC. И что не позволяет PHP-контроллеру общаться с шаблоном PHP? – codez

+0

Да, но части моделей могут быть напрямую поданы для просмотра контроллером. Я не говорю, что чистый PHP не может делать ничего, что могут использовать шаблоны. Я говорю, что для чистого PHP требуется некоторый очень отвратительный синтаксис для реализации некоторых шаблонов функций. Также я говорю, что MVC не исключает использование шаблонов, потому что шаблоны - это всего лишь одна возможная реализация V из MVC. –

2

Используйте существующий механизм шаблонов, если вы хотите что-то поверх PHP, не изобретайте велосипед.
Дают прут идти http://www.twig-project.org/

-1

Это мой долг как программист гудок my own horn в надежде, что я мог бы быть полезным.

+0

Ваш проект не похож на механизм шаблонов для PHP. –

+0

@Kamil: Мой проект - это язык шаблонов, который можно легко и эффективно использовать в сочетании с PHP, так в чем же разница? –

+0

Нельзя использовать во многих общедоступных сервисах хостинга. –

Смежные вопросы