模板的作用:表现与实现相分离.
项目中考虑 Smarty或其它模板引擎,过于庞大,功能较多,但项目中使用的较少.
另外,模板语法过于复杂,增加了开发人员的学习成本.
故,自行开发了一个小模板引擎,实现了编译及缓存功能.
代码如下:
/**
* 模板类
一.for循环
缺陷:如表达式中有>(大于号),将导致视图在DW中出现多余字符
二.foreach循环
$v)>
缺陷:'=>' 将导致视图在DW中出现多余字符
三.if判断
5)>
2)>
缺陷:如果表达式中有>(大于号),将导致视图在DW中出现多余字符
四.嵌套原生代码
五.子模板包含
注意:紧密连接
六.自我感知
注意:这个与PHP语法实在无法一致了,中间是空格分开的,此句等同于 方法(参数表) ?>
七.显示函数返回值
{date('Y-m-d H;i:s')}
注意:既然是函数调用,最后就应该是')'结束
八.显示变量的值
{$变量}
{$对象.属性}
{$数组[下标]}
九.赋值
全局注意:
'' 以及 '' 必须紧密连接
''以及'' 必须紧密连接
其它标签也是如此
*/
class STemplate{
/**
* 显示视图,如果需要,智能编译
*
* @param string $view 视图
* @param array $params 参数
*/
static public function display($view,$params){
extract($params);
include(self::getTpl($view));
}
/**
* 根据视图获取编译后的模板文件,会自动进行智能编译
*
* @param string $view 视图
* @return string 模板文件(带路径)
*/
static private function getTpl($view){
$source=SConfig::system('dir_view').$view.'.'.SConfig::system('suffix_view');
$target=SConfig::system('dir_template').$view.'.'.SConfig::system('suffix_template');
if(!file_exists($source)){
throw new Exception('View file not exist:'.$view);
}
//调试模式 或 缓存文件不存在 或 缓存文件过期 则:重新编译
if(!file_exists($target) or filemtime($source)>filemtime($target)){
$dirs=explode('/',$view);
$path=SConfig::system('dir_template');
for($i=0;$i $path.=$dirs[$i];
if(!is_dir($path)){
mkdir($path);
}
$path.=DIRECTORY_SEPARATOR;
}
$content=self::complie($view,file_get_contents($source));
file_put_contents($target,$content);
}
return $target;
}
/**
* 预编译模板
*
* @param string $view 模板名称
* @param string $source 原模板内容
* @return string 编译后结果
*/
static private function complie($view,$source){
//不允许出现PHP代码
if (strpos($source,'')!==false){
throw new Exception('Cant\'t user php code in template:'.$view);
}
//替换
$target=preg_replace(
array(
'//', //匹配 for 循环开始,与PHP语法一致
'//', //匹配 for 循环结束
'//', //匹配 foreach 循环开始,与PHP语法一致
'//', //匹配 foreach 循环结束
'//', //匹配 if 开始,与PHP语法一致
'//', //匹配 elseif,与PHP语法一致
'//', //匹配 else
'//', //匹配 if 结束
'//', //匹配 原生代码开始
'/<\/php>/', //匹配 原生代码结束
'//', //匹配 子模板包含,语法
'//', //匹配 自我感知,语法
'/{(.*\))}/', //匹配 显示函数返回值,与PHP语法一致
'/{\$([^}]*)}/', //匹配 显示变量的值,与PHP语法一致
'//', //匹配 赋值
),
array(
'', //替换 For 循环开始
'', //替换 For 循环结束
'', //替换 Foreach 循环开始
'', //替换 Foreach 循环结束
'', //替换 If 开始
'', //替换 Elseif
'', //替换 Else
'', //替换 If 结束
'', //替换 原生代码开始
'?>', //替换 原生代码结束
'', //替换 子模板包含
'$\1=\2::instance()->\3?>', //替换 自我感知
'=\1?>', //替换 显示函数返回值的开始
'=$\1?>', //替换 显示变量的值
'\1?>', //替换 赋值
),$source);
//如果不是调试模式,则去除首尾空格
if(!SDebug::isDebug()){
$target=preg_replace('/^\s*|\s*$/m','',$target);
}
return $target;
}
}
注:大家使用时,要将其中的部分代码进行修改. 将路径,后缀修改为自己项目中的实际路径与后缀,同时调试代码去除.
阅读(416) | 评论(0) | 转发(0) |