mPHP核心框架——视图层的代码实现
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/98/ ]
视图层的作用是,把复杂的PHP代码跟html代码尽可能的分离开,让前端开发人员跟后端开发人员协同工作,最后在通过模版机制,把最终的静态html效果显示出来.
视图层的作用是,把复杂的PHP代码跟html代码尽可能的分离开,让前端开发人员跟后端开发人员协同工作,最后通过视图的模版机制,把变量跟模版代码编译到一起,最后静态html效果就能显示出来。
/*
作者:moyancheng
创建时间:2012-03-01
最后更新时间:2014-01-11
*/
class view {
//加载xxx.tpl.html模版文件
//$tpl:模版文件
//$file:根据模版生成的静态文件
public function loadTpl($tpl,$file = '') {
$arrData = $this->_include($tpl,$file);
$date = date('Y-m-d H:i');
$arrData['html'] .= "<!-- mPHP html cache $date -->";
if( ($strDir = dirname($arrData['file']) ) && !is_dir($strDir) ) mkdir($strDir,0775,true);
file_put_contents($arrData['file'],$arrData['html']);
}
//编译模版
public function tplCompile($str) {
global $CFG;
//处理include标签
$str = preg_replace( "/<!--#\s*layout\s*:\s*([^ ]+);*\s*#-->/", '<?php $this->_include(\'\\1\') ?>', $str );
/*替换<!--# #-->标签为<?php ?>*/
$str = strtr($str,array($CFG['template']['tag_left'] => '<?php ', $CFG['template']['tag_right'] => ' ?>'));
unset($CFG);
return $str;
}
public function _include($tpl, $file = '') {
global $CFG;
$tpl_file = TPL_PATH."{$tpl}.tpl.html";
$tpl_c_file = TPL_C_PATH . "{$tpl}.tpl.php";
//判断是否需要重新编译模版
if( filemtime($tpl_file) != filemtime($tpl_c_file) ) {
//tpl模版 转译 php文件 并保存
$html = file_get_contents($tpl_file);
$html = $this->tplCompile($html);//替换标签
file_put_contents($tpl_c_file,$html);
touch($tpl_c_file,filemtime($tpl_file));//编译文件与模版文件同步修改时间
}
//php文件 转译 静态html
ob_start();
include $tpl_c_file;
$html = ob_get_clean();
//保存静态html
if(!$CFG['debug']) $html = mini_html($html);
unset($CFG);
echo $html;
if($file == '') $file = CACHE_HTML_PATH . "{$tpl}.html";
$arrData['file'] = $file;
$arrData['html'] = $html;
return $arrData;
}
public function cache($file,$cacheTime) {
global $CFG;
$time = $_SERVER['REQUEST_TIME'];
if( (is_file($file) && (filemtime($file) + $cacheTime >= $time) ) && !$CFG['debug'] ) {
unset($CFG);
include $file;exit;
return true;
} else {
unset($CFG);
}
return false;
}
}这里需要定义两个常量:
1:TPL_PATH,模版存储位置
2:TPL_C_PATH,编译好的模版存储位置
假设两个常量设置为同一目录,接下来,就用个简单的例子体验视图层的使用:
在根目录下创建a.tpl.html文件,内容如下
当前测试模版文件名为a.tpl.html<br>
在根目录下创建index.tpl.html文件,内容如下
<html> <head></head> <body> 当前测试模版文件名为index.tpl.html<br> <!--# layout:a #--> 时间戳=<!--# echo $this->data['time']#--> </body> </html>
class indexController extends controller {
public function __construct() {}
public function indexAction() {
$tpl = 'index';
$file = 'index.html';
self::$view->cache($file,60);//缓存60秒
self::$view->data['time'] = time();
self::$view->loadTpl($tpl,$file);
}
}通过访问http://localhost/xxx/?c=index&a=index的时候,显示效果类似于
当前测试模版文件名为index.tpl.html
当前测试模版文件名为a.tpl.html
时间戳=1396865471
现在让我们修改一下模版index.tpl.html,把“当前测试模版文件名为”改成“当前测试模版文件名=”,再刷新页面看看效果。
这个时候,你会发现,页面内容居然没变化,这是因为self::$view->cache($file,60);的缓存功能还没有失效,如果想立马看到效果,可以把60改为0,然后再刷新一下页面。这下终于出现了?

我来说两句: