PHP之Smarty模板引擎
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP之Smarty模板引擎
前⾯的话
对PHP来说,有很多模板引擎可供选择,但Smarty是⼀个使⽤PHP编写出来的,是业界最著名、功能最强⼤的⼀种PHP模板引擎。
Smarty像PHP⼀样拥有丰富的函数库,从统计字数到⾃动缩进、⽂字环绕以及正则表达式都可以直接使⽤,如果觉得不够,SMARTY还有很强的扩展能⼒,可以通过插件的形式进⾏扩充。
另外,Smarty也是⼀种⾃由软件,⽤户可以⾃由使⽤、修改,以及重新分发该软件。
本⽂将详细介绍Smarty模板引擎
概述
Smarty是⼀个php模板引擎。
更准确的说,它分离了逻辑程序和外在的内容,提供了⼀种易于管理的⽅法。
Smarty总的设计理念就是分离业务逻辑和表现逻辑,优点概括如下:
速度——相对于其他的模板引擎技术⽽⾔,采⽤Smarty编写的程序可以获得最⼤速度的提⾼
编译型——采⽤Smarty编写的程序在运⾏时要编译成⼀个⾮模板技术的PHP⽂件,这个⽂件采⽤了PHP与HTML混合的⽅式,在下⼀次访问模板时将Web请求直接转换到这个⽂件中,⽽不再进⾏模板重新编译(在源程序没有改动的情况下),使⽤后续的调⽤速度更快
缓存技术——Smarty提供了⼀种可选择使⽤的缓存技术,它可以将⽤户最终看到的HTML⽂件缓存成⼀个静态的HTML页⾯。
当⽤户开启Smarty缓存时,并在设定的时间内,将⽤户的Web请求直接转换到这个静态的HTML⽂件中来,这相当于调⽤⼀个静态的HTML⽂件
插件技术——Smarty模板引擎是采⽤PHP的⾯向对象技术实现,不仅可以在原代码中修改,还可以⾃定义⼀些功能插件(按规则⾃定义的函数)
强⼤的表现逻辑——在Smarty模板中能够通过条件判断以及迭代地处理数据,它实际上就是种程序设计语⾔,但语法简单,设计⼈员在不需要预备的编程知识前提下就可以很快学会
模板继承——模板的继承是Smarty3的新事物。
在模板继承⾥,将保持模板作为独⽴页⾯⽽不⽤加载其他页⾯,可以操纵内容块继承它们。
这使得模板更直观、更有效和易管理
当然,也有不适合使⽤Smarty的地⽅。
例如,需要实时更新的内容,需要经常重新编译模板,所以这类型的程序使⽤Smarty会使模板处理速度变慢。
另外,在⼩项⽬中也不适合使⽤Smarty模板,⼩项⽬因为项⽬简单⽽前端与后端兼于⼀⼈的项⽬,使⽤Smarty会在⼀定程度上丧失PHP开发迅速的优点
配置
【安装】
安装Smarty很简单,到Smarty官⽅⽹站下载最新的稳定版本,然后解压压缩包,在解压后的⽬录可以看到⼀个名叫libs的Smarty类库⽬录,直接将libs⽂件夹复制到程序主⽂件夹下即可
[注意]Smarty要求web服务器运⾏php4.0以上版本
libs⽂件夹下共包含以下6个⽂件
Smarty.class.php(主⽂件)
SmartyBC.class.php(兼容其他版本Smarty)
sysplugins/* (系统函数插件)
plugins/* (⾃定义函数插件)
Autoloader.php
debug.tpl
【实例化】
/* 并指定了Smarty.class.php所在位置,注意'S'是⼤写的*/require './libs/Smarty.class.php';
/* 实例化Smarty类的对象$smarty */$smarty = new Smarty();
【init】
Smarty要求4个⽬录,默认下命名为:tempalates、templates_c、configs和cache。
每个都是可以⾃定义的,可以分别修改Smarty类属性或相关⽅法:$template_dir、$compile_dir、$config_dir和$cache_dir
/** file: init.inc.php Smarty对象的实例化及初使化⽂件 */
define("ROOT", str_replace("\\", "/",dirname(__FILE__)).'/');
//指定项⽬的根路径 require ROOT.'libs/Smarty.class.php';
//加载Smarty类⽂件 $smarty = new Smarty();
//实例化Smarty类的对象$smarty
/* 推荐⽤Smarty3以上版本⽅式设置默认路径,成功后返回$smarty对象本⾝,可连贯操作 */
$smarty ->setTemplateDir(ROOT.'templates/')
//设置所有模板⽂件存放的⽬录
// ->addTemplateDir(ROOT.'templates2/')
//可以添加多个模板⽬录 ->setCompileDir(ROOT.'templates_c/')
//设置所有编译过的模板⽂件存放的⽬录 ->addPluginsDir(ROOT.'plugins/')
//添加模板扩充插件存放的⽬录 ->setCacheDir(ROOT.'cache/')
//设置缓存⽂件存放的⽬录 ->setConfigDir(ROOT.'configs');
//设置模板配置⽂件存放的⽬录 $smarty->caching = false;
//设置Smarty缓存开关功能 $smarty->cache_lifetime = 60*60*24;
//设置模板缓存有效时间段的长度为1天 $smarty->left_delimiter = '<{';
//设置模板语⾔中的左结束符 $smarty->right_delimiter = '}>'; //设置模板语⾔中的右结束符
【demo】
<!-- main.tpl -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<{$content}>
</body>
</html>
<?php
require './init.inc.php';
$smarty -> assign('content','this is content.....');
$smarty -> display('main.tpl');
?>
基本语法
【注释】
模板注释被*星号包围,⽽两边的星号⼜被定界符包围。
注释只存在于模板⾥⾯,⽽在输出的页⾯中不可见
<{* this is a comment *} >
【变量】
模板变量⽤美元符号$开始,可以包含数字、字母和下划线,这与php变量很像。
可以引⽤数组的数字或⾮数字索引,当然也可以引⽤对象属性和⽅法
配置⽂件变量是⼀个不⽤美元符号$,⽽是⽤#号包围着变量(#hashmarks#),或者是⼀个$smarty.config形式的变量
[注意]Smarty可以识别嵌⼊在双引号中的变量
数学和嵌⼊标签
{$x+$y} // 输出x+y的和 {assign var=foo value=$x+$y}
// 属性中的变量 {$foo[$x+3]}
// 变量作为数组索引 {$foo={counter}+3}
// 标签⾥⾯嵌套标签 {$foo="this is message {counter}"}
// 引号⾥⾯使⽤标签
定义数组
{assign var=foo value=[1,2,3]}
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
{assign var=foo value=[1,[9,8],3]} // 可以嵌套
短变量分配
{$foo=$bar+2}
{$foo = strlen($bar)}
{$foo = myfunct( ($x+$y)*3 )} // 作为函数参数 {$foo.bar=1} // 赋值给指定的数组索引 {$foo.bar.baz=1} {$foo[]=1}
点语法
{$foo.a.b.c} => $foo['a']['b']['c']
{$foo.a.$b.c} => $foo['a'][$b]['c']
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c']
{$foo.a.{$b.c}} => $foo['a'][$b['c']]
PHP语法
{$foo[1]}
{$foo['bar']}
{$foo['bar'][1]}
{$foo[$x+$x]}
{$foo[$bar[1]]}
{$foo[section_name]}
<!-- main.tpl -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<{***定义数组:10***}>
<{assign var=foo value=[10,20,30]}>
<{$foo[0]}><br>
<{***短变量分配:0***}>
<{$foo=0}> <{$foo}><br>
<{***点语法:1***}>
<{$test.a}><br>
<{***PHP语法:1***}>
<{$test['a']}><br>
<{***数学运算:3***}>
<{$test.a+$test.b}><br>
</body>
</html>
<?php
require './init.inc.php';
$smarty -> assign('test',['a'=>1,'b'=>2]);
$smarty -> display('main.tpl');
?>
【函数】
每⼀个smarty标签输出⼀个变量或者调⽤某种函数。
在定界符内函数和其属性将被处理和输出
<{funcname attr1="val" attr2="val"}>
{config_load file="colors.conf"}
{include file="header.tpl"}
{if$highlight_name}
Welcome, <div style="color:{#fontColor#}">{$name}!</div>
{else}
Welcome, {$name}!
{/if}
{include file="footer.tpl"}
【属性】
⼤多数函数都带有⾃⼰的属性以便于明确说明或者修改他们的⾏为,smarty函数的属性很像HTML中的属性。
静态数值不需要加引号,但是字符串建议使⽤引号。
可以使⽤普通smarty变量,也可以使⽤带调节器的变量作为属性值,它们也不⽤加引号。
甚⾄可以使⽤php函数返回值和复杂表达式作为属性值
⼀些属性⽤到了布尔值(true或false),它们表明为真或为假。
如果没有为这些属性赋布尔值,那么默认使⽤true为其值
{include file="header.tpl"}
{include file="header.tpl" nocache} // 等于nocache=true {include file="header.tpl" attrib_name="attrib value"} {include file=$includeFile}
{include file=#includeFile# title="My Title"} {assign var=foo value={counter}}
{assign var=foo value=substr($bar,2,5)}
{assign var=foo value=$bar|strlen}
{assign var=foo value=$buh+$bar|strlen}
{html_select_date display_days=true}
{mailto address="smarty@"}
<select name="company_id">
{html_options options=$companies selected=$company_id}
</select>
变量
Smarty有⼏种不同类型的变量,变量的类型取决于它的前缀符号是什么(或者被什么符号包
围)。
Smarty的变量可以直接被输出或者作为函数属性和调节器(modifiers)的参数,或者⽤于内部的条件表达式等等。
如果要输出⼀个变量,只要⽤定界符将它括起来就可以
1、从PHP分配的变量
index.php: $smarty = new Smarty;
$smarty->assign('Contacts',array('fax' => '555-222-9876','email' => 'zaphod@'));
$smarty->display('index.tpl');
index.tpl: <{$Contacts.fax}><br> <{$Contacts.email}><br>
OUTPUT: 555-222-9876<br>
zaphod@<br>
2、从配置⽂件读取的变量
加载配置⽂件后,配置⽂件中的变量需要⽤两个井号"#"包围或者是smarty的保留变量$smarty.config.来调⽤
foo.conf:
pageTitle = "This is mine"
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"
<!-- main.tpl -->
<{config_load file='foo.conf'}>
<!DOCTYPE>
<html>
<title><{#pageTitle#}></title>
<body>
<table style="background:<{#tableBgColor#}>">
<tr style="background:<{#rowBgColor#}>">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>
<?php
require './init.inc.php';
$smarty -> display('main.tpl');
?>
3、配置⽂件⾥分区域的变量
foo.conf:
[a]
x=1
[b]
x=2
[c]
x=3
<!-- main.tpl -->
<{config_load file='foo.conf' section="a"}>
<{#x#}>
output:
1
4、模板⾥定义的变量?
1 2 3 4 5<{$name='Bob'}>
The value of $name is<{$name}>. output:
The value of $name is Bob.
5、保留变量?
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15$smarty.get
$smarty.post
$smarty.cookies
$smarty.server
$smarty.env
$smarty.session
$smarty.request
$smarty.now //当前时间戳
$smarty.const//访问php常量
$smarty.capture //捕获内置的{capture}...{/capture}模版输出$smarty.config //取得配置变量。
{$smarty.config.foo}是{#foo#}的同义词$smarty.section //指向{section}循环的属性
$smarty.template //返回经过处理的当前模板名
$smarty.current_dir //返回经过处理的当前模板⽬录名
$smarty.version //返回经过编译的Smarty模板版本号
?
1 2 3 4 5 6<!-- main.tpl -->
<{$smarty.now}><br>
<{date('Y-m-d',$smarty.now)}><br> <{$smarty.template }><br> <{$smarty.current_dir }><br>
<{$smarty.version }><br>
变量调节器
变量调节器作⽤于变量、⾃定义函数或字符串。
变量调节器的⽤法是:‘|’符号右接调节器名称。
变量调节器可接收附加参数影响其⾏为。
参数位于调节器右边,并⽤‘:’符号分开
[注意]对于同⼀个变量,可以使⽤多个修改器。
它们将从左到右按照设定好的顺序被依次组合使⽤。
使⽤时必须要⽤"|"字符作为它们之间的分隔符
capitalize[⾸字符⼤写]
将变量⾥的所有单词⾸字⼤写,与php的ucwords()函数类似。
默认参数为false⽤于确定带数字的单词是否需要⼤写
?
1
2 3 4 5 6 7 8 9 10<{$articleTitle="next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|capitalize}><br>
<{$articleTitle|capitalize:true}> <br>
output:
next x-men film, x3, delayed.
Next X-Men Film, x3, Delayed.
Next X-Men Film, X3, Delayed.
lower[⼩写]
将变量字符串⼩写,作⽤等同于php的strtolower()函数?
1
2 3 4 5 6 7 8<{$articleTitle="Next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|lower}><br>
output:
Next x-men film, x3, delayed.
next x-men film, x3, delayed.
upper[⼤写]
将变量改为⼤写,等同于php的strtoupper()函数?
1
2 3 4 5 6 7 8<{$articleTitle="Next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|upper}><br>
output:
Next x-men film, x3, delayed.
NEXT X-MEN FILM, X3, DELAYED.
cat[连接字符串]
将cat⾥的值后接到给定的变量后⾯?
1 2 3<{$articleTitle="next x-men film, x3, delayed."}> <{$articleTitle|cat:" yesterday."}> OUTPUT: next x-men film, x3, delayed. yesterday.
count_characters[字符计数]
计算变量⾥的字符数。
默认参数为false,⽤于确定是否计算空格字符?
1
2 3 4 5 6 7<{$articleTitle="next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|count_characters}><br>
<{$articleTitle|count_characters:true}><br> OUTPUT:
next x-men film, x3, delayed.
25
8
9
29
count_paragraphs[计算段数] 计算变量⾥的段落数量
?
1
2 3 4 5 6 7<{$articleTitle="next x-men\n film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|count_paragraphs}><br> OUTPUT:
next x-men film, x3, delayed.
2
count_sentences[计算句数] 计算变量⾥句⼦的数量?
1
2 3 4 5 6 7<{$articleTitle="next x-men. film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|count_sentences}><br> OUTPUT:
next x-men. film, x3, delayed.
2
count_words[计算词数] 计算变量⾥的词数?
1
2 3 4 5 6 7<{$articleTitle="next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|count_words}><br> OUTPUT:
next x-men film, x3, delayed.
5
date_format[格式化⽇期] ?
1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16%a - 当前区域星期⼏的简写
%A - 当前区域星期⼏的全称
%b - 当前区域⽉份的简写
%B - 当前区域⽉份的全称
%c - 当前区域⾸选的⽇期时间表达
%C - 世纪值(年份除以 100 后取整,范围从 00 到 99)
%d - ⽉份中的第⼏天,⼗进制数字(范围从 01 到 31)
%D - 和 %m/%d/%y ⼀样
%e - ⽉份中的第⼏天,⼗进制数字,⼀位的数字前会加上⼀个空格(范围从 ' 1'到 '31')
%g - 和 %G ⼀样,但是没有世纪
%G - 4 位数的年份,符合 ISO 星期数(参见 %V)。
和 %V 的格式和值⼀样,只除了如果 ISO 星期数属于前⼀年或者后⼀年,则使⽤那⼀年。
%h - 和 %b ⼀样
%H - 24 ⼩时制的⼗进制⼩时数(范围从 00 到 23)
%I - 12 ⼩时制的⼗进制⼩时数(范围从 00 到 12)
%j - 年份中的第⼏天,⼗进制数(范围从 001 到 366)
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35%m - ⼗进制⽉份(范围从 01 到 12)
%M - ⼗进制分钟数
%n - 换⾏符
%p - 根据给定的时间值为 `am' 或 `pm',或者当前区域设置中的相应字符串
%r - ⽤ a.m. 和 p.m. 符号的时间
%R - 24 ⼩时符号的时间
%S - ⼗进制秒数
%t - 制表符
%T - 当前时间,和 %H:%M:%S ⼀样
%u - 星期⼏的⼗进制数表达 [1,7],1 表⽰星期⼀
%U - 本年的第⼏周,从第⼀周的第⼀个星期天作为第⼀天开始
%V - 本年第⼏周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第⼀个⾄少还有 4 天的星期,星期⼀作为每周的第⼀天。
(⽤ %G 或者 %g 作为指定时间戳相应周数的年份组成。
)
%W - 本年的第⼏周数,从第⼀周的第⼀个星期⼀作为第⼀天开始
%w - 星期中的第⼏天,星期天为 0
%x - 当前区域⾸选的时间表⽰法,不包括时间
%X - 当前区域⾸选的时间表⽰法,不包括⽇期
%y - 没有世纪数的⼗进制年份(范围从 00 到 99)
%Y - 包括世纪数的⼗进制年份
%Z 或 %z - 时区名或缩写
%% - ⽂字上的 `%' 字符
? 1
2 3 4 5 6<{$smarty.now|date_format}><br>
<{$smarty.now|date_format:"%D"}><br> output:
Mar 25, 2017
03/25/17
default[默认值]
为变量设置⼀个默认值。
当变量未设置或为空字符串时,将由给定的默认值替代其输出?
1
2 3 4 5 6 7<{$articleTitle|default:'a'}><br>
<{$articleTitle="next x-men film, x3, delayed."}> <{$articleTitle|default:'a'}><br>
output:
a
next x-men film, x3, delayed.
escape[转义]
escape作⽤于变量,⽤以html、url、单引号、⼗六进制、⼗六进制实体、javascript、邮件的转码或转义。
第⼀个参数默认为'html',可选参数
有'html,htmlall,url,quotes,hex,hexentity,javascript';第⼆个参数默认为'utf-8',可选参数有'ISO-8859-1,UTF-8'...
?
1
2 3 4 5 6 7<{$articleTitle="'Stiff Opposition Expected to Casketless Funeral Plan'"}>
<{$articleTitle|escape}><br>
<{$articleTitle|escape:'url'}>
output:
'Stiff Opposition Expected to Casketless Funeral Plan'
%27Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan%27
indent[缩进]
在每⾏缩进字符串,默认是4个字符。
对于第⼀个可选参数,可以指定缩进字符数,对于第⼆个可选参数,可以指定使⽤什么字符缩进,例如'\t'作为tab
?
1
2 3 4 5 6 7<{$articleTitle="'Stiff Opposition Expected to Casketless Funeral Plan'"}> <{$articleTitle}><br>
<{$articleTitle|indent}>
output:
'Stiff Opposition Expected to Casketless Funeral Plan'
'Stiff Opposition Expected to Casketless Funeral Plan'
nl2br[换⾏符替换成<br />]
所有的换⾏符将被替换成 <br />,功能同PHP中的nl2br()函数⼀样?
1
2 3 4 5 6 7 8<{$articleTitle="Next x-men\nfilm, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|nl2br}><br>
output:
Next x-men film, x3, delayed.
Next x-men
film, x3, delayed.
regex_replace[正则替换]
使⽤正则表达式在变量中搜索和替换,语法来⾃php的preg_replace()函数?
1
2 3 4 5 6 7 8<{$articleTitle="Next x-men\nfilm, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|regex_replace:"/[\r\t\n]/":" "}><br> output:
Next x-men
film, x3, delayed.
Next x-men film, x3, delayed.
replace[替换]
⼀种在变量中进⾏简单的搜索和替换字符串的处理。
等同于php的str_replace()函数?
1
2 3 4 5 6 7<{$articleTitle="Next x-men film, x3, delayed."}> <{$articleTitle}><br>
<{$articleTitle|replace:"x":"y"}><br>
output:
Next x-men film, x3, delayed.
Neyt y-men film, y3, delayed.
spacify[插空]
插空是⼀种在变量的字符串的每个字符之间插⼊空格或者其他的字符(串)的⽅法?
1
2
3 4 5 6 7 8 9<{$articleTitle="Next x-men film, x3, delayed."}>
<{$articleTitle}><br>
<{$articleTitle|spacify}><br>
<{$articleTitle|spacify:"^"}><br>
output:
Next x-men film, x3, delayed.
N e x t x - m e n f i l m , x 3 , d e l a y e d .
N^e^x^t^ ^x^-^m^e^n^ ^f^i^l^m^,^ ^x^3^,^ ^d^e^l^a^y^e^d^.
string_format[字符串格式化]
⼀种格式化字符串的⽅法,例如格式化为⼗进制数等等。
实际运⽤的是php的sprintf()函数?
1
2 3 4 5 6 7 8 9<{$number=23.5678}>
<{$number}><br>
<{$number|string_format:"%.2f"}><br> <{$number|string_format:"%d"}> output:
23.5678
23.57
23
strip[去除(多余空格)]
⽤⼀个空格或⼀个给定字符替换所有重复空格、换⾏和制表符<{$articleTitle="Grandmother of\neight makes\t hole in one."}>
<{$articleTitle}><br>
<{$articleTitle|strip}><br>
<{$articleTitle|strip:' '}><br>
output:
Grandmother of
eight makes hole in one.
Grandmother of eight makes hole in one.
Grandmother of eight makes hole in one.
strip_tags[去除html标签]
去除<和>标签,包括在<和>之间的全部内容
?
1 2 3 4 5 6 7<{$articleTitle="Blind Woman Gets New Kidney from Dad she Hasn't Seen in <b>years</b>."}> <{$articleTitle}><br>
<{$articleTitle|strip_tags}><br>
output:
Blind Woman Gets New Kidney from Dad she Hasn't Seen in<b>years</b>.<br>
Blind Woman Gets New Kidney from Dad she Hasn't Seen in years .<br>
truncate[截取]
从字符串开始处截取某长度的字符,默认是80个,也可以指定第⼆个参数作为追加在截取字符串后⾯的⽂本串。
该追加字串被计算在截取长度中。
默认情况下,smarty会截取到⼀个词的末尾。
如果想要精确的截取多少个字符,把第三个参数改为"true";第四个参数默认设置为FALSE,表⽰将截取⾄字符串末尾,设置为TRUE则截取到中间。
注意如果设了TRUE,则忽略
字符边界?
1
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19<{$articleTitle='Two Sisters Reunite after Eighteen Years at Checkout Counter.'}> <{$articleTitle}><br>
<{$articleTitle|truncate}><br>
<{$articleTitle|truncate:30}><br>
<{$articleTitle|truncate:30:""}><br>
<{$articleTitle|truncate:30:"---"}><br>
<{$articleTitle|truncate:30:"":true}><br>
<{$articleTitle|truncate:30:"...":true}><br>
<{$articleTitle|truncate:30:'..':true:true}><br>
output:
Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after...
Two Sisters Reunite after
Two Sisters Reunite after---
Two Sisters Reunite after Eigh
Two Sisters Reunite after E...
Two Sisters Re..ckout Counter.
wordwrap[⾏宽约束]
可以指定段落的列宽(也就是⼀⾏多少个字符,超过这个字符数换⾏),默认80。
第⼆个参数可选,指定在约束点使⽤什么换⾏符,默认为"\n"。
默认情况下smarty将截取到词尾,如果想精确到设定长度的字符,请将第三个参数设为ture。
本调节器等同于php的wordwrap()函数
?
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22<{$articleTitle="Blind woman gets new kidney from dad she hasn't seen in years."}> <{$articleTitle}><br>
<{$articleTitle|wordwrap:30}><br>
<{$articleTitle|wordwrap:20}><br>
<{$articleTitle|wordwrap:30:"<br />\n"}><br>
<{$articleTitle|wordwrap:26:"\n":true}><br>
output:
Blind woman gets new kidney from dad she hasn't seen in years.<br>
Blind woman gets new kidney
from dad she hasn't seen in
years.<br>
Blind woman gets new
kidney from dad she
hasn't seen in
years.<br>
Blind woman gets new kidney<br />
from dad she hasn't seen in<br />
years.<br>
Blind woman gets new
kidney from dad she hasn't
seen in years.<br>
内置函数
{$var=...} 变量赋值
这是{assign}函数的简写版,可以直接赋值给模版,也可以为数组元素赋值?
1
2 3 4<{$name='Bob'}>The value of $name is<{$name}>. output:
The value of $name is Bob.
{append} 追加
{append}⽤于在模板执⾏期间建⽴或追加模板变量数组?
1
2 3 4 5 6 7 8 9 10 11<{append var='name'value='Bob'index='first'}>
<{append var='name'value='Meyer'index='last'}> <{* 或者 *}>
<{append 'name''Bob'index='first'}> <{* 简写 *}> <{append 'name''Meyer'index='last'}> <{* 简写 *}> The first name is<{$name.first}>.<br>
The last name is<{$st}>.
output:
The first name is Bob.The last name is Meyer.
{assign} 赋值
{assign}
⽤来在模板运⾏时为模板变量赋值
<{assign var="name" value="Bob"}>
<{assign "name" "Bob"}>
<{* 简写 *}>
The value of $name is <{$name}>.
output:
The value of
$name is Bob.
{config_load}
{config_load}⽤来从配置⽂件中加载config变量(#variables#)到模版foo.conf:
[a]
x=1
[b]
x=2
[c]
x=3
<!-- main.tpl -->
<{config_load file='foo.conf' section="a"}>
<{#x#}>
output:
1
{for} 循环
{for}、{forelse}标签⽤来创建⼀个简单循环,⽀持以下不同的格式:
{for $var=$start to $end}步长为1的简单循环;
{for $var=$start to $end step $step}其它步长循环
当循环⽆迭代时执⾏{forelse}
<ul>
<{for $foo=1 to 3}>
<li><{$foo}></li><{/for}>
</ul>
output:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<ul>
<{for $foo=2 to 10 max=3}>
<li><{$foo}></li><{/for}>
</ul>
output:
<ul>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
{while}循环
随着⼀些特性加⼊到模版引擎,Smarty的{while}循环与php的while语句⼀样富有弹性。
每⼀个{while}必须与⼀个{/while}成对出现,所有php条件和函数在它⾝上同样适⽤,诸如||、or、&&、and、is_array()等等
下⾯是⼀串有效的限定符,它们的左右必须⽤空格分隔开,注意列出的清单中⽅括号是可选的,在适⽤情况下使⽤相应的等号(全等或不全等)
{while $foo > 0}
{$foo--}
{/while}
{foreach},{foreachelse}遍历
{foreach}⽤来遍历数据数组,{foreach}与{section}循环相⽐更简单、语法更⼲净,也可以⽤
来遍历关联数组
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
{foreach}循环可以嵌套;数组变量通常是(另)⼀个数组的值,⽤来指导循环的次数,可以为专有循环传递⼀个整数;当数组变量⽆值时执⾏{foreachelse};
{foreach}的属性是@index、@iteration、@first、@last、@show、@total;
可以⽤循环项⽬中的当前键({$item@key})代替键值变量
<{$myColors['a'] = 'red'}>
<{$myColors['b'] = 'green'}>
<{$myColors['c'] = 'blue'}>
<ul>
<{foreach $myColors as $color}>
<li><{$color@key}>:<{$color}></li>
<{/foreach}>
</ul>
output:
<ul>
<li>a:red</li>
<li>b:green</li>
<li>c:blue</li>
</ul>
@index:包含当前数组的下标,开始时为0
@iteration:包含当前循环的迭代,总是以1开始,这点与index不同。
每迭代⼀次值⾃动加1
@first:当{foreach}循环第⼀个时first为真
@last:当{foreach}迭代到最后时last为真
@show:检测{foreach}循环是否⽆数据显⽰,show是个布尔值(true or false)
@total:包含{foreach}循环的总数(整数),可以⽤在{forach}⾥⾯或后⾯
{break}:停⽌/终⽌数组迭代
{continue}:中⽌当前迭代⽽开始下⼀个迭代/循环
<{$myColors['a'] = 'red'}>
<{$myColors['b'] = 'green'}>
<{$myColors['c'] = 'blue'}>
<{$myColors['d'] = 'pink'}>
<{$myColors['e'] = 'yellow'}>
<ul>
<{foreach $myColors as $color}>
<{if $color@first}>
<li><b><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></b></li>
<{elseif $color@last}>
<li><b><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></b></li>
<{else}>
<li><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></li>
<{/if}>
<{foreachelse}>
no result...
<{/foreach}>
</ul>
output:
<ul>
<li><b>1:0:a:red</b></li>
<li>2:1:b:green</li>
<li>3:2:c:blue</li>
<li>4:3:d:pink</li>
<li><b>5:4:e:yellow</b></li>
</ul>
{if}{elseif}{else} 条件
随着⼀些特性加⼊到模版引擎,Smarty的{if}语句与php的if语句⼀样富有弹性。
每⼀个{if}必须与⼀个{/if}成对出现,允许使⽤{else}和{elseif},所有php条件和函数在这⾥同样适⽤,诸如||、or、&&、and、is_array()等等
?
1<{if$name == 'Fred'|| $name == 'Wilma'}><br> ... <br><{/if}> <br><{* 允许使⽤圆括号 *}> <br><{if( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}> <br>... <br><{/if}> <br><{* 可以嵌⼊函数 *}><br> <{if count($var) gt 0}> <br>... <br><{/if}> <br><{* 数组检查 *}> <br><{if is_array($foo) }> <br>..... <br><{/if}> <br><{*是否空值检查 *}> <br><{if isset($foo) }> <br>..... <br><{/if}> <br><{* 测试值为偶数还是奇数 *}> <br><{if$var is even}> <br>... <br><{/if}> <br><{if$var is odd}> <br>... <br><{/if}> <br><{if$var is not odd}> <br>... <br><{/if}> <br><{* 测试var能否被4整除 *}> <br><{if$var is div by4}> <br>... <br><{/if}> <br><{* 测试发现var是偶数,2个为⼀组,也就是0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, 等等 *}> <br><{if$var is even by2}> <br>... <br> <{/if}> <br><{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}> <br><{if$var is even by3}> <br>... <br> <{/if}>
{include}
{include}标签⽤于在当前模板中包含其它模板。
当前模板中的任何有效变量在被包含模板中同样可⽤
必须指定file属性,该属性指明模板资源的位置
变量可以作为属性参数传递给被包含模板,任何明确传递给被包含模板的变量只在被包含⽂件的作⽤域中有效。
如果传递的属性变量在当前模板中有同名变量,那么传递的属性变量将覆盖当前模板变量
?
1
2 3 4 5 6 7 8 9 10 11<!-- main.tpl -->
<{include file="header.tpl"test="⼩⽕柴"}> <!-- header.tpl -->
<{$test}>
<{$test="aaa"}><br>
<{$test}>
output:
⼩⽕柴
aaa
{function}
{function}⽤来在模板中创建函数,可以像调⽤插件函数⼀样调⽤它们
我们不写⼀个表达内容的插件,⽽是让它保留在模板中,通常这是个更易于管理的选择。
同时,它也简化了对数据的遍历,例如深度嵌套菜单。
另外可以在模板中直接使⽤{funcname...}函数。
{function}标签必须包含模板函数名的name属性,该name标签名必须能够调⽤模板函数
默认变量值应能作为属性传递到模板函数,当模板函数被调⽤的时候,默认值应能被复写
在模板函数内部应能使⽤被调⽤模板的所有变量值,在模板函数中更改或新建变量的值必
须具局部作⽤域,⽽且在执⾏模板函数后这些变量值在被调⽤模板内部应不可见 调⽤函数时,可以直接使⽤函数名,或者使⽤{call}
?
1
2
3 4 5 6 7 8 9 10 11 12 13<!-- main.tpl -->
<{function name=test a=0 b=0}> <{$a}>+<{$b}>=<{$a+$b}>
<{/function}>
<{test}><br>
<{test a=1 b=2}><br>
<{call test a=3 b=3}><br> output:
0+0=0
1+2=3
3+3=6
插件
Smarty中的插件总是按需加载。
只有在模板脚本中调⽤特定的调节器、函数、资源插件等时才会⾃动加载。
此外,每个插件只加载⼀次,即便在同⼀个请求中存在⼏个不同的Smarty实例同时运⾏
插件⽬录可以是⼀个包含路径的字符串或包含多个路径的数组。
安装插件的时候,将插件简单地置于其中⼀个⽬录下,Smarty会⾃动识别使⽤
插件⽂件和函数必须遵循特定的命名约定以便Smarty识别
插件⽂件必须命名如下:
.php
其中type为下⾯这些插件类型中的⼀种:
function
modifier
block
compiler
prefilter
postfilter
outputfilter
resource
insert
name为合法标识符,仅包含字母、数字和下划线
function.html_select_date.php, resource.db.php, modifier.spacify.php
插件内的函数应遵循如下命名约定
smarty_type_name ()
如果调节器(modifier)命名为foo,那么按规则函数为smarty_modifier_foo()。
如果指定的插件⽂件不存在或⽂件、函数命名不合规范,Smarty会输出对应的错误信息
Smarty既可⾃动从⽂件系统加载插件,也可在运⾏时通过register_* API函数注册插件。
当然,也可以通过unregister_* API函数卸载已经载⼊的插件
对于只在运⾏时注册的插件函数不必遵守命名约定
如果某个插件依赖其它插件的某些功能(事实上,⼀些插件被绑定在Smarty中),那么可以通过如下⽅法加载需要的插件:
?
1 2 3<?php
require_once $smarty->_get_plugin_filepath('function', 'html_options'); ?>
按照惯例,Smarty对象通常作为最后⼀个参数传递给插件,但有两个例外:1、调节器不须接受Smarty对象的传递;2、为了向前兼容旧版Smarty,块插件将$repeat排在Smarty对象后⾯作为最后⼀个参数($smarty作为倒数第⼆个参数)
【模板函数】
?
1 2 3void smarty_function_name($params, $smarty); array $params;
object$smarty;
模板传递给模板函数的所有属性都包含在关联数组$params中
在模板中,函数的输出内容(返回值)在原位置⽤函数标签代替,例如{fetch}函数。
作为另⼀种选择,函数也可以单纯地⽤来做些⾮输出内容的任务,如{assign}函数
如果函数需要分配(俗话说的赋值)⼀些变量给模板或者使⽤Smarty提供的⼀些函数,可以通过$smarty对象实现,如$smarty->foo()
?
1
2 3 4 5 6 7 8 9 10 11 12//function.eightball.php
<?php
function smarty_function_eightball($params, $smarty){
$answers = array('Yes', 'No','No way','Outlook not so good','Ask again soon','Maybe in your reality'); $result = array_rand($answers);
return$answers[$result];}
?>
<!-- main.tpl -->
Question: Will we ever have time travel?<br>
Answer: <{eightball}>.
除了使⽤以上⽅式,还可以使⽤registerPlugin()⽅式来进⾏插件注册,但是由于与PHP代码混合在⼀起,不建议使⽤
registerPlugin()
void registerPlugin(string type, string name, mixed callback, bool cacheable, mixed cache_attrs);
registerPlugin()⽅法在脚本中注册函数或⽅法作为插件。
其参数如下:
“type”定义插件的类型,其值为下列之⼀:“function”、“block”、“compiler”和“modifier”
“name”定义插件的函数名
“callback”为定义的php回调函数,其类型为下列之⼀:
1、包含函数名的字符串;
2、格式为(&$object, $method)的数组,其中,&$object为引⽤对象,$method为包含⽅法。