自己实现简单的模板引擎:方面php的逻辑与页面进行分离
模板类:
调用的页面:
include "mytpl.class.php";
$tpl = new MyTpl("./templates/","./templates_c");
//程序简单方式
$title="这是一个文字标题,从数据库中获取";
$content = "这是内容";
$tpl->assign("title",$title);
$tpl->assign("content",$content);
$tpl->display("mysmarty.html");
?>
转换页面:
header("ContentType=text/html;charset=UTF-8");
class MyTpl{
private $template_dir;
private $compile_dir;
private $tpl_vars=array();
/**
* 模板路径和编译后的路径
* @param 模板路径 $template_dir
* @param 编译路径 $compile_dir
*/
function __construct($template_dir="./templates",$compile_dir="./templates_c"){
//添加最后的/
$this->template_dir = rtrim($template_dir,"/").'/';
$this->compile_dir = rtrim($compile_dir,"/").'/';;
}
/**
* 将变量输入到数组中
* @param unknown_type $tpl_var
* @param unknown_type $value
*/
public function assign($tpl_var,$value=NULL){
if($tpl_var!=""){
$this->tpl_vars[$tpl_var]=$value;
}
}
/**
* 显示最后生成的文件
* @param 模板文件 $fileName
*/
public function display($fileName){
//模板文件
$tplfile = $this->template_dir.$fileName;
if (!file_exists($tplfile)) {
return false;
}
//编译的文件名
$confileName = $this->compile_dir."com_".$fileName.".php";
if (!file_exists($confileName) || filemtime($confileName)
$repContent = $this->tpl_replace(file_get_contents($tplfile));
file_put_contents($confileName, $repContent);
}
//显示输出
include $confileName;
}
/**
* 替换模板后返回
* Enter description here ...
* @param unknown_type $content
*/
private function tpl_replace($content){
//匹配正则表达式
$pattern = array('/\/i');
$replacement = array('<?php echo $this->tpl_vars["${1}"]; ?>');
$repContent = preg_replace($pattern, $replacement, $content);
return $repContent;
}
}
?>