Smarty模板引擎技术
-
什么是模板引擎?
-
什么是Smarty模板引擎?
-
为何选择Smarty模板引擎?
-
如何使用Smarty模板引擎?
一、历史背景
场景一:回顾之前编写PHP项目的方式
//链接数据的操作
//构造sql语句
//执行sql语句
$res = mysql_query($sql);
?>
<table>
<?php
while($row = mysql_fetch_assoc($res)){
?>
<tr>
<td><?php echo $row['goods_name']?></td>
</tr>
<?php
}
?>
</table>
分析:这样的写法的好或者不好的地方在哪里?
优点:执行效率高。
缺点:代码组织混乱,维护成本高,几乎无法重构(重构基本要重写)。
场景二:那些年,我做过的项目。
在外面的做开发工作,并不是,程序员觉得项目开发完毕了就结束了,往往一个项目开发要经历多次修改和优化。
因为一直在使用混编的方式进行开发项目,只要界面一修改,就等于项目除了固定功能部分之外的代码就得重新写。
既然功能都是固定的,那么有没有什么办法,让我们的前端和后台进行分离,前端修改不会影响后端。
二、模板引擎概述
1、什么是模板引擎
-
模板引擎,是指利用某种模板语言将页面制成模板,再依据业务逻辑将该模板语言翻译成业务数据,从而生成最终展示页面。其目的就是要把页面(HTML)与业务数据(PHP)实现彻底分离。(模板引擎可以将我们php项目的前端和后端的开发分离)。
-
业界主流的开源cms中对模板引擎的使用是很广泛的,如业界知名cms:dedecms,discuz,phpcms,echop等。
2、感受模板引擎
通过在html中使用标签的方式,就可以达到不用修改php 代码情况下,完成制作一个网站。
那么?这样的原理是怎么样的?
3、模板引擎核心原理
所有的模板引擎底层实现都是基于这个原理实现,不管他有多强大多复杂,最基本的核心实现思路都是一致的。
4、封装模板引擎
为什么要封装?为了实现代码的重用,以更优雅的方式组织代码。
三、Smarty模板引擎
1、什么是Smarty模板引擎
Smarty是一个基于PHP开发的PHP模板引·擎。它提供了逻辑与外在内容的分离。(实现了php项目的前端和后台开发的分离)
一个叫名字叫做Smarty,且使用php编写的模板引擎。
2、如何获取Smarty模板引擎
Smarty官网: http://www.smarty.net/
3、lib目录详解
Plugings 拓展插件目录
Sysplugins Smarty系统插件目录
AutoLoader.php 自动载入类
Debug.tpl Smarty提示信息模板
Smarty.class.php Smarty3.0入口文件(兼容2.0)
SmartyBC.class.php Smarty2.0入口文件
4、为什么要选择Smarty模板引擎
从技术背景角度来说:Smarty是由php官方开发团队开发和维护。
-
速度 相对于其他模板引擎,Smarty模板引擎的执行效率更高。
-
编译型 第一次访问项目,Smarty模板引擎会生成一个编译文件,第二次访问时会判断项目的模板文件是否被修改,如果没有修改,就执行编译文件。
-
缓存技术 当项目的缓存文件在生命周期内,那么Smarty在执行的时候会直接执行缓存文件
-
插件技术:当Smarty内部功能不够使用的时候,允许开发者自定义拓展插件
-
语句自由 if/elseif/else/endif:标签语法很简单。
编译速度 < 缓存速度 < 静态化
什么情况下使用Smarty模板引擎?那么什么情况下使用Smarty引擎不好?
-
在数据不常更新修改,非实时更新的项目可以使用Smarty模板引擎:管理系统,内容管理系统等
-
在数据实时更新的项目中使用不好:金融类型项目,数据时时更新类项目。
5、部署Smarty四步走
第一步:复制lib目录至虚拟主机目录
第二步:修改lib文件夹名为Smarty
第三步:创建templates文件夹
第四步:创建templates_c文件夹
6、使用Smarty模板引擎七步走
第一步:在虚拟主机目录下创建一个index.php文件
第二步:在index.php文件中引入
第三步:Smarty类并实例化
第四步:在templates文件中创建一个index.html文件
第五步:在index.php文件中使用assign方法配置变量
第六步:在index.php文件夹中使用display方法加载模板
第七步:在index.html模板文件中编写Smarty标签
7、Smarty模板引擎的执行原理
我们访问了index.php,通过在index.php文件中分配的变量,在html中显示出来。
那么这中间发生了什么?
-
当第一次访问index.php的时候,Smarty模板引擎会自动在templates_c文件夹中创建一个display()方法所指定的模板的缓存文件。
-
当第二次访问index.php的时候,会判断display()方法指定的模板文件是否 被修改,如果被修改了,则重新生成这个模板文件的编译文件,如果没有被修改则直接执行这个编译文件
如何判断模板文件被修改呢?
在unix系统和windows 系统中文件一般都有三个时间:
创建时间 修改时间 访问时间
我们通过判断模板文件的修改时间来确定是否被修改,从而判断是否执行或者重新生成编译文件。
那么如何直观的理解这个执行过程呢?
8、一张图理解Smarty执行流程
四、Smarty中常用的属性与方法
-
常用属性
<?php
include "Smarty/Smarty.class.php";
//实例化SMarty类
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的语言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板文件路径
$Smarty->template_dir = './view';
//修改的编译路径
$Smarty->compile_dir ='./compile';
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('demo.php');
2、相关属性
思考:为什么我们要设置templates和templates_c两个文件夹
答:这些目录都是由Smarty中的下面几个属性决定的。
-
template_dir 模板文件目录
-
complile_dir 编译文件目录
-
config_di r 配置文件目录
-
cache_dir 缓存文件目录
示例代码:
<?php
include "Smarty/Smarty.class.php";
//实例化SMarty类
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的语言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板文件路径
$Smarty->template_dir = './view';
//修改的编译路径
$Smarty->compile_dir ='./compile';
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('demo.php');
在Smarty3.0中,这四个属性都是private私有的,那么为什么可以在类外部修改私有属性?
在PHP中有魔术方法__set
3、相关方法
因为Smarty3.0是为了兼容Smarty2.0版本,允许通过属性的方式来设置相关属性。
但是为了迎合Smarty3.0开发规范,我们一般通过使用相关方法对相关属性的设置。。
-
setTemplateDir() 设置模板文件目录
-
setCompileDir() 设置编译文件目录
-
setConfigDir() 设置配置文件目录
-
setCacheDir() 配置缓存文件目录
示例代码:
<?php
include "Smarty/Smarty.class.php";
//实例化SMarty类
$Smarty = new Smarty();
$name = '我是小明';
$PHP = 'PHP是世界上最好的语言';
//修改左定界符
$Smarty->left_delimiter = '<{';
//修改右定界符
$Smarty->right_delimiter = '}>';
//修改模板的路径
$Smarty->setTemplateDir('./tmp');
//修改编译文件的路径
$Smarty->setCompileDir('./c');
$Smarty->assign('name',$name);
$Smarty->assign('PHP',$PHP);
$Smarty->display('index.tpl');
4、Smarty中常用的两个方法
Assign(`模板变量名称`,`值`)
Display(`模板名称`)
5、注意事项
-
一般在使用Smarty做项目的时候,如果templates_c文件不存在,那么会自动创建,但是在linux环境中因为文件权限的问题,。
-
Display方法指定的模板文件,不一定是.html 结尾的,使用任何文本文件都可以。
如在ecshop项目中的 .tpl后缀。
五、系统内置函数
1、capture内建函数
作用是捕获一段内容。
实例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{capture name='PHP'}
PHP是世界上最好的语言
我是一段被捕获的内容
{/capture}
{$smarty.capture.PHP}
</body>
</html>
-
config_load内建函数
基本语法:{config_load file=`配置文件的名称`}
参数详解:file 在configs文件夹中的配置文件
示例代码:
{config_load file="config.conf" }
{#name#}
<hr/>
{#age#}
<hr/>
{#sex#}
Configs/config.conf文件
示例代码:
name = 王小明
[class1]
name = 王二明
[class2]
name = 王大明
[class3]
sheji_01.tpl代码
{config_load file="config.conf" }
{#name#}
<br/>
{config_load file="config.conf" section="class1"}
{#name#}
{config_load file="config.conf" section="class2"}
<br/>
{$smarty.config.name}
-
include内建函数
一般网站的页面设计大概分为三部分:头部文件,内容文件,底部文件
在Smarty中我们可以使用include函数实现,将我们的页面精细化拆分。
基本语法:{include file=模板文件名称}
参数说明:模板文件在templates文件夹中。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{include file="header.tpl"}
{include file="content.tpl"}
{include file="footer.tpl"}
</body>
</html>
4、foreach内建函数
作用:遍历从PHP中分配来的数组
示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty模板引擎</title>
</head>
<body>
{foreach $arr as $a}
{$a}
<hr/>
{/foreach}
</body>
</html>
六、设计篇
1、模板注释
{*我是注释内容*}
2、模板变量
①从php文件中分配过来的变量
$Smarty->assign('name',$name);
②从配置文件中读取的变量
{config_load file="config.conf"}
{#name#}
<hr/>
{#sex#}
<hr/>
{#age#}
③在模板文件中直接定义的变量
{assign var="class" value="PHP15期"}
{$class}
参数说明:var 变量的名称
Value 变量的值
-
系统中保留变量
$smarty.get.page 相当于$_GET[page]
$smarty.post.page 相当于$_POST[page]
$smarty.cookies.username $_COOKIE[username]
$smarty.server.SERVER_NAME $_SERVER[SERVER_NAME]
$smarty.env.Path $_ENV[PATH]
$smarty.session.id $_SESSION[id]
$smarty.request.username $_REQUEST[username]
{$smarty.now} 代表获取当前时间戳
{$smarty.const} 获取一个常量
{$smarty.capture} 获取捕获内容
{$smarty.config} 获取配置文件
{$smarty.current_dir} 当前项目工作路径
{$smarty.version} 当前Smarty版本
{$smarty.ldelim} ó {ldelim} 左定界符
{$smarty.rdelim} ó {rdelim} 右定界符
实例代码:获取配置文件变量的两种方法
{config_load file="config.conf" }
{#name#}
{$smarty.config.name}
<hr/>
{$smarty.config.age}
<hr/>
{$smarty.config.sex}
-
变量调节器
变量调节器的作用:变量调节器主要是对Smarty变量进行格式化。
基本格式:{变量名称|变量调节器:参数1:参数2|变量调节器2:参数1:参数2}
在Smarty中有21中变量调节器:
{$var|capitalize} 将变量中的单词首字母大写
{$var|count_characters:true}计算变量中的字符串,如果参数为true的话,那么将空格也计算在内。
{$var|cat:var2} 链接变量
{$var|count_paragraphs} 计算变量中的段落数量
{$var|count_sentences} 计算变量中的句子数量
{$var|count_words} 计算变量中的单词量
{$var|date_format:"%Y%m%d"} 格式化日期
{$var|default:"value"} 默认值
{$var|escape} 转码
{$var|indent:10:"*"} 缩进
{$var|lower} 将变量中的所有单词转化为小写
{$var|nl2br} 将变量中你的换行符转化为<br>
{$var|regex_replace:"/[\t\n]/":""} 正则替换
{$var|replace:"aa":"bb"} 字符串替换
{$var|spacify:"^^"} 插空操作
{$var|string_format:"%d"} 字符串格式化 %d格式化为整型,%s格式化为字符串类型
{$var|strip: "*"} 去空操作
{$var|strip_tags} 去除变量中的HTML代码
{$var|truncate:30:"…"} 字符串截取,将最后三个字符替换为三个点
{$var|upper} 将变量中的字母转化为大写
{$var|wordwrap:30:"<br>"} 行宽约束
示例代码:
{*capitalize 将变量中的单词首字母转化为大写*}
{$name|capitalize}
<hr/>
{*cat 链接变量*}
{$var1|cat:$var2:$var3}
<hr/>
{*格式化日期*}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
<hr/>
{*转码*}
{$var4|escape}
<hr/>
{*将变量中的单词转化为小写*}
{$var5|lower}
<hr/>
{*将变量中的换行符转化为br*}
{$var6|nl2br}
<hr/>
{*字符串替换
{$var7|replace:'小明':'老王'}
*}
{*字符串截取*}
{$var8|truncate:9:"***"}
<hr/>
{*将变量中的字母转化为大写*}
{$var9|upper}
6、变量调节器组合应用
{*变量调节器的综合应用*}
{$var10|nl2br|truncate:120:'***'|lower}