smarty3中对内置函数的修改比較大,加入了很多新的功能:变量声明。表达式,流程控制,函数。数组等。可是建议不要在模版中去使用过于复杂的逻辑,而是要尽量将一些程序设计逻辑写到PHP中,并在模版中採用很easy的语法就可以调用。通常仅仅在模版中进行一些如变量输出,流程推断及数组遍历等操作就可以。


1. 变量声明

在模版中声明变量或用来在模版运行时为模版变量赋值,这是在Smarty3中新增的功能。

使用{assign},在模版运行时为模版变量或数组元素赋值 和在赋值时使用一些表达式

{$var=...}{assign}的简写版。当中有三个属性(var,value和scope)和一个选项标签(nocache),当中var和value为必须属性,分别用来设置要分配的值的变量名和分配的值。scope可选,指定分配的变量范围,能够指定parent,root和global三个值。

用来设定变量的有效范围。

1.1 使用方法例如以下:

  1. {assign var='name' value='brophp'} {*为变量$name赋值上brophp的值*}
  2. {assign "name" "brophp"} {*这是assign函数属性的简写*}
  3. {$name='brophp'} {*assign函数的简写*}
  4. {*定义数组*}
  5. {assign var=foo value=[1,2,3]} {*为变量$foo赋上一个索引数组值*}
  6. {assign var=foo value=['y'=>'yellow','b'=>'blue']} {*为变量$foo赋上一个关联数组值*}
  7. {assign var=foo value=[1,[1,3],4]} {*嵌套声明多维数组*}
  8. {assign var=foo value=$x+$y} {*能够在属性中使用变量*}
  9. {assign var="foo" value="`$foo+$bar`"} {*能够在属性值的字符串中使用变量及表达式*}
  10. {*短变量分配*}
  11. {$foo = $bar+2} {*短变量分配置值的方式*}
  12. {$foo = strlen($bar)} {*PHP函数在变量值中使用*}
  13. {$foo = myfunct($x+$y)*3} {*作为函数參数*}
  14. {$foo.bar=1} {*数组元素的赋值*}
  15. {$foo.bar.baz=1} {*多维数组元素的赋值*}
  16. {$foo[]=1} {*为数组加入新元素*}
  17. {$foo[$x+3]} {*变量作为数组索引*}
  18. {$foo={counter}+3} {*在标签里嵌套标签*}
  19. {$foo="this is message {counter}"} {*在引號里使用标签*}

1.2 參数scope使用方法

在加载模版中可见被加载模版(即为include进来)的分配变量。在声明变量时能够通过加入scope属性,并通过三个值来为调用的模版指定变量范围。

比如:

  1. {*bar仅仅能在加载模版中常见*}
  2. {assign var="bar" value="value"}
  3. {*用了scope=parent,能够在自己和加载它的模版中可见*}
  4. {assign var="foo" value="something" scope=parent}
  5. {*全局变量在全部模版中可见*}
  6. {assign var=foo value="bar" scope="global"}
  7. {*能够在当前树形结构的"根"中赋值i一个变量。该变量可在全部使用该树形结构的模版中可见*}
  8. {assign var=foo value="bar" scope="root"}

1.3 append使用方法

能够使用smarty的内置{append}函数。在模版运行期间建立或追加模版变量数组。

  1. {append var='name' value='Tom'} {*相似于$name[]='Tom'*}
  2. {append var='name' value='Bob' index='first'} {*相似于$name.first='Bob*}
  3. {append var='name' value='Meyer' index='last' scope='parent'} {*相似于$name.last='Meyer*}

2. 流程控制

在smarty3中新增了{for}{while}两个内置函数

2.1 在smarty模版中使用{if}函数处理分支结构

要尽量去使用备用词来取代条件修饰符,这样能够避免在模版中使用和HTML标记符号冲突。

Smarty模版中在使用这些修饰词时,它们必须和变量或常量用空格隔开。此外,在PHP标准代码中,必须把条件语句包围在小括号里,而在Smarty中小括号的使用则是可选的,括号主要是用来改变运算符号的优先级别。

一些常见的选择控制结构使用方法例如以下:

  1. {if $name eq 'Fred'}
  2. Welcome Sir.
  3. {elseif $name eq 'Wilma'}
  4. Welcome Ma'am.
  5. {else}
  6. Welcom,whatever you are.
  7. {/if}
  8. {if $name eq "Fred" or $name eq 'Wilma'}
  9. ...
  10. {/if}
  11. {if $name == 'Fred' || $name == 'Wilma'}
  12. ...
  13. {/if}
  14. {if $name=='Fred'||$name=='Wilma'} {*错误的语法,条件符号和变量要用空格隔开*}
  15. ...
  16. {/if}
  17. {if($amount < 0 or $amount > 1000) and $volume >= #minVolAmt#} {*同意使用圆括号*}
  18. ...
  19. {/if}
  20. {if count($var) gt 0} {*能够嵌入函数*}
  21. ...
  22. {/if}
  23. {if is_array($foo)} {*数组检查*}
  24. ...
  25. {/if}
  26. {if isset($foo)} {*是否为空值检查*}
  27. ...
  28. {/if}
  29. {if $var is even} {*測试值为偶数还是基数*}
  30. ...
  31. {/if}
  32. {if $var is odd}
  33. ...
  34. {/if}
  35. {if $var is not odd}
  36. ...
  37. {/if}
  38. {if $var is div by 4} {*測试var是否能被4整除*}
  39. ...
  40. {/if}
  41. {if $var is even by 2} {*測试发现var是偶数,2个为一组*}
  42. ...
  43. {/if}
  44. {if isset($name) && $name == 'Blog'} {*很多其它{if}样例*}
  45. {*do somthing*}
  46. {elseif $name == $foo}
  47. {* do somthing *}
  48. {/if}
  49. {if is_array($foo) && count($foo) > 0}
  50. {*do a foreach loop*}
  51. {/if}

2.2 在Smarty模版中使用{for}函数处理循环结构

和PHP中的for函数有所区别。在模版中使用{for},{forelse}标签创建一个简单的循环。{for}是一个块函数。须要使用{/for}结束。当循环无迭代时运行{forelse}.支持下面不同的格式。

  1. {for $var=$start to $end}...{/for} {*步长为1的简单循环*}
  2. {for $var=$start to $end step $step}...{/for} {*其它步长循环*}
  3. {for $var=$start to $end max=$val}...{/for} {*设置循环的最大次数*}

当中$var是在{for}函数中定义的一个索引变量。须要给一个初始值作为索引的開始,还须要通过’to’关键字指定一个索引结束的值或变量。

也能够通过”step”关键字设置循环的步长,以及通过max中属性设置最大的循环次数。常见的语法例如以下:

  1. <ul>
  2. {for $foo = 1 to 3} {*设置循环使用变量$foo从1到3。循环3次*}
  3. <li>{$foo}</li> {*循环体中的内容被输出3次。$foo的值分别为从1到3*}
  4. </ul> {*for循环的结束标记*}
  5. <ul>
  6. {$start=1}
  7. {$end=10}
  8. {for $foo=$start to $end step 2} {*通过step设置循环变量递增的步长,本例设置为2。每次循环递增两次*}
  9. <li>{$foo}</li>
  10. {/for}
  11. </ul>
  12. <ul>
  13. {for $foo=3 to 1}
  14. <li>{$foo}</li>
  15. {forelse}{*循环条件从3到1不成立,会运行forelse语句*}
  16. {forelse}
  17. <li>循环条件不成立</li>
  18. {/for}
  19. </ul>

2.3 在Smarty模版中使用{while}函数处理循环结构

也是一个块函数,和{if}相似,只是if语句条件成立循环一次。而while则循环多次

比如:

  1. {$foo = 10}
  2. {while $foo gt 0} {*假设变量$foo的值大于10就运行循环体的内容*}
  3. {$foo--}
  4. }
  5. {/while}

3. 声明和调用模版函数

除了能够通过插件机制为smarty模版扩充函数,在smarty3还能够直接使用内置函数{function}在模版中创建函数。能像调用插件函数一样调用它们

{function}标签必须包括模版函数名的name属性。该name标签名必须能够调用模版函数。

  1. {function name=menu} {*在模版中声明一个名称为Menu的函数*}
  2. 函数体
  3. }
  4. {/function}
  5. {function menu} {*同上,简写形式*}
  6. 函数体
  7. {/function}
  8. {menu} {*调用函数menu,和调用插件函数一样调用在模版中自己定义的函数*}

在调用函数时,能够通过加入属性为模版中声明的函数传递參数,而声明的函数中不用去接收,直接就能够以变量的形式訪问属性參数

  1. {function name=menu} {*在模版中声明的menu函数。并不用去接收參数传递的值*}
  2. <b>{$data}</b>
  3. <h1>{$style}</h1>
  4. {function}
  5. {menu data=$val style="list"}

能够声明默认的局部变量

  1. {function name=menu level=0 data=$num+1} {*在模版函数声明时,同一时候声明两个局部变量*}
  2. <b>{$data}</b>
  3. <b>{$level}</b>
  4. {/function}
  5. {menu level=55}

能够通过{call}函数来调用{function}标签定义的模版函数和插件函数

  1. {call name=menu data=$menu} {*调用函数menu,并传递一个data參数*}
  2. {call menu data=$menu} {*简写*}

4. 数组遍历

在Smarty3中。{foreach}函数的机制全部又一次改写。,格式和PHP中的foreach语法基本一样。而{section}的使用方法没有变化

{foreach}能够做{section}能做的全部事

4.1 在smarty模版中使用{foreach}函数遍历数组

{foreach $arrayvar as $itemvar}...{/foreach} 仅仅遍历数组变量$arrayvar中的值

{foreach $arrayvar as $keyvar=>$itemvar}...{/foreach} 遍历数组变量$arrayvar的下标和值

假设使用{foreachelse}从句。当数组变量无值时运行

{foreach} 属性说明

属性名 描写叙述
@index 包括当前数组的下表。開始时为0
@iteration 包括当前虚幻的迭代,总是以1開始,和index不同,每迭代一次值自己主动加1
@first 当{foreach}循环第一个时first为真
@last 当{foreach}迭代到最后时last为真
@show 用于检測{foreach}循环是否无数据显示,show为布尔值
@total 包括{foreach}循环的总数(整数),能够用在{foreach}里面或后面

当然smarty2中的$smarty.foreach.name.property语法仍然受支持

比如:testSmarty3.php

  1. <?php
  2. require_once '../Smarty/Smarty.class.php';
  3. $smarty = new Smarty;
  4. $smarty->left_delimiter="<{";
  5. $smarty->right_delimiter="}>";
  6. $arr1 = array('first'=>'Turing');
  7. $arr2 = array('china'=>'中国','英国','us'=>'美国','日本','法国','德国','俄罗斯');
  8. $arr3 = array('中国','英国','美国','日本','法国','德国','俄罗斯');
  9. $smarty->assign('nameList',$arr1);
  10. $smarty->assign('str','hahah');
  11. $smarty->assign('arr2',$arr2);
  12. $smarty->assign('arr3',$arr3);
  13. $smarty->display('testSmarty3.html');

testSmarty3.html

  1. <h2>foreach使用</h2>
  2. <h4>@iteration,@index,@first,@last,@total</h4>
  3. $arr2 = array('china'=>'中国','英国','us'=>'美国','日本','法国',
  4. '德国','俄罗斯','');
  5. <table border="1" cellspacing="0">
  6. <{foreach $arr2 as $k=>$v}>
  7. <{if $v@first}>
  8. <tr>
  9. <td>@iteration</td>
  10. <td>@index</td>
  11. <td>$k</td>
  12. <td>$v</td>
  13. </tr>
  14. <{/if}>
  15. <tr>
  16. <td><{$v@iteration}></td>
  17. <td><{$v@index}></td>
  18. <td><{$k}></td>
  19. <td><{$v}></td>
  20. </tr>
  21. <{if $v@last}>
  22. <tr><td colspan="4">总共循环<{$v@total}>次</td></tr>
  23. <{/if}>
  24. <{foreachelse}>
  25. $arr2为空
  26. <{/foreach}>
  27. <{if $v@show}>
  28. <tr>
  29. <td colspan="4">数据来源:最暖一天</td>
  30. </tr>
  31. <{/if}>
  32. </table>

4.2 在smarty模版中使用{section}函数遍历数组

{section}属性:

属性名 描写叙述 类型 默认值
name 指定该循环的名称,当须要section循环内输出变量时,必须在变量后加上中括号包括着name变量。为必要參数 字符串
loop 决定循环次数的变量名称。与数组变量同名。必要參数 数组变量
start 确定循环開始运行的索引位置.假设是负数,则从尾部算起,比如有七个元素,则start为-2时,是从数组索引为5開始算起,假设超过循环数组的限制,则会被自己主动调整为最接近的合法值 整型 1
step 决定了循环的步长,假设为负数,则从后向前遍历 整型 1
max 循环最大运行次数 整型 数组长度
show 决定是否显示该循环。能够使用这个參数进行调试 布尔类型 true

{section}仅仅能循环下标从0開始的索引数组。能够使用{sectionelse},当loop属性为空时输出该区域内容。

在section中通过例如以下方式调用循环中的变量:

$smarty.section.sectionname.varname

当中{$smarty.section}是Smarty的保留变量,sectionname即在section标记中指定的name属性值。而varname则是在section中被调用的特定变量名称。

section循环区域中能够调用的变量

变量名 描写叙述
index 用于显示当前循环的索引
index_prev 用于显示上一个循环索引值。循环開始时。此值为-1
index_next 用于显示下一个循环索引值。循环运行到最后一次时,此值仍然比当前索引值大1
iteration 显示当前循环次数
first 当前循环在第一次时为true
last 当前循环在最后一次时为false
rownum iteration别名
loop 用于显示该循环上一次循环时的索引值。该值能够用于循环内部或循环结束后
show true或false.假设设置为false,则该循环将不显示。假设指定了sectionelse子句。则该子句是否显示也取决于改值
total 显示循环总数。能够在循环中使用,也能够结束后使用

将上面{foreach}样例改写:

  1. <h2>section使用</h2>
  2. <h4>@iteration,@index,@first,@last,@total</h4>
  3. $arr3 = array('中国','英国','美国','日本','法国',
  4. '德国','俄罗斯','');
  5. <table border="1" cellspacing="0">
  6. <{section loop=$arr3 name='ls'}>
  7. <{if $smarty.section.ls.first}>
  8. <tr>
  9. <td>@iteration</td>
  10. <td>@index</td>
  11. <td>下标</td>
  12. <td></td>
  13. </tr>
  14. <{/if}>
  15. <tr>
  16. <td><{$smarty.section.ls.iteration}></td>
  17. <td><{$smarty.section.ls.index}></td>
  18. <td><{$smarty.section.ls.index}></td>
  19. <td><{$arr3[ls]}></td>
  20. </tr>
  21. <{if $smarty.section.ls.last}>
  22. <tr><td colspan="4">总共循环<{$smarty.section.ls.total}>次</td></tr>
  23. <{/if}>
  24. <{sectionelse}>
  25. $arr2为空
  26. <{/section}>
  27. <{if $smarty.section.ls.show}>
  28. <tr>
  29. <td colspan="4">数据来源:最暖一天</td>
  30. </tr>
  31. <{/if}>
  32. </table>

5. Smarty提供的其它内置函数

  1. {block},{nocache}将在后面的博客中提到。

    • smarty2中的{php}{include_php}在模版中插入PHP程序。和模版使用规则相违背,已经在Smarty3中弃用。

    • {strip},{literal},{ldelim},{rdelim}{insert}都有其它更好的方法取代,前面的博客已经部分提到

    • **{include}**

在多个模版中有同样的内容要输出。则能够将同样的部分在独立的模版中定义。然后在须要的模版中进行导入。在模版中使用{include}在档期看模版中包括其它模版,必须使用file属性指明模版资源位置。

比如:头部文件header.tpl和尾部文件爱你footer.tpl都是独立的模版文件,希望每一个模版中都导入这两个文件。则:

  1. {include file='header.tpl'} {*导入头部模版文件*}
  2. 这是当前模版中的主体内容部分
  3. {include file='footer.tpl'} {*导入尾部模版文件*}

include有两个比較有用的特性:

  1. 能够在{include}标记中传入可选的assign属性,将导入的子模版内容不在当前模版中输出,而是赋给由assign属性指定的变量



    {include file='header.tpl' assign="header"} {*模版header.tpl中的全部内容都赋给变量header*}

    • 能够在导入子模版的同一时候向其传递各种属性。

      以此方式传递给子模版的不论什么属性。仅仅能在被导入的文件里使用,不能用于模版的其它位置。假设传递的属性名在被包括模版中有同名变量,则该变量被传递的属性替代。

  1. {include file='header.tpl' title="main menu" table_bgcolor="#ccc"} {*在包括header.tpl时将这两个属性传递给它*}
  2. 这是当前模版文件里的主体部分
  3. {include file="footer.tpl" logo="logo.gif"}

8. Smarty3:模版中的内置函数的更多相关文章

  1. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  2. Python常用模块中常用内置函数的具体介绍

    Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...

  3. JavaScript中的内置函数

    JavaScript中的内置函数 制作人:全心全意 在使用JavaScript语言时,除了可以自定义函数之外,还可以使用JavaScript的内置函数,这些内置函数是由JavaScript语言自身提供 ...

  4. 转】SparkSQL中的内置函数

    原博文来自于: http://blog.csdn.net/u012297062/article/details/52207934    感谢! 使用Spark SQL中的内置函数对数据进行分析,Spa ...

  5. Kettle中JavaScript内置函数说明

    本文链接:https://blog.csdn.net/u010192145/article/details/102220563 我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到K ...

  6. oop(面向对象)中的内置函数

    oop中的内置函数 ​ 类中存在一些名字带有双下划线__开头的内置函数, 这些函数会在某些时候被自动调用,例如之前学习的迭代器__init__函数 一.isinstance(obj, cls) 检查o ...

  7. mysql中的内置函数

    这里主要介绍mysql丰富的内置函数. 数学函数 数学函数相对比较简单,就是涉及一些数值的计算,这里列出数学函数的功能,仅个别给出实例. 函数 作 用 ABX(x) 返回x的绝对值 CEIL(X),C ...

  8. python类中的内置函数

    __init__():__init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的初始化.注意,这个名称的开始和结尾都是双下划线.代码例子: #!/usr/bin/p ...

  9. day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()

    __str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...

随机推荐

  1. 剑指Offer(书):链表中环的入口节点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public ListNode EntryNodeOfLoop(ListNode pHead) { //第一步,查找是 ...

  2. 对uboot中CFG_和CONFIG_的理解

    CONFIG_用于选择CPU   SOC 板子的类型,系统时钟,设备驱动driver驱动等 CFG_用于设置malloc缓冲池的大小,偏移地址部分的定义,uboot的提示符,uboot的加载地址,fl ...

  3. LeetCode(111) Minimum Depth of Binary Tree

    题目 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the s ...

  4. JAVA复制

    复制 直接赋值 直接赋值.在 Java 中, A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说 a1 和 a2 指向的是同一个对象.因此,当 a1 变化的时候, a2 里面的成员变量 ...

  5. java 位向量

    public class BitVectory { private int count; private int[] a; private static final int BIT_LEN = 32; ...

  6. 【19】javascript有哪些方法定义对象

    创建Object的方式有4种. 方式一: 通过对象字面量表示法(又称为直接量.原始方式). var obj = {name:"moyu"}; 方式二: 通过new和构造函数Obje ...

  7. luogu2604 [ZJOI2010]网络扩容

    先做一遍普通的dinic 然后再更改源点为超级源,超级源向原源加一条capacity=k && cost=0的边,再加上有费用的边跑最小费用最大流 #include <iostr ...

  8. 学习笔记1——下载和安装WordPress

    首先,到WordPress官方网站下载WordPress,下载地址https://cn.wordpress.org/txt-download/ 然后,将下载后的文件夹放在www目录下,到浏览器中输入l ...

  9. Access denied for user ''@'localhost' to database 'mysql'

    ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'   在centos下安装好了mysql,用r ...

  10. Ubuntu 常用命令和一些 tips

    001. ubuntu 解压.tar.xz文件到另一个文件夹:sudo tar -xvJf ***.tar.xz -C /usr/src sudo 超级用户tar [选项...][file]...-x ...