Smarty 模板引擎
Smarty作用
Smarty 是一个成熟的引擎,用来实现表现和内容相分离。
Smarty官网
文件目录
plugins
存放Smarty插件,即扩展类文件sysplugins
存放系统系统函数的目录Smarty.class.php
Smarty 的入口文件,引入此文件即可SmartyBC.class.php
兼容版
Smarty.class.php -构造函数
- setTemplateDir(): 设置模板文件夹
- setCompileDir(): 设置混编文件夹
- setCacheDir(): 设置缓存文件夹
- setConfigsDir(): 设置配置文件夹
使用步骤
拷贝核心文件libs 到站点下。并更名为Smarty1
2
3
4require './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->assign('name','uiste');
$smarty->display('demo1.html');
界定符:$left_delimiter = '{'
修改界定符:$smarty->left_delimiter = '<{';
更改模板文件:$smarty->setTemplateDir('./views/');
更改混编文件夹:$smarty->setCompileDir('./view_c/');
注释:{*这是Smarty的注释*}
多学一招:Smarty和HTML注释内容的区别。Smarty注释在网页源代码中不显示。
如果Smarty的定界符是
{*
*}
那么注释的语法是?
答:{** 注释 **}
变量
普通变量
自定义变量。
语法一:
在PHP文件中,$smarty->assign(‘变量名’,’变量值’);
在模板文件中,{$name}
语法二:
在模板文件中,使用{assign} 标签,定义变量{assign var='name' value='berry'}
{$name}
保留变量
Smarty 中有一个特殊的变量 $smarty
,不能作为自定义变量名,他是一个保留变量(内置变量)。该变量用来获取用户的请求、系统变量、常量。
例题
- 模板文件中:
{$smarty.get.name}
获取GET
、POST
、REQUEST
提交的值- 模板文件中:
{$smarty.const.PI}
获取define
定义常量- PHP文件中:
$_SESSION['name'] = 'root'
;模板文件中:$smarty.session.admin
获取会话的值,$smarty.cookies.admin
获取cookie的值- 模板文件中:
{$smarty.server.DOCUMENT_ROOT}
获取根目录- 模板文件中:
{$smarty.now}
获取时间戳- 模板文件中:
{$smarty.ldelim}
,{$smarty.rdelim}
获取左右界定符- 模板文件中:
{$smarty.version}
获取版本号
配置变量
将变量保存在配置文件,然后再Smarty模板中引入
- 新建
configs
文件夹- 创建
smarty.conf
文件,参数设置如下:
1
2
3
4
5
6
7
8 >HOST = 127.0.0.1
>USERNAME = ROOT
>PWD = aa
>[style1]
>COLOR = #FF0000
>[style2]
>COLOR = #00FF00
>
配置文件中节,用
[]
中括号来声明,通过config_load
的section
属性来引入配置文件中的节,没有经过[]
设置为节的为全局配置文件
- 模板文件中:
{config_load file = 'smarty.conf' section=''}
//只需要写配置文件名,不需要写路径- 模板文件中,获取数据
语法a) :
主机名 用户名
自定义不同情况下的颜色1
2
3*{
color:{##COLOR}
}
数组
在Smarty中对数组的操作有两种方法
方法一:{数组[下标]}
方法二:{数组.下标}
foreach 循环遍历数组
语法
1 | {foreach 数组 as 键=>值} |
属性
语法:{值变量@属性}
{$value@iteration}
从1开始的编号{$value@index}
从0开始的索引{$value@first}
是否是第一个元素{$value@last}
是否是最后一个元素{$value@show}
数组中是否有元素显示{$value@total}
一共有多少个元素
section 循环遍历数组
只能遍历索引数组,不能遍历关联数组
语法:
{section name = 自定义变量(key) loop=数组($week)}
{$week[key]}//循环体
{sectionelse}
//没有数组输出
{/section}
属性
{$smarty.section.自定义变量名.iteration}
从1增长的编号{$smarty.section.自定义变量名.index}
从0增长的索引{$smarty.section.自定义变量名.first}
是否是第一个元素{$smarty.section.自定义变量名.last}
是否是最后一个元素
判断
语法:1
2
3
4
5
6
7{if $score>=90}
优秀
{elseif $score>=80}
良好
{else $score>=70}
满意
{/if}
循环
for循环
1 | {for 变量=初始值 to 结束值 [step 步长]} |
1 | {for $i=1 to 10 step 2} |
步长默认是1,step 自定义步长
while循环
1 | {while 条件} |
1 | {assign var='n' value=1} |
自定义函数
{html_checkboxes} 复选框
模板文件中:
方法一:{html_checkboxes output=$output values=$values selected=$selected}
方法二:{html_checkboxes options=$options selected=$selected}
PHP文件中:1
2
3$smarty->assign('output',array('ff','bb','cc','dd','ee'));
$smarty->assign('value',array('1','2','3','4','5'));
$smarty->assign('selected',array('1','4'));
模板文件中1
2
3
4{html_checkboxes output=$output values=$value selected=$selected}
{html_options output=$output values=$value name='hobby' selected=$selected2}
{html_radios output=$output values=$value selected=$selected2}
{html_select_date month_format='%m' field_order='YMD'}
{html_options} 下拉菜单
模板文件中:{html_options options=$options name='hobby' selected=$selected}
PHP文件中:
{html_radios}单选按钮
模板文件中:{html_radios options=$options selected=$selected}
{html_select_date}显示日期
{html_select_date month_format='%m' field_order='YMD'}
变量修饰器
要使用变量修饰器,我们需要管道运算符( | )
在默认情况下,truncate
是按字节截取的,但是中文属于多字节字符,在UTF-8下一个字符占用3个字节显示,这样会出现乱码;如果开启了多字节处理,truncate
就会自动按多字符处理了。
extension=php_mbstring.dll
缓存
Smarty 缓存就是生成静态页面
开启:$smarty->caching = 1;
开启缓存
更新缓存:
方法一:删除对应的缓存,系统会更新
方法二:更改对应的模板文件,包括配置文件,包含文件,布局文件缓存都会自动更新
方法三:缓存文件的有效时间过期,会自动更新
方法四:$smarty->force_cache = true;
强制更新缓存
缓存的生命周期
默认情况下,缓存的生命周期是3600秒。$smarty->cache_lifetime = -1 | 0 | N;
- N:表示缓存文件生命周期是N秒
- 0:缓存文件立即失效
- -1:永远不失效
单模板,多缓存【缓存分页】
php文件:1
2
3
4require './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->caching = 1; //开启缓存
$smarty->display('demo17.html',$_GET['pageno'])
模板文件:1
当前是第{$smarty.get.pageno}页
缓存集合
PHP代码:1
2
3
4
5
6require './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->caching = 1; //开启缓存
$color = $_GET['color'];
$size = $_GET['size']
$smarty->display('demo18.html',"$color|$size");
模板文件:1
2颜色:{$smarty.get.color}
大小:{$samrty.get.size}
邓东旭语:厉害了我的哥
清除缓存
$smarty->clearCache(模板,识别id)
$smarty->clearAllCache(); //清楚所有缓存
$smarty->clearCache('demo18.html','red|4');
清除有demeo18.html 模板生成的red 和 4组合的缓存
2、$smarty->clearCache(‘demo18.html’,’red’) : 清除demo18.html 模板生成的带有red的缓存
3、$smarty->clearCache(null,’red’); //清楚所有模板中带有red 的缓存
局部缓存
方法一:如果只有一个变量不缓存使用nocache属性
模板文件{$smarty.now nocache}
方法二:如果有很多内容不缓存,使用{nocache}
标签1
2
3{nocache}
一大堆什么鬼东西,是会被动态加载的
{/nocache}
money
PHP文件:1
2
3
4require './Smarty/Smarty.class.php';
$smarty = new Smarty();
$smarty->caching = 1; //开启缓存
$smarty->display('demo17.html',$_GET['pageno'])
模板文件:1
2
3
4
5
6<style type='text/css'>
.aa{
color:red;
}
</style>
<div class='aa'>锄禾日当午</div>
报错问题:源于大括号
{}
,Smarty将CSS中大括号当成了Smarty的定界符
解决方法:
方法一:更改定界符
方法二:在CSS和JS的大括号后面加上一个空格
方法三:使用{literal}标签,在literal标签内的大括号不会被解析
Smarty的优点与缺点
- 因为可以生产缓存,所有速度快
- 如果要实时更新的内容很多的情况,不适合使用Smarty(比如,股票),如果一个小项目,不适合用