Smarty2 模板引擎

Smarty 模板引擎

Smarty作用

Smarty 是一个成熟的引擎,用来实现表现和内容相分离。
Smarty官网

文件目录

  • plugins 存放Smarty插件,即扩展类文件
  • sysplugins 存放系统系统函数的目录
  • Smarty.class.php Smarty 的入口文件,引入此文件即可
  • SmartyBC.class.php 兼容版

Smarty.class.php -构造函数

  • setTemplateDir(): 设置模板文件夹
  • setCompileDir(): 设置混编文件夹
  • setCacheDir(): 设置缓存文件夹
  • setConfigsDir(): 设置配置文件夹

使用步骤

拷贝核心文件libs 到站点下。并更名为Smarty

1
2
3
4
require './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} 获取GETPOSTREQUEST提交的值
  • 模板文件中:{$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模板中引入

  1. 新建configs文件夹
  2. 创建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_loadsection 属性来引入配置文件中的节,没有经过[]设置为节的为全局配置文件

  1. 模板文件中:{config_load file = 'smarty.conf' section=''} //只需要写配置文件名,不需要写路径
  2. 模板文件中,获取数据
    语法a) :
    主机名 用户名

自定义不同情况下的颜色

1
2
3
*{
color:{##COLOR}
}

数组

在Smarty中对数组的操作有两种方法

方法一:{数组[下标]}
方法二:{数组.下标}

foreach 循环遍历数组

语法

1
2
3
4
5
{foreach 数组 as 键=>值}
//循环体
{foreachelse}
//没有数组输出,foreachelse可以省略
{/foreach}

属性

语法:{值变量@属性}
{$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
2
3
{for 变量=初始值 to 结束值 [step 步长]}
//循环体
{/for}
1
2
3
{for $i=1 to 10 step 2}
{$i}:锄禾日当午
{/for}

步长默认是1,step 自定义步长

while循环

1
2
3
{while 条件}
//循环体
{/while}
1
2
3
4
{assign var='n' value=1}
{while $n<=10}
{$n++}:汗滴禾下土
{/while}

自定义函数

{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
4
require './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
6
require './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
4
require './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的优点与缺点

  1. 因为可以生产缓存,所有速度快
  2. 如果要实时更新的内容很多的情况,不适合使用Smarty(比如,股票),如果一个小项目,不适合用