自定义min版smarty模板引擎MinSmarty.class.php文件及用法


Posted in PHP onMay 20, 2016

本文实例讲述了自定义的min版smarty模板引擎MinSmarty.class.php文件。分享给大家供大家参考,具体如下:

一、smarty的优点

smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。

二、写一个简单的smarty模版类

具体代码如下:

<?php
 class MinSmarty{
 // 模版文件的路径
 var $template_dir = "./templates/";
 // 模版文件被替换后的文件 命名格式为com_对应的tpl.php
 var $complie_dir = "./templates_c/";
 // 存放变量值
 var $tpl_vars = array();
 // 这里使用两个方法实现assign 和 display
 function assign($tpl_var,$var=NULL){
  if($tpl_var!=NULL){
  $this->tpl_vars[$tpl_var]=$var;
  }
 }
 // 这里编写display方法的实现
 function display($tpl_file){
  // 读取这个模版文件->替换可以运行的php文件(编译后文件)
  $tpl_file_path=$this->template_dir.$tpl_file;  // 模版文件的路径
  $complie_file_path=$this->complie_dir."com_".$tpl_file.".php";  //编译后的文件路径
  // 判断文件是否存在
  if(!file_exists($tpl_file_path)){
  return false;
  }
  // 不让每次执行都生成编译文件
  if(!file_exists($complie_file_path) || filemtime($tpl_file_path)>filemtime($complie_file_path)){
  $fp1_file_con=file_get_contents($tpl_file_path); // 获取模版文件的全部内容
  // 这里进行正则替换把  模版文件中的代码 {$title} 替换成 <?php echo $this->tpl_vars['title'];? >
  $pattern=array(
     '/\{\s*\$([a-zA-Z_][a-zA-Z0-9_]*)\s*\}/i'
  );
  $replace=array(
     '<?php echo $this->tpl_vars["${1}"];?>'
  );
  $new_str=preg_replace($pattern,$replace,$fp1_file_con);  // 替换后的内容
  file_put_contents($complie_file_path,$new_str);  // 替换后的内容生成一个php文件
  }
  // 引入编译后的文件
  include_once("$complie_file_path");
 }
 }
?>

下面的代码是对该类的测试

intro.php代码如下:

<?php
  include_once("MySmarty.class.php");
  $title="这里是标题";
  $content="这里是内容111111";
  $MySmarty=new MySmarty();
  $MySmarty->assign("title",$title);
  $MySmarty->assign("content",$content);
  $MySmarty->display("intro.tpl");
?>

模版如下:

intro.tpl:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{$title}</title>
</head>
<body>
{$content}
</body>
</html>

PHP 相关文章推荐
综合图片计数器
Oct 09 PHP
我的论坛源代码(四)
Oct 09 PHP
PHP学习 运算符与运算符优先级
Jun 15 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
PHP SPL标准库之接口(Interface)详解
May 11 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
php类的自动加载操作实例详解
Sep 28 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 PHP
smarty自定义函数用法示例
May 20 #PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 #PHP
Yii框架组件和事件行为管理详解
May 20 #PHP
Yii框架表单模型和验证用法
May 20 #PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 #PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 #PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 #PHP
You might like
PHP实现文件下载断点续传详解
2014/10/15 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python zip文件 压缩
2008/12/24 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
通知的格式范文
2015/04/27 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
详解Redis复制原理
2021/06/04 Redis
Spring实现内置监听器
2021/07/09 Java/Android
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS