1、简介
含义:Smarty是PHP的一个引擎模板如Python的jinjia2模板引擎,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来。
目前模板引擎技术有很多,Laravel框架(blade模板引擎)、ThinkPHP框架(自己的模板引擎技术)、Smarty模板引擎技术,虽然有很多模板引擎技术,但是原理都是一样的。
2、安装
在网上下载Smarty包直接将其解压,我们需要的仅仅是里面的libs文件夹。Libs文件里面都是库文件,我们不应该修改里面的任何内容。解压完毕后就直接将libs文件夹放入到我们需要使用的网站根目录。通常我们会把libs文件夹改名为smarty使用。
3、使用
使用的话,直接加载smarty里面的Smarty.class.php并实例化
template.php模板文件的代码:
最终生成的编译文件会默认保存到templates_c这个目录(后期可以修改)
4、Smarty的变量来源
Smarty中的模板中变量的来源,有如下几种:
①smarty分配(assign)过来的真实数据
②配置文件数据
首先,定义一个配置文件,保存图片的地址
说明:由于该配置文件,我们不会直接访问,所以相对的路径应该是被谁引入,出发点就是那个文件
其次,在html模板中要想使用配置文件,需要先加载配置文件
通过smarty对象的setConfigDir() ,设置从哪个目录读取、加载配置文件
输出
③smarty保留的变量
这些变量是smarty保留的、内置的,不需要声明、加载,可以直接使用
{$smarty.now},用来获得当前的时间戳
{$smarty.const.常量名},用来获得PHP文件中定义的常量
{$smarty.config},获得配置文件中的配置项
{$smarty.current_dir} ,当前文件所在的目录
④PHP请求变量
在html模板中,还可以获得PHP提供的http请求是携带的变量、PHP的环境变量等
5、Smarty模板中变量调节器
介绍:
变量调节器,就是对模板中的变量进行调节、修饰作用
例如:模板中可以使用{$smarty.now}获得当前的时间戳,用户看不懂时间戳的,所以我们需要对变量进行修饰,将其转换成日期格式就好了
如何使用:
语法:{模板变量|修饰器:传递的参数}
变量调节器:
date_format:将时间戳转换成日期格式
capitalize:首字母大写
upper:字符串整体大写
count_characters:统计字符个数
default:默认值
如果变量为空、空字符串,就可以使用默认值代替
indent:字符缩进
参数1:缩进的字符数量
参数2:默认显示空格,可以指定字符代替
escape: 用来转码的,有2个参数,默认采用实体转码,可以将其修改为url就会采用url转码
url转码之后的效果就是这样:
truncate,字符串截取
参数1:截取的长度,
参数2:截取之后追加在字符串后面的字符,该追加的字符会被计算在截取的长度之内,例如:
注意:由于count_characters和truncate存在bug,一般不使用。。。
6、Smarty模板中流程控制语句
介绍:
在html模板中,可以使用PHP的流程控制语句
foreach
for
if elseif else
include
extends
block
literal
代码演示:
(1)foreach用来在模板中遍历数组,语法格式:
{foreach(遍历的数组 as $k=>$v)}
{foreachelse}
当遍历的数组为空的时候执行这里
{/foreach}
(2)for循环:
注意:可以通过step属性设置步长值
(3)if、elseif、else的使用
注意结束符即可{/if}
(4)include,该标签是用来加载其他的模板文件的
哪里需要公共的代码,在哪里include加载即可
(5)extends模板继承
与jinjia2类似,注意语法即可
block标签还提供了2个参数:append表示追加在原来内容的后面,prepend追加到原来内容的前面
(6)literal,标签用来表示不采用smarty的语法去解析
比如我们的css
css里面的{},由于smarty的默认的占位符(标签)就是{},一看到花括号就去解析了,由于这里不需要smarty解析,所以我们就可以使用{literal}标签包起来
也可以通过修改smarty的默认占位符解决冲突。
7、Smarty缓存
Smarty实现缓存:
再来访问一下:
局部不缓存
介绍:
局部不缓存,指的是网站中大部分使用缓存了,但是一些局部的地方(商品价格、天气情况、股票价格)不缓存
代码实现:
局部不缓存通过模板中的insert标签实现的,smarty看到insert标签的时候,永远会执行,即使该页面是缓存的,看到insert标签之后还是会执行
Insert标签的使用需要遵循如下规范:
规范1:定义insert标签时:
name属性指向的是调用的函数
如果传递参数,通过键值对的形式传递
规范2:getPrice函数文件的 命名规范
必须在smarty/plugins目录下定义
规范3:文件里面函数的命名规范
smarty_insert_函数名
单模板多缓存
介绍:
单模板多缓存,一个模板生成多个缓存文件
Smarty在display的时候,生成了缓存文件,后面读取的都是该缓存文件,如何让一个模板生成多个缓存文件呢?
需要通过display的第二个参数实现,会根据第二个参数创建对应的缓存文件
上面的代码中数据库是否执行,取决于目前是否存在缓存文件,通过smarty的isCached()进行判断,参数1:模板文件,参数2:创建单模板多缓存时的序号
删除缓存
介绍:
删除缓存有2个函数:
clearCache(),删除指定模板对应的缓存
clearAllCache(),删除所有的缓存
删除指定的缓存文件:
如果想删除一个模板对应的所有缓存文件,不用传第二个参数:
8、Smarty相关配置
设置模板、编译文件保存目录
介绍:
通过setTemplateDir、setCompileDir两个方法分别设置模板文件在哪个目录、编译文件在哪个目录:
设置模板标签定界符
9、自定义模板引擎

<?php //自定义的模板引擎 class MyTpl { //该属性保存分配的数据 private $tpl_vars = []; public function assign($k,$v) { $this->tpl_vars[$k] = $v; } public function display($filename) { //require_once 返回值是true、false //$file = require_once $filename; $content = file_get_contents($filename); //将里面的占位符替换成真实的数据 foreach ($this->tpl_vars as $k=>$v){ $content = str_replace('{$'.$k.'}', $v, $content); } //var_dump($new_content); //将替换好的内容写入到一个文件中 $file = 'tpl_c/'.mt_rand(1000,9999).md5($filename).'.php'; file_put_contents($file, $content); //显示新的文件的内容 require_once $file; } }