迷你版 smarty --模板引擎和解析
http://blog.ipodmp.com/archives/php-write-a-mini-smarty-template-engine/
迷你版Smarty模板引擎目录结构如下:
① 要开发一个模板引擎,最主要的有两个类,分别是模板引擎入口类和模板解析类。
A.首先创建MiniSmarty目录,然后新建一个文件名为MiniSmarty.class.php
其代码如下:
<?php
//MiniSmarty模板引擎
class MiniSmarty {
//模板文件
public $template_dir = 'templates';
//编译文件
public $compile_dir = 'templates_c';
// 缓存文件
public $cache_dir = 'cache';
// 模板变量
public $_tpl_var = array();
// 是否开启缓存
public $caching = false;
public function __construct() {
$this->checkDir();
}
//检查目录是否建好
private function checkDir() {
if(!is_dir($this->template_dir)) {
exit('模板文件目录 templates 不存在!请手动创建');
}
if(!is_dir($this->compile_dir)) {
exit('编译模板 templates_c不存在!请手动创建');
}
if(!is_dir($this->cache_dir)) {
exit('缓存文件目录 cache 不存在!请手动创建' );
}
}
//模板变量注入方法
public function assign($tpl_var, $var = null) {
if(isset($tpl_var) && !empty($tpl_var)) {
$this->_tpl_var[$tpl_var] = $var;
}else {
exit('模板变量没有设好!');
}
}
//文件编译
public function display($file) {
//模板文件
$tpl_file = $this->template_dir . '/' . $file;
if(!file_exists($tpl_file)) {
exit('Error: 模板文件不存在!');
}
//编译文件
$parse_file = $this->compile_dir . '/' . md5($file) . $file . '.php';
//只有当编译文件不存在或者是模板文件被修改过了
//才重新编译文件
if(!file_exists($parse_file) || filemtime($parse_file) < filemtime($tpl_file)) {
include_once('MiniSmarty_Compile.class.php');
$compile = new MiniSmarty_Compile($tpl_file);
$compile->parse($parse_file);
}
//开启了缓存才加载缓存文件,否则直接加载编译文件
if($this->caching) {
//缓存文件
$cache_file = $this->cache_dir . '/' . md5($file) . $file . '.html';
//只有当缓存文件不存在,或者编译文件已被修改过
//重新生成缓存文件
if(!file_exists($cache_file) || filemtime($cache_file) < filemtime($parse_file)) {
//引入缓存文件
include_once($parse_file);
//缓存内容
$content = ob_get_clean();
//生成缓存文件
if(!file_put_contents($cache_file, $content)) {
exit('缓存文件生成出错!');
}
}
//载入缓存文件
include_once($cache_file);
}else {
//载入编译文件
include_once($parse_file);
}
}
}
B.然后再新建一个MiniSmarty模板引擎解析器类文件:MiniSmarty_Compile.class.php
其代码如下:
<?php
// MiniSmarty模板引擎
class MiniSmarty_Compile {
//模板内容
private $content = '';
public function __construct($tpl_file) {
$this->content = file_get_contents($tpl_file);
}
//解析普通变量,如把{$name}解析成$this->_tpl_var['name']
public function parseVar() {
$pattern = '/\{\$([\w\d]+)\}/i';
if(preg_match($pattern, $this->content)) {
$this->content = preg_replace($pattern, '<?php echo \$this->_tpl_var["$1"]?>', $this->content);
}
}
//这里可以自定义其他解析器...
//模板编译
public function parse($parse_file) {
//调用普通变量解析器
$this->parseVar();
//这里可以调用其他解析器...
//编译完成后,生成编译文件
if(!file_put_contents($parse_file, $this->content)) {
exit('编译出错!');
}
}
}
C.最后,还必须新建几个目录,分别是模板文件目录templates、编译文件目录 template_c、缓存文件目录cache。
D.编写demo.php,测试一下自定义的迷你版MiniSmarty模板引擎吧!
demo.php代码如下:
<?php
//引入模板引擎
require_once('MiniSmarty.class.php');
//实例化模板类
$minismarty = new MiniSmarty();
//缓存开关
//$minismarty->caching = true;
$webname = 'Smarty测试';
$author = 'lin3615';
$title = '这是测试标题';
$content = '这是测试内容';
$minismarty->assign('webname', $webname);
$minismarty->assign('author', $author);
$minismarty->assign('title', $title);
$minismarty->assign('content', $content);
//启动编译模板文件
$minismarty->display('demo.tpl');
demo.tpl 中示例如下:
{$webname}
<h3>{$title} </h3>
<span>作者:{$author}</span>
<p>内容:{$content}</p>
运行测试:可以修改上面的示例变量和是否开启缓存:
运行后,图如下:
迷你版 smarty --模板引擎和解析的更多相关文章
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...
- smarty模板引擎原理解析
//php 控制器文件 <?php//引入模板引擎文件include("20130304.php");$smarty =newTinySmarty();$qq_numbers ...
- Smarty模板引擎技术二
Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量 注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...
- Smarty模板引擎的使用
Smarty模板引擎的使用 Smarty是PHP中一个基于MVC模式的模板引擎. Download: http://www.smarty.net/download 特点 1. 最快速度的程序开发 ...
- 前端学PHP之Smarty模板引擎
前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...
- PHP之Smarty模板引擎
前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...
- smarty模板引擎
1. 使用smarty 1.1 项目引入 // 3, 连接数据库,提取相关数据 $title = "Smarty模板引擎"; $content = "Smarty模 ...
- 深入浅出之Smarty模板引擎工作机制(二)
源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解. Smarty模板引擎的原理,其实是这么一个过程: ...
- 深入浅出之Smarty模板引擎工作机制(一)
深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解. ...
随机推荐
- JavaWeb文件的上传与下载(1)
经常用到的上传: 头像上传,资料分享等 文件上传的步骤 1.指定表单类型为文件上传表单 enctype="multipart/form-data" 2.表单提交方式必须为:post ...
- android安全问题(八)伪造短信(利用原生android4.0漏洞)
导读:本文利用android4.0的一个原生漏洞来伪造短信.无须声明任何权限即可伪造发送方为任何号码的短信给用户. android4.0发布已经是很久很久很久很久以前的事情了,这个漏洞早就报了出来,之 ...
- onSubmit的使用
在web开发中,我们经常会遇到,一点回车键表单就自己提交的问题,能不能禁用回车键呢,答案是肯定的. Html代码 <from action="" method=" ...
- HDU - 5187 - zhx's contest (高速幂+高速乘)
zhx's contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 机器学习算法-K-means聚类
引文: k均值算法是一种聚类算法.所谓聚类.他是一种无监督学习,将类似的对象归到同一个蔟中.蔟内的对象越类似,聚类的效果越好. 聚类和分类最大的不同在于.分类的目标事先已知.而聚类则不一样. 由于其产 ...
- 在chrome下安装Proxy SwitchySharp插件
https://chrome.google.com/webstore/detail/dpplabbmogkhghncfbfdeeokoefdjegm
- shell内部变量
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- 对于top.ascx里面可以不可以放置css的文件进行一个讲解
今天遇到一个这样的问题就是把网站上面的flash做的导航栏和图片动画替换成html+css的代码,然而asp.net里面的页面又是xx.ascx的文件夹,当时我就晕了不知道改如何去下手,我就把里面的c ...
- apktool重打包签名后安装出现“Failure [INSTALL_FAILED_ALREADY_EXISTS]”
一般修改.签名环节不出错的话,可以考虑看是不是包名重复的问题,如果系统中存在相同包名的应用,安装时会报这个错误 就算apk名字变了,但和原来的包名仍是一样的,所以先卸载掉系统里同包名的应用,再尝试安装 ...
- 集合练习——Map部分
练习: 输入诗的名称查询出诗的内容,当输入exit时,退出程序,“春晓”,“静夜思”,“鹅”. package CollectionPart; public class Poetry { privat ...