4、Smarty语法基础篇 4.1 变量 模板中的变量主要来源有三种。 1、是由原php文件中分配过来的。 $smarty->assign(‘name’,’韩灵稚’); #在源php文件中分配 <span>你好, {$name}</span> #在模板文件中使用 2、是由配置文件中分配过来的。 $smarty->configLoad(“configs/my.conf”) #在源php文件中载入配置文件,也可以在模板中载入 <span style=”color:{#fontcolor#}; font-size:{#fontsize#};”>这是{#gv#}</span><br /> #在模板文件中使用 3、是在模板文件中创建的。 {assign var=”name” value=”韩灵稚” nocache=”false”scope=”global”} #在模板中定义的变量,如果之前定义了相同的变量,则以最后一次定义为准。 {$name=”韩灵稚”} #给变量直接赋值,如果该变量原来不存在,自动创建,3.0新特性。 {assign var=foo value=[1,2,3]} #定义普通数组变量 {assign var=foo value=['y'=>'yellow','b'=>'blue']} #定义关联数组 {assign var=foo value=[1,[9,8],3]} #定义数组中的数组 {$foo[]=1} #增加变量数组$foo的一个元素 <span>你好, {$name}</span> #在模板文件中使用 【相关函数】 $smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true) #获得变量,仅限于获得第一种方式的变量 $smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true) #获得变量,可以获得第一种和第三种方式的变量(第三种方式变量scope必须为global或者parent), 如果想获得配置变量参看3.4
4.2 Smarty保留变量 Smarty系统中保留了一些内置变量,可以快速访问相应的变量。但是不能再源php中获得这些变量。 1、请求访问变量(Request variables) $smarty.get.变量 #显示通过get方式传过来的指定变量的值。 $smarty.post.变量 #显示通过post方式传过来的指定变量的值。 $smarty.cookies.变量 #显示通过cookie中指定变量的值。 $smarty.server.SERVER_NAME #显示server变量值,phpinfo()中$_SERVER系列变量 $smarty.env.PATH #显示系统环境变量值,phpinfo()中$_ENV系列变量 $smarty.session.变量 #显示session中指定变量的值 $smarty.request.变量 #显示通过post、get、cookie中指定变量的值。 2、时间访问变量 {$smarty.now} #显示unix系统时间戳,需要变量调节器格式化,参看4.2.4,也可以使使用{time()} 3、常量访问变量 {$smarty.const._MY_CONST_VAL} #访问php中的常量包括自定义常量和系统常量 4、{$smarty.capture}
参看4.4.1 5、配置访问变量 {$smarty.config.配置变量} #访问配置变量,等同于 #配置变量# 方式 6、{$smarty.section}, {$smarty.foreach} 参看4.4.3和4.4.4 7、{$smarty.template} #显示模板路径和名称 4.3 变量操作 4.2.1赋值 {$name = 新值} 比如,{$name=”我的名字叫韩灵稚”} #新值将替代原值,如果原来无该变量, 则创建变量并赋值。配置变量无法重新赋值。 {$name = 表达式} 比如,{$name = 1+2+$foo['bar']} #$foo['bar']的值为1, 变量值为4 {$foo['bar']=1} #给数组的一个元素赋值 {$foo['bar']['blar']=1} #给多维数组的一个元素赋值 {$foo = array(1,2,3,4,5)} #利用php函数创建变量$foo,并赋值。 4.2.2访问 最简单的访问方法是 {$var},配置变量访问是{#configvar#} 数组变量的访问可以是{$array[1][1]},也可以支持{$array.1.1} 对象的访问{$object->method1($x)},也支持对象链,{$object->method1($x)->method2($y)} 字符串与变量的混合输出 {“大家好,我是$name<br />”} #Smarty可以识别嵌入在双引号中的变量, 只要此变量只包含数字、字母、下划线。 {“大家好,我是`$name[$obj->a]`<br />”} #中括号[]、句号. 对象相关 -> ,必须将变量用两个`符号括起。 4.2.3变量名变量 与php相同,都支持在变量名称中使用变量,smarty还支持使用表达式。 $foo #一个普通的变量 $foo_{$bar} #变量名中包含变量 $foo_{$x+$y} #变量名中可以支持表达式 $foo_{$bar}_buh_{$blar} #变量名包含多个变量 4.2.4变量调节器 变量调节器主要是对变量进行格式化。 {$var|capitalize} #将变量首字大写 {$var|count_characters:false} #计算变量里的字符数,false为不计算空格。 若变量为数值则为数字和小数点等其他运算符的总和 {$var| cat:var2} #将var2连接到var,若为数值以字符串处理。 {$var| count_paragraphs} #计算变量里的段落数量,已“/n“区分 {$var| count_sentences} #计算变量中句子的数量,不好使 {$var| count_words} #计算变量中单词的数量 已非字母和数字的字符分割统计 {$var| date_format :”%H:%M:%S” } #格式化变量日起,具体参数看chm文档 {$var| default:”no title” } #当变量为空时,为变量提供一个默认值 {$var| escape:url} #对变量值进行转码,具体参数看chm文档 {$var| indent:10:”*”} #对变量指定具体字符进行缩进,若为空格在html中不会显示出来,具体参数看chm文档 {$var| lower} #将变量小写 {$var| nl2br } #将变量中的“/n“转换成”<br />“ {$var| regex_replace:”/[/r/t/n]/”:” “} #将变量中的符合正则的内容替换成指定内容 {$var| replace:”Garden”:”Vineyard”} #将变量中要求的内容替换成指定内容 {$var| spacify:”^^”} #将变量字符与字符之间插入指定内容,包括空格 {$var|string_format:”%d”} #将变量中的内容格式化,格式化参数同printf {$var| strip: “*”} #用一个空格或一个给定字符替换所有重复空格,换行和制表符 {$var| strip_tags} #删除变量中的html标记, 去除<和>标签,包括在<和>之间的任何内容 {$var| truncate:30:”…”:true} #截取变量的到规定的长度,具体参数看chm文档 {$var| upper} #将变量大写
{$var| wordwrap:30:”/n”:true} #规定指定的长度强制换行,具体参数看chm文档 修改器可以复合组合。 {$articleTitle|lower|spacify|truncate:30:”. . .”} 设置默认变量调节器 $smarty->getDefault_modifiers() #默认为空数组 $smarty->setDefault_modifiers(array(‘spacify:”^^”’,’capitalize’) #设置变量的默认调节器,必须用array {name} #模板变量name自动加入上面两个调节器 同时也可以定义自己的调节器,详情请参考6.7.4和6.8.4 4.2.5变量作用域(未写) 4.4 内建函数 4.4.1 capture capture函数的作用是捕获模板输出的数据并将其存储到一个变量里,而不是把它们输出到页面. 任何在 {capture name=”foo”}和{/capture}之间的数据将被存储到变量$foo中。 这样可以根据实际情况,选择性的输出一些内容,输出的语法是$smarty.capture.变量。 {capture name=”bottom”} {include file=”bottom.tpl” nr=”这是底部的内容”} {/Capture} {if true } #进行条件判断,确定是否输出 {$smarty.capture.bottom} {/if} 4.4.2 config_load 参看3.4 4.4.3 foreach,foreachelse foreach 适合于简单数组(元素类型相同) {foreach name=名称 item=内容 key=键 from=数组} #2.0中的用法,3.0沿用 正常执行
{foreachelse} From变量数组没有值时(0个元素)执行。 {/foreach} 例子: {foreach name=for1 item=num from=$foo} {$smarty.foreach.for1.index+1}个元素:{$num}<br /> {if is_array($num)} {foreach name=for2 item=num2 key=key2 from=$num} {$str|cat:$smarty.foreach.for2.index+1|cat:”个元素:”|cat:$num2|cat:” key是”|cat:$key2|indent:1:”.”}<br /> {/foreach} {/if} {foreachelse} {$smarty.foreach.for1.index+1}个元素:没有值!<br /> {/foreach} foreach的内置变量 $smarty.foreach.foreachname.index #(循环内部使用)显示当前循环的索引,如果数组为空,返回-1 $smarty.foreach.foreachname. iteration #(循环内部使用)显示当前的循环次数 $smarty.foreach.foreachname.first #(循环内部使用)如果为第一次循环,返回true $smarty.foreach.foreachname.last #(循环内部使用)如果为最后一次循环,返回true $smarty.foreach.foreachname.total #(循环内外部使用)显示循环的总次数 foreach 在3.0中做一定的升级,语法更接近于php,内置变量也更简洁。 {foreach $myarray as $var}…{/foreach} foreach的内置变量,均可在内外部使用 $var@key #输出元素的键值,简单为012,关联为具体键值。 $var@iteration #显示当前的循环次数,外部使用为最后一次 $var@index #显示当前循环的索引,如果数组为空,返回-1,外部使用为最后一次 $var@total #显示循环的总次数 $var@first #如果为第一次循环,返回true $var@last #如果为最后一次循环,返回true
4.4.4 section,sectionelse section适用于复杂的数组操作,不适合关联数组。但是在3.0中并为对他做什么升级和修改, 而是直接推出了for命令,for更接近于php语法。可以预见,section将在未来版本中淘汰。 {section name=名称 loop=循环数组(次数) start=开始(0) step=步阶(1) max=最大循环次数 show=是否显示(true)} #2.0中的用法,3.0沿用 正常执行 {sectionelse} loop数组没有值时(0个元素)执行。 {/section } 例子: {section name=sec1 loop=$foo step=1 start=0 show=true} 第{$smarty.section.sec1.index+1}个元素:{$foo[sec1]} 循环次数是 {$smarty.section.sec1.iteration}<br /> {if is_array($foo[sec1])} {section name=sec2 loop=$foo[sec1] step=1 start=0 show=true} 第{$smarty.section.sec2.index+1}个元素:{$foo[sec1][sec2]} 循环次数是{$smarty.section.sec2.iteration}<br /> {/section} {/if} {sectionelse} {$smarty.section.sec1.index}个元素:没有值!<br /> {/section} Section的内置变量与foreach 相同。
4.4.5 include {include file=”包含文件” var=”自定义传入包含文件的变量”assign=” 指定一个变量保存待包含模板的输出”} 如果规定了assign ,则包含文件不会马上输出,模板输出的数据将存储到assign指定的变量里, 这样可以根据实际情况,再输出包含文件的内容。原理类似于capture。
4.4.6 include_php {include_php file=”包含文件” once=”是否指包含一次(true)”assign=” 指定一个变量保存待包含的输出”} 包含php文件,包含的文件正常编译,并提供输出。如果规定了assign , 则包含文件不会马上输出,输出的数据将存储到assign指定的变量里, 这样可以根据实际情况,再输出包含文件的内容。
4.4.7 insert Insert最大的特点是不缓存。他的参数可能会缓存。但是insert所调用的函数内部不缓存。 {insert name=”函数名称” script=”包含函数的脚本”var….=”函数参数” assign=” 指定一个变量保存调用的输出”} Insert调用的函数有特别的规定,函数格式必须是“smarty_insert_函数名称($params,&$smarty)”, 从insert传入的参数,会统一放到数组变量中,参数名为该数组的键值。
例子: {insert name=”maxnum” script=”s2.php” x=12 y=13 assign=nn} #模板文件,script为保存调用函数的脚本 {foreach $nn as $n} {$n} {/foreach} function smarty_insert_maxnum($arr) #函数脚本文件 { return $arr['x']>$arr['y']?$arr['x']:$arr['y']; } 如果规定了assign ,则调用函数的记过不会马上输出,输出的数据将存储到assign指定的变量里, 这样可以根据实际情况,再输出包含文件的内容。 Insert也可以定义成组件,写入组件库中,详情请参考6.8.5
4.4.8 if,elseif,else {if $name eq “Fred”} Welcome Sir. {elseif $name eq “Wilma”} Welcome Ma’am. {else} Welcome, whatever you are. {/if} 这个没有什么太好说的。比较操作符可以是 “==、>=”等,也可以是”eq、ne”等,这个看手册吧。
4.4.9 ldelim,rdelim 这个也很简单,分别替换smarty当前规定的左边界符和右边界符。一般成对使用。
4.4.10 literal Literal 标签区域内的数据将被当作文本处理,此时模板将忽略其内部的所有字符信息。 该特性用于显示有可能包含大括号等字符信息的 js、css 。当这些信息处于 {literal}{/literal} 标签中时, 模板引擎将不分析它们,而直接显示。
4.4.11 strip Smarty 在显示前将除去任何位于 {strip}{/strip} 标记中数据的首尾空格和回车。
4.4.12 php php 标签允许在模板中直接嵌入 php 脚本。 {php}标签默认是关闭的,可以通过如下方式打开 $smarty->setAllow_php_tag(true) #设置开启识别php的标签 $smarty->getAllow_php_tag() #获得当前对{php}的支持状态
4.4.13 for,while 这是3.0新增的函数。语法类似于php,这两个函数都不适合关联数组 {for $x=0, $y=count($foo); $x<$y; $x++} …. {/for} {for $x=0 to count($foo)-1 step 1} 第二种方法,支持for的内置变量。第一种不支持。 $x@iteration #当前循环次数 $x@total #总循环次数 $x@first #循环第一次 $x@last #循环最后一次 {while true}….{/while} While没有内置变量。 |