文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
16.6.3 模板引擎讲解
什么是模版引擎?
百度百科的解释:
为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的 HTML 文档。
是不是听起来很晕?用一句白话解释:
就是把静态页面中特定的一些标记(字符串)替换成最终需要的 PHP 标签;好处:
可以让(网站)程序实现界面与数据分离,这就大大提升了开发效率,好的设计也使得代码重用变得更加容易。
编写自己的模板引擎
这里需要注意两点:
1 字符串替换,将{
和}
分别替换成 PHP 标签<?php
和?>
2 为提升程序执行效率,使用模板缓存;
<?php
function template($tFile)
{
$tmpFile = TPL_SKIN.'/'.$tFile;
if(!file_exists($tmpFile)){
return $tmpFile;
}
$comFile = TPL_CACHE.'/'.basename($tFile,'.html').'.php';
if (!file_exists($comFile) || filemtime($tmpFile)>filemtime($comFile))
{
tplParse($tmpFile,$comFile);
}
return $comFile;
}
function tplParse($tFile,$cFile){
$fileContent=file_get_contents($tFile);
$fileContent=preg_replace_callback("/^(\xef\xbb\xbf)/", function($r){}, $fileContent);
$fileContent=preg_replace_callback(
"/\<\!\-\-\s*\\\$\{(.+?)\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php echo ' . $r[1] . '; ?>');
},
$fileContent
);
$fileContent=preg_replace_callback(
"/\{(\\\$[a-zA-Z0-9_\[\]\\\ \-\'\,\%\*\/\.\(\)\>\'\"\$\x7f-\xff]+)\}/s",
function($r)
{
return str_replace('\"', '"', '<?php echo ' . $r[1] . '; ?>');
},
$fileContent
);
$fileContent=preg_replace_callback(
"/\\\$\{(.+?)\}/is",
function($r)
{
return str_replace('\"', '"', '<?php echo ' . $r[1] . '; ?>');
},
$fileContent
);
$fileContent=preg_replace_callback(
"/\<\!\-\-\s*\{else\s*if\s+(.+?)\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php } else if(' . $r[1] . '){ ?>');
},
$fileContent
);
$fileContent=preg_replace_callback(
"/\<\!\-\-\s*\{elif\s+(.+?)\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php } else if(' . $r[1] . '){ ?>');
},
$fileContent
);
$fileContent=preg_replace_callback(
"/\<\!\-\-\s*\{else\}\s*\-\-\>/is",
function($r)
{
return "<?php } else { ?>";
},
$fileContent
);
for($i=0; $i<5; ++$i){
$fileContent = preg_replace_callback(
"/\<\!\-\-\s*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\s*\}\s*\-\-\>(.+?)\<\!\-\-\s*\{\/loop\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php if(is_array('.$r[1].')){foreach('.$r[1].' AS '.$r[2].'=>'.$r[3].') { ?>'.$r[4].'<?php }}?>');
},
$fileContent
);
$fileContent = preg_replace_callback(
"/\<\!\-\-\s*\{loop\s+(\S+)\s+(\S+)\s*\}\s*\-\-\>(.+?)\<\!\-\-\s*\{\/loop\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php if(is_array('.$r[1].')){foreach('.$r[1].' AS '.$r[2].') { ?>'.$r[3].'<?php }}?>');
},
$fileContent
);
$fileContent = preg_replace_callback(
"/\<\!\-\-\s*\{if\s+(.+?)\}\s*\-\-\>(.+?)\<\!\-\-\s*\{\/if\}\s*\-\-\>/is",
function($r)
{
return str_replace('\"', '"', '<?php if('.$r[1].'){?>'.$r[2].'<?php }?>');
},
$fileContent
);
}
$fileContent = preg_replace_callback(
"#<!--\s*{\s*include\s+([^\{\}]+)\s*\}\s*-->#i",
function($r)
{
return '<?php include template("'.$r[1].'");?>';
},
$fileContent
);
file_put_contents($cFile,$fileContent);
return true;
}
如何使用自己的模板引擎?
公共文件
/common/common.php
中已经载入了模版引擎函数库,并指定了模板风格;
在/config/config.php
中通过修改define('TPL_SKIN', 'theme/default');
的值来,改变应用的模版风格(确保模板风格已经存在)
一 创建模板文件时使用的基本语法
1 echo
输出变量:
{$title}
2 if
判断:
{if $bigid}
...{else}
...{/if}
3 foreach
循环:
{loop $LTsMenu $key $val}
{$val['title']}
{/loop}
4 模版中使用函数
${getUserName($val['compere'])}
5 include
模板中包含模板:
{include header.html}
二 使用模板
1 分配变量
在包含模版前定义的 PHP 变量,都可以在模版中使用:
$title = '首页 - ' . WEB_NAME;
2 包含模版文件
首先查找是否已经缓存,若未缓存 则替换标签后生成缓存文件。
include template("index.html");
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论