自定义min版smarty模板引擎MinSmarty.class.php文件及用法

这里给出一个简易的自定义min版smarty模板引擎MinSmarty.class.php的实现代码示例:

<?php
class MinSmarty{
  private $template_dir = './templates/';
  private $compile_dir = './templates_c/';
   
  public function __construct(){
    if(!is_dir($this->compile_dir)) {
      mkdir($this->compile_dir);
    }
  }
   
  public function assign($key, $value){
    $this->$key = $value;
  }
   
  public function display($template){
    ob_start();
    $template_path = $this->template_dir.$template.'.tpl';
   
    if(!file_exists($template_path)){
      die("Template {$template} does not exist.");
    }
   
    $template_compile = $this->compile_dir.basename($template_path).'.php';
   
    if(!file_exists($template_compile) || (filemtime($template_path) > filemtime($template_compile))){
      $this->compileTemplate($template_path, $template_compile);
    }
   
    extract($this); // Import variables into local symbol table
    require $template_compile; // Render the view
   
    $content = ob_get_clean();
   
    echo $content;
  }
   
  private function compileTemplate($template_path, $template_compile){
    $template = file_get_contents($template_path);
   
    $openTag  = preg_quote('{');
    $closeTag = preg_quote('}');
   
    $template = preg_replace("/{$openTag}(.+?){$closeTag}/e", "\$this->displayTemplate('\\1')", $template);
   
    $template = "<?php extract(\$this); ?>".$template;
   
    file_put_contents($template_compile, $template);  
  }
   
  private function displayTemplate($templateName){
    ob_start();
   
    require $this->template_dir.$templateName.'.tpl';
   
    $content = ob_get_clean();
   
    return $content; 
  }
}

使用示例:

$smarty = new MinSmarty();

$smarty->assign('name', 'John');

$smarty->display('index'); 

主要通过正则匹配实现了自定义标签解析,编译模板文件,再引入变量渲染的基本逻辑。可以根据需要继续优化增强。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论