11.4 Smarty模板变量
在Smarty模板中经常使用的变量有两种:一种是从PHP中分配的变量;另一种是从配置文件中读取的变量。但使用最多的还是从PHP中分配的变量。但要注意,模板中只能输出从PHP中分配的变量,不能在模板中为这些变量重新赋值。在PHP脚本中分配变量给模板,都是通过调用Smarty引擎中的assign()方法实现的,不仅可以向模板中分配PHP标量类型的变量,而且也可以将PHP中复合类型的数组和对象变量分配给模板。
11.4.1 模板中输出PHP分配的变量
在前面的示例中已经介绍了,在PHP脚本中调用Smarty模板的assign()方法,向模板中分配字符串类型的变量,本节主要在模板中输出从PHP分配的复合类型变量。在PHP的执行脚本中,不管分配什么类型的变量到模板中,都是通过调用Smarty模板的assign()方法完成的,只是在模板中输出的处理方式不同。需要注意的是,在Smarty模板中变量预设是全域的。也就是说只要分配一次就可以了,如果分配两次以上,变量内容会以最后分配的为主。就算在主模板中加载了外部的子模板,子模板中同样的变量一样也会被替代,这样就不用再针对子模板再做一次解析的动作。
通常,在模板中通过遍历输出数组中的每个元素,可以通过Smarty中提供的foreach或section语句完成,而本节主要介绍在模板中单独输出数组中的某个元素。索引数组和关联数组在模板中输出方式略有不同,其中索引数组在模板中的访问和在PHP脚本中的引用方式一样,而关联数组中的元素在模板中指定的方式是使用句号“.”访问的。
变量输出基本有以下几种情况。
1.模板变量输出
模板内容:{$name}
PHP脚本:
//生成$smarty实例 require('lib/smarty/Smarty.class.php'); $smarty = new Smarty; //指定功能目录,可以自定义 $smarty->template_dir = 'templates'; $smarty->$compile_dir = 'template_c'; //为模板变量赋值,模板:test.html,放于templates下 //$smarty->assign('Smarty变量名','php内部变量'); //$smarty->display(Smarty文件名); $smarty->assign('name','HBSI'); $smarty->display('test.html');
结果输出如下:
HBSI
2.模板数组输出
模板内容:
{$company.name}<br> {$company.ver}<br> {$company.content}<br>
PHP脚本。
$company = array('name'=>'HBSI,'ver'=>'2014','content'=>'河北软件职业技术 学院'); $smarty->assign('company',$company); $smarty->display('test.html');
结果输出如下。
HBSI 2014 河北软件职业技术学院
3.循环实例
使用Section对多维数组进行列表输出,模板内容如下。
{section name=i loop=$shopList} {$shopList[i].name} {$shopList[i].version} {$shopList[i].date} <Br> {/section} //section:标签功能 //name:标签名 //loop:循环数组
PHP脚本如下。
$shopList = array(); $shopList[] = array('name'=>'HBSI','version'=>'2012','date'=> '2012-01-01'); $shopList[] = array('name'=>'HBSI','version'=>'2013','date'=> '2013-02-01'); $shopList[] = array('name'=>'HBSI','version'=>'2014','date'=> '2014-03-01'); $smarty->assign('shopList',$shopList); $smarty->display('test.html');
结果输出如下。
HBSI 2012 2012-01-01 HBSI 2013 2013-02-01 HBSI 2014 2014-03-01
11.4.2 模板中输出PHP分配的变量
Smarty保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量。例如,直接在模板中访问页面请求变量、获取访问模板时的时间戳、直接访问PHP中的常量、从配置文件中读取变量等。该保留变量中的部分访问介绍如下。
1.在模板中访问页面请求变量
可以在PHP脚本中通过超级全局数组$_GET、$_POST、$_REQUEST获取在客户端以不同方法提交给服务器的数据,也可以通过$_COOKIE或$_SESSION在多个脚本之间跟踪变量,或是通过$_ENV和$_SERVER获取系统环境变量。如果在模板中需要这些数组,可以调用Smarty对象中的assign()方法分配给模板。但在Smarty模板中,直接就可以通过{$smarty}保留变量访问这些页面请求变量。在模板中使用的示例如下所示。
{$smarty.get.page} {* 类似在PHP脚本中访问$_GET["page"] *} {$smarty.post.page} {* 类似在PHP脚本中访问$_POST["page"] *} {$smarty.cookies.username} {* 类似在PHP脚本中访问$_COOKIE["username"] *} {$smarty.session.id} {* 类似在PHP脚本中访问$_SESSION["id"] *} {$smarty.server.SERVER_NAME}{* 类似在PHP脚本中访问$_SERVER["SERVER_NAME"] *} {$smarty.env.PATH} {* 类似在PHP脚本中访问$_ENV["PATH"]*} {$smarty.request.username} {* 类似在PHP脚本中访问$_REQUEST["username"] *}
2.在模板中访问PHP中的变量
在PHP脚本中有系统常量和自定义常量两种,同样这两种常量在Smarty模板中也可以被访问,而且不需要从PHP中分配,只要通过{$smarty}保留变量就可以直接输出常量的值。在模板中输出常量的示例如下所示。
{$smarty.const._MY_CONST_VAL} {* 在模板中输出在PHP脚本中用户自定义的常量 *} {$smarty.const.__FILE__} {* 在模板中通过保留变量数组直接输出系统常量 *}
在模板中的变量不能为其重新赋值,但是可以参与数学运算,只要在PHP脚本中可以执行的数学运算都可以直接应用到模板中。使用的示例如下所示。
{$foo+1} {* 在模板中将PHP中分配的变量加1 *} {$foo*$bar} {* 将两个PHP中分配的变量在模板中相乘 *} {$foo->bar-$bar[1]*$baz->foo->bar()-3*7} {* PHP中分配的复合类型变量也可以参与计算 *} {if ($foo+$bar.test%$baz*134232+10+$b+10)} {* 可以将模板中的数学运算在程序逻辑中应用 *}
另外,在Smarty模板中可以识别嵌入在双引号中的变量,只要此变量只包含数字、字母、下划线或中括号[]。对于其他的符号(句号、对象相关的等),此变量必须用两个反引号“`”(此符号和“~”在同一个键上)包住。使用的示例如下所示。
{func var="test $foo test"} {* 在双引号中嵌入标量类型的变量 *} {func var="test $foo[0] test"} {* 将索引数组嵌入到模板的双引号中 *} {func var="test $foo[bar] test"} {* 也可以将关联数组嵌入到模板的双引号中 *} {func var="test `$foo.bar` test"} {* 嵌入对象中的成员时将变量使用反引号包住*}
11.4.3 变量调节器
在PHP中提供了非常全面的处理文本函数,可以通过这些函数将文本修饰后,再调用Smarty对象中的assign()方法分配到模板中输出。而有时可能想在模板中直接对PHP分配的变量进行调节,Smarty开发人员在库中集成了一些这方面的特性,而且允许用户对其进行任意扩展。
在Smarty模板中使用变量调节器修饰变量,和在PHP中调用函数处理文本相似,只是Smarty中对变量修饰的语法不同。变量在模板中输出以前如果需要调节,可以在该变量后面跟一个竖线“|”,在后面使用调节的命令。而且对于同一个变量,可以使用多个修改器,它们将从左到右按照设定好的顺序被依次组合使用,使用时必须要用“|”字符作为它们之间的分隔符。语法如下所示。
{$var|modifier1|modifier2|modifier3|…} {* 在模板中的变量后面多个调节器组合使用的语法 *}
另外,变量调节器由赋予的参数值决定其行为,参数由冒号“:”分开,有的调节器命令有多个参数。使用变量调节器的命令和调用PHP函数有点儿相似,其实每个调节器命令都对应一个PHP函数。每个函数都占用一个文件,存放在和Smarty类库同一个目录下的plugins目录中。也可以按Smarty规则在该目录中添加自定义函数,对变量调节器的命令进行扩展。也可以按照自己的需求,修改原有的变量调节器命令对应的函数。在下面的示例中使用变量调节器命令truncate,将变量字符串截取为指定数量的字符,如下所示。
{$topic|truncate:40:"..."} {* 截取变量值的字符串长度为40,并在结尾使用"…"表示省略 *}
truncate函数默认截取字符串的长度为80个字符,但可以通过提供的第一个可选参数来改变截取的长度,例如,上例中指定截取的长度为40个字符。还可以指定一个字符串作为第二个可选参数的值,追加到截取后的字符串后面,如省略号(…)。此外,还可以通过第三个可选参数指定到达指定的字符数限制后立即截取,或是还需要考虑单词的边界,这个参数默认为false,则截取到达限制后的单词边界。
如果给数组变量应用单值变量的调节,结果是数组的每个值都被调节。如果只想要调节器用一个值调节整个数组,必须在调节器名字前加上@符号。例如:
{$articleTitle|@count}{*这将会在 $articleTitle 数组里输出元素的数目*}
下面用一个例子来看几个调节器的用法,模板内容如下。
<html> <head><title>smarty的模板调节器示例</title></head> <body> 1. 第一句首字母要大写:<tpl>$str1|capitalize</tpl><br> 2. 第二句模板变量 +张三:<tpl>$str2|cat: 张三"</tpl><br> 3. 第三句输出当前日期:<tpl>$str3|date_format:"%Y年%m月%d日"</tpl><br> 4. 第四句.php程序中不处理,它显示默认值:<tpl>$str4|default:"没有值!"</tpl><br> 5. 第五句要让它缩进8个空白字母位,并使用"*"取替这8个空白字符:<br><tpl>$str5| indent:8:"*"</tpl><br> 6. 第六句把JaDDy@oNCePlAY.CoM全部变为小写:<tpl>$str6|lower</tpl><br> 7. 第七句把变量中的teacherzhang替换成:张三:<tpl>$str7|replace: "teacherzhang":"张三"</tpl><br> 8. 第八句为组合使用变量修改器:<tpl>$str8|capitalize|cat:"这里是新加的时间: "|date_format:"%Y年%m月%d日"|lower</tpl> </body> </html>
然后设计PHP脚本:
<?php require_once ("./lib/smarty/Smarty.class.php"); //包含smarty类文件 $smarty = new Smarty(); //建立smarty实例对象$smarty $smarty->template_dir = "./templates"; //设置模板目录 $smarty->compile_dir = "./templates_c"; //设置编译目录 //---------------------------------------------------- //左右边界符,默认为{},但实际应用当中容易与JavaScript相冲突,所以建议设成其他。 //---------------------------------------------------- $smarty->left_delimiter = "<tpl>"; $smarty->right_delimiter = "</tpl>"; $smarty->assign("str1", "my name is zhangsan."); //将str1替换成My Name Is Zhangsan. $smarty->assign("str2", "我的名字叫:"); //输出: 我的名字叫:张三 $smarty->assign("str3", "公元"); //输出公元2010年5月6日(我的当前时间) //$smarty->assign("str4", ""); //第四句不处理时会显示默认值,如果使用前面这一句则替换为"" $smarty->assign("str5", "前边8个*"); //第五句输出:********前边8个* $smarty->assign("str6", "JaDDy@oNCePlAY.CoM"); //这里将输出jaddy@onceplay.com $smarty->assign("str7", "this is teacherzhang"); //在模板中显示为:this is 张三 $smarty->assign("str8", "HERE IS COMBINING:"); //编译并显示位于./templates下的index.html模板 $smarty->display("index.html"); ?>
最后输出:
<html> <head><title>smarty的模板调节器示例</title></head> <body> 1. 第一句首字母要大写:My Name Is Zhangsan.<br> 2. 第二句模板变量 + 张三:我的名字叫:张三<br> 3. 第三句输出当前日期:公元2010年5月6日<br> 4. 第四句.php程序中不处理,它显示默认值:没有值!<br> 5.第五句要让它缩进8个空白字母位,并使用"*"取替这8个空白字符:<br>********前边8 个*<br> 6. 第六句把JaDDy@oNCePlAY.CoM全部变为小写:jaddy@onceplay.com<br> 7. 第七句把变量中的teacherzhang替换成:张三:this is 张三<br> 8. 第八句为组合使用变量修改器:Here is Combining:这里是新加的时间:2004年5月6日 </body> </html>
Smarty模板中常用的变量调节函数如表11-2所示。
成员方法名 | 描述 |
capitalize | 将变量里的所有单词首字母大写,参数值boolean型决定带数字的单词是否首字大写,默认不大写 |
count_characters | 计算变量值里的字符个数,参数值boolean型决定是否计算空格数,默认不计算空格 |
cat | 将cat里的参数值连接到给定的变量后面,默认为空 |
count_paragraphs | 计算变量里的段落数量 |
count_sentences | 计算变量里句子的数量 |
count_words | 计算变量里的词数 |
date_format | 日期格式化,第一个参数控制日期格式,如果传给date_format的数据是空的,将使用第二个参数作为默认时间 |
default | 为空变量设置一个默认值,当变量为空或者未分配时,由给定的默认值替代输出 |
escape | 用于HTML转码、URL转码,在没有转码的变量上转换单引号、十六进制转码、十六进制美化,或者JavaScript转码。默认是HTML转码 |
indent | 在每行缩进字符串,第一个参数指定缩进多少个字符,默认是4个字符;第二个参数,指定缩进用什么字符代替 |
lower | 将变量字符串小写 |
nl2br | 所有的换行符将被替换成 。功能同PHP中的nl2br()函数一样 |
regex_replace | 寻找和替换正则表达式,必须有两个参数,参数1是替换正则表达式,参数2指定使用什么文本字串来替换 |
replace | 简单的搜索和替换字符串,必须有两个参数,参数1是将被替换的字符串,参数2是用来替换的文本 |
spacify | 在字符串的每个字符之间插入空格或者其他的字符串,参数表示将在两个字符之间插入的字符串,默认为一个空格 |
string_format | 是一种格式化浮点数的方法,例如十进制数,使用sprintf语法格式化。参数是必需的,规定使用的格式化方式。%d表示显示整数,%.2f表示截取两个浮点数 |
strip | 替换所有重复的空格,换行和Tab为单个或者指定的字符串。如果有参数则是指定的字符串 |
strip_tags | 去除所有HTML标签 |
truncate | 从字符串开始处截取某长度的字符,默认是80个 |
upper | 将变量改为大写 |
wordwrap | 可以指定段落的宽度(也就是多少个字符一行,超过这个字符数换行),默认80。第二个参数可选,可以指定在约束点使用什么字符(默认是换行符\n)。默认情况下smarty将截取到词尾,如果想精确到设定长度的字符,请将第三个参数设为true |
下面分别以实例介绍。
1.capitalize
将变量里的所有单词首字大写。
2.count_characters
字符计数。
示例如下:
//PHP程序 $smarty->assign('articleTitle', 'A B C'); //模板内容 {$articleTitle}<Br> {$articleTitle|count_characters}<Br> {$articleTitle|count_characters:true} //决定是否计算空格字符。是 //最后输出: A B C 3 5
3.cat
连接字符串,将cat里的值连接到给定的变量后面。
//PHP程序 $smarty->assign('articleTitle', "hello"); //模板内容: {$articleTitle|cat:"kevin"} //最后输出: hello kevin
4.date_format
格式化从函数strftime()获得的时间和日期,UNIX或者MySQL等的时间戳记都可以传递到Smarty,设计者可以使用date_format完全控制日期格式,如果传给date_format的数据是空的,将使用第二个参数作为时间格式。
示例如下。
//PHP程序 $smarty->assign('yesterday', strtotime('-1 day')); //模板内容 {$smarty.now|date_format}<Br> {$smarty.now|date_format:"%A, %B %e, %Y"}<Br> {$smarty.now|date_format:"%H:%M:%S"}<Br> {$yesterday|date_format}<Br> {$yesterday|date_format:"%A, %B %e, %Y"}<Br> {$yesterday|date_format:"%H:%M:%S"} 最后输出: Feb 6, 2011 Tuesday, February 6, 2011 14:33:00 Feb 5, 2011 Monday, February 5, 2011 14:33:00
5.default
为空变量设置一个默认值,当变量为空或者未分配的时候,将由给定的默认值替代输出。
//PHP程序 $smarty->assign('articleTitle', 'A'); //模板内容 {$articleTitle|default:"no title"} {$myTitle|default:"no title"} 最后输出: A no title
6.escape
用于HTML转码,URL转码,在没有转码的变量上转换单引号,十六进制转码,十六进制美化,或者JavaScript转码。默认是HTML转码。
7.indent
在每行缩进字符串,默认是4个字符。作为可选参数,可以指定缩进字符数,作为第二个可选参数,可以指定缩进用什么字符代替。注意:使用缩进时如果是在HTML中,则需要使用 (空格)来代替缩进,否则没有效果。
8.lower
将变量字符串小写。
9.nl2br
换行符替换成<br />,所有的换行符将被替换成<br />,功能同PHP中的nl2br()函数一样。
10.regex_replace
寻找和替换正则表达式,欲使用其语法,请参考PHP手册中的preg_replace()函数。示例如下:
//PHP程序 $smarty->assign('articleTitle', "A\nB"); //模板内容 {* replace each carriage return, tab & new line with a space *}{* 使用空格 替换每个回车,tab,和换行符 *} {$articleTitle}<Br> {$articleTitle|regex_replace:"/[\r\t\n]/":" "} //结果输出 A B A B
11.replace
简单地搜索和替换字符串。
//PHP程序 $smarty->assign('articleTitle', "ABCD"); //模板内容 {$articleTitle}<Br> {$articleTitle|replace:"D":"E"} //最后输出 ABCD ABCE
12.spacify
字符串的每个字符之间插入空格或者其他的字符(串)。示例如下。
//PHP程序 $smarty->assign('articleTitle', 'Something'); //模板内容 {$articleTitle}<Br> {$articleTitle|spacify}<Br> {$articleTitle|spacify:"^^"} //结果输出: Something Went Wrong in Jet Crash, Experts Say. S o m e t h i n g S^^o^^m^^e^^t^^h^^i^^n^^g
13.string_format
是一种格式化字符串的方法,例如格式化为十进制数等。示例如下。
//PHP程序 $smarty->assign('number', 23.5787446); //模板内容 {$number}<Br> {$number|string_format:"%.2f"}<Br> {$number|string_format:"%d"} //结果输出 23.5787446 23.58 24