文章教程

11.4Smarty模板变量

9/17/2020 9:49:37 PM 人评论 次浏览

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所示。

表11-2 Smarty常用变量调节函数列表

成员方法名 描述
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中,则需要使用&nbsp;(空格)来代替缩进,否则没有效果。

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

教程类别