3.Smarty3:基本语法

来源:互联网 发布:网络使用公约 编辑:程序博客网 时间:2024/05/22 00:18

smarty模版中的使用的语法大致为两种:1.变量 2.函数。一般来说好的做法时最低限度地使用模版语法,将其专注于表现外在的内容。如果语法太过于复杂,则最好将与外在表现无关的后台处理通过插件或调节器交给PHP处理。说明一下:以下每个实例我使用的定界符为<{}>.


1. 模版注释

包围在定界标记”{” 和 “}”之间的都是注释内容,可以包括一行或多行。与html中的”<–! HTML注释–>”不同,
smarty注释内容不会出现在用户浏览页面的源代码中看到,因此推荐在使用smarty模版时采用Samrty注释方式。

<{*这里是注释内容*}>

2. 模版中的变量应用

不管是什么类型的变量,通通由assign()方法来赋给模版。但是注意,在Samrty模版中的变量预设是全局的,也就是说分配一次就够了,如果分配多次则以最后分配为主进行覆盖

2.1 在PHP中使用一些复杂变量

Smarty3中引入了PHP原生风格访问关联数组,既可以通过$arr[‘name’]也可以通过$arr.name访问

以下为实例说明
testSmarty.php

<?phpinclude '../Smarty/Smarty.class.php';$smarty = new Smarty();$smarty->left_delimiter='<{';$smarty->right_delimiter='}>';$arr1 = array('中国','英国','美国');$arr2 = array('china'=>'中国','uk'=>'英国','us'=>'美国');$arr3 = array('china'=>array('北京','上海','广州'),'uk','us'=>'美国');$arr4 = array('china'=>'中国','英国','us'=>'美国');$smarty->assign('str','常智');//字符串$smarty->assign('int' , 1432);//整型$smarty->assign('float',12.3);//浮点型$smarty->assign('bool_true',true);//boolean型$smarty->assign('bool_false',false);//boolean false型$smarty->assign('arr1',$arr1);$smarty->assign('arr2',$arr2);$smarty->assign('arr3',$arr3);$smarty->assign('arr4',$arr4);$smarty->assign('arr5',$arr5);$smarty->display('testSmarty.html');

testSamrty.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Samrty变量使用</title></head><body><hr/><h4>-------------字符串---------------</h4><p><{$str}></p><hr/><h4>-------------整型---------------</h4><p><{$int}></p><hr/><h4>-------------浮点型---------------</h4><p><{$float}></p><hr/><h4>-------------bool型---------------</h4><p>true:<{$bool_true}> false:<{$bool_false}></p><hr/><h4>-------------一维索引数组---------------</h4><p><{$arr1[0]}> || <{$arr1[2]}></p><hr/><h4>-------------一维关联数组---------------</h4><p><{$arr2.china}> || <{$arr2['uk']}>||</p><hr/><h4>-------------二维数组中一维数组元素为索引数组的---------------</h4><p><{$arr3.china[0]}> ||<{$arr3['china'][1]}> </p><hr/><h4>-------------既有关联又有索引的一维数组---------------</h4><p><{$arr4.china}> || <{$arr4[0]}></p><hr/><h4>-------------二维数组 Smarty3 foreach的使用----------</h4><{*smarty3 foreach新用法*}><{foreach $arr2 as $k => $v}>    <p>key=<{$k}>||value=<{$v}></p><{/foreach}><h4>-------------二维数组 旧foreach的使用,不建议使用---------</h4><{foreach from = $arr2 item=v key=k}>    <p>key=<{$k}>||value=<{$v}></p><{/foreach}></body></html>

2.2 在模版中应用表达式

smarty3几乎在所有地方都支持表达式,如果安全策略允许,表达式中可以包含PHP函数,对象方法及属性

{$x+$y}{$foo = strlen($bar)}{assign var =foo value=$x+$y}{$foo = myfunct(($x+$y)*3)}{$foo[$x+3]}

2.3 在双引号中嵌入变量

在smarty模版中可以识别嵌入双引号中的变量,只要此变量只包含数字、字母、下划线或中括号[].**对于其他符号(句号,对象相关的等),此变量必须使用两个反引号”`”包住。
另外在Smarty3中。Samrty的标签可以作为其他标签的值,并且Samrty的标签还可以在双引号中使用,PHP的函数也可以在双引号中使用**。

{func var="test $foo test"} {*在双引号中嵌入标量类型的变量*}{func var="test $foo[0] test"}{*索引数组嵌入*}{func var="test $foo['var'] test"}{*关联数组嵌入*}{func var="test `$foo.bar` test"}{*嵌入对象中的成员时将变量用反引号包住*}{$foo={counter}+3} {*smarty标签也可以作为其他标签的值*}{$foo="this is message {counter}"} {*smarty标签也可以在双引号中使用*}{$func var="variable foo is {if !$foo} not {/if} defined"}{*smarty的块标签也可以在双引号中使用*}{$func var="time is {time()}"}{* PHP 函数执行结果在双引号中使用*}

2.4 smarty模版中的可变变量

在smarty3中又新增了PHP可变变量的机制。即模版变量名可以是一个表达式

$foo_{$bar}$foo_{$x+$y}$foo_{$bar}_buh_{$blar}

3. 模版中函数的应用

在模版中直接调用函数的方式和在PHP调用形式一样,但是不推荐使用。
在模版里分为Smarty内置函数和自定义函数两种,内置函数在Smarty内部工作,不能修改,自定义函数通过插件机制起作用,可以修改。Smarty中常用的函数分为:函数、块函数、变量调节器,详解后面的博客会讲到

3.1 函数

Smarty的函数使用和HTML独立元素标签非常相似,当然这是专门为了方便美工了。

{*html标签格式*}<input type="text" name="username" value="admin">{*samrty函数格式,确实和html标签的使用一样*}{funcname attr1="var1" attr2="val2" attr3="val3"}{config_load file="colors.conf"}

3.2 块函数

相当于html的闭合标签元素,在执行时会将块中的内容回传到该函数中,并结合属性处理和输出。后面提到的自定义块函数时会更加清楚。

{*内置块函数nocache和if的使用*}{nocache}    {$smarty.now|date_format}{/nocache}{if $bool}    It's true;{else}    It's false;{/if}

3.3 属性

Smarty函数的属性和html标签的属性很像。静态数值不需要加引号,但是字符串建议使用引号。可以使用普通smarty变量,也可以使用带变量调节器的变量作为属性值。它们也不用加引号。甚至可以使用PHP函数返回值和复杂表达式作为属性值,它们也不需要加引号。

{include file="header.tpl" nocache} {*使用boolean属性,nocache=true*}{include file=$includeFile}{*使用变量作为属性值*}{include file=#includeFile# title="My Title"}{*配置文件中的变量作为属性值*}{assign var=foo value={counter}}{*使用smarty函数结果作为属性值*}{assign var=foo value=substr($bar,2,5)}{*使用PHP函数结果作为属性值*}{assign var=foo value=$bar|strlen}{*使用变量调节器处理的结果作为属性值*}{assign var = foo value=$buh+$bar|strlen}{*使用复制的表达式作为属性值*}<select name="company_id">{html_options options=$companies selected = $company_id}{*使用数组作为属性值*}</select>

4. 忽略Samrty解析

忽略Smarty解析很有必要,由于JavaScript和css代码使用了Smarty默认定界符一样的”{“和”}”符号。当然避免出现这种情况的好习惯是把JavaScript/CSS代码分离出来保存为独立的文件。再由HTML代码链接引入。这样做也有助于浏览器缓存脚本。当然如果要把Samrty变量、方法嵌入到JavaScript/CSS中,可以通过一下三种方法。

  1. 在smarty3中,如果使用”{“和”}”大括号里面包含有空格,那么整个{}内容将会被忽略。不过可以通过设置Smarty类属性$auto_literal=false;来取消这种规则.

    • 可以修改定界符’{‘和’}’
        $smarty->left_delimiter="<{";    $smarty->right_delimiter="}>";
    • Smarty 内置的{literal}…{/literal}块函数,块中的内容可以被忽略使用模版语法解析。也可以使用{ldelim},{rdelim}标签或者{$smarty.ldelim}和{$smarty.rdelim}变量来忽略个别大括号.例如:
<script>//以下大括号的内容会被Smarty忽略,因为它们里面有空格function myfun(){    alert("smarty");}//由于使用{literal}..{/literal}块函数,下面内容会保持原义输出{literal}function fun2(){alert("smarty")};{/literal}</script>
0 0