標籤:des style blog http 使用 strong
php學習之Smarty----調用變數
前端工程師知識的收集與管理php學習之Smarty------Smarty3
2010-06-29 16:47:05| 分類: php+ajax |舉報 |字型大小 訂閱
一.概述
Smarty3目前最新版本是RC1,尚未穩定。
Smarty3基本保持了向前相容,但有下面幾點改變:
1. Smarty3需要php5,不再相容php4;
2. Smarty3預設禁止了{php}標籤,如果要啟用需要設定一下:$smarty->allow_php_tag = true;
3. 現在,定界符內兩端不能有空白,如:{ foreach }不會匹配foreach標籤,而是直接輸出“{ foreach }”,這樣{literal}這個標籤就不需要了;
4. Smarty3 Api有很多改變,雖然Smarty2的Api仍然可以用,但已經不被推薦。
二.Smarty3模板引擎的新功能
1. 任何地方都可以用運算式了,而且運算式裡可以直接用php裡的函數了。這樣,之前的math函數基本就用不上。如:
{$x+$y} |
will output the sum of x and y |
{$foo = strlen($bar)} |
function in assignment |
{assign var=foo value= $x+$y} |
in attributes |
{$foo = myfunct( ($x+$y)*3 )} |
as function parameter |
{$foo[$x+3]} |
as array index |
2. 一個標籤裡可以使用另外的標籤。如:{$foo = ${counter} + 3}
3. 在雙引號裡也可以使用標籤。如:{$foo = "this is message {counter}"}
4. 直接在模板裡定義資料。如:
{assign var=foo value=[1,2,3]}
{assign var=foo value=[‘y‘=>‘yellow‘,‘b‘=>‘blue‘]}
{assign var=foo value=[1,[9,8],3]} {*數組可以多層*}
5. assign變數更容易了,不需要用assign標籤,如:{$foo = $bar + 2}
6. 下面這種寫法也是支援的,賦值前會先自動根據需求轉為數組:
{$foo[‘bar‘] = 1}
{$foo[‘bar‘][‘blar‘] = 2}
{$foo = 1}
{$foo[] = 1}
7. 下面左右兩種寫法是等價的:
{$foo.a.b.c} |
$foo[‘a‘][‘b‘][‘c‘] |
{$foo.a.$b.c} |
$foo[‘a‘][$b][‘c‘] |
{$foo.a.{$b+4}.c} |
$foo[‘a‘][$b+4][‘c‘] |
{$foo.a.{$b.c}} |
$foo[‘a‘][$b[‘c‘]] |
8. 變數名裡可以包含變數或者運算式,這個強大。如:
$foo |
normal variable |
$foo_{$bar} |
variable name containing other variable |
$foo_{$x+$y} |
variable name containing expressions |
$foo_{$bar}_buh_{$blar} |
variable name with multiple segments |
{$foo_{$x}} |
will output the variable $foo_1 if $x has a value of 1. |
9. 支援對象的鏈式調用,如:{$object->method1($x)->method2($y)}
10. 新增了for這個標籤,用來代替section(但是section仍然被支援),如:
{for $x=0, $y=count($foo); $x<$y;$x++} .... {/for}
特別的,for還支援下面這種用法:
{for $x = $start to $end step $step}... {/for} {*註:貌似正式版才支援step*}
{for $x = $start to $end} ... {/for}
而且,在迴圈中,提供了以下變數:
[email protected] |
number of iteration |
[email protected] |
total number of iterations |
[email protected] |
true on first iteration |
[email protected] |
true on last iteration |
11. foreach也有改進(之前的foreach寫法繼續被支援),如:{foreach $myarray as $var}...{/foreach}
在foreach迴圈中,提供了以下變數:
[email protected] |
foreach $var array key |
[email protected] |
foreach current iteration count (1,2,3...) |
[email protected] |
foreach current index count (0,1,2...) |
[email protected] |
foreach $var array total |
[email protected] |
true on first iteration |
[email protected] |
true on last iteration |
12. 新增了while標籤,如:
{while $foo}...{/while}
{while $x lt 10}...{/while}
13. 支援直接使用PHP裡的函數(所以{php}{/php}就顯得不是那麼重要了),如模板中可以支援這麼寫:
{time()}
---
{function name=menu level=0}
<ulclass="level{$level}">
{foreach $data as $entry}
{if is_array($entry)}
<li>{[email protected]}</li>
{menu data=$entry level=$level+1}
{else}
<li>{$entry}</li>
{/if}
{/foreach}
</ul>
{/function}
---
{$menu = [‘item1‘,‘item2‘,‘item3‘ =>[‘item3-1‘,‘item3-2‘,‘item3-3‘ => [‘item3-3-1‘,‘item3-3-2‘]],‘item4‘]}
{menu data=$menu}
輸出:
* item1
* item2
* item3
o item3-1
o item3-2
o item3-3
+ item3-3-1
+ item3-3-2
* item4
三.模板繼承
現在在父模板裡可以定義block,在子模板裡可以使用或修改block,如:
parent.tpl:
<html><head><title>{block name="title"}My site name{/block}</title></head><body><h1>{block name="page-title"}Default page title{/block}</h1><div id="content">{block name="content"}Default content{/block}</div></body></html>
child.tpl:
{extends file="parent.tpl"}{block name="title"}Child title{/block}
grandchild.tpl:
{extends file="child.tpl"}{block name="title"}Home-{$smarty.block.parent}{/block}{block name="page-title"}My home{/block}{block name="content"}{foreach $images as $img}<img src="{$img.url}" alt="{$img.description}"/>{/foreach}{/block}
grandchild.tpl渲染出來是這個樣子:
<html><head><title>Home-Child title</title></head><body><h1>My home</h1><div id="content"><img src="/example.jpg" alt="image"/><img src="/example2.jpg" alt="image"/><img src="/example3.jpg" alt="image"/></div></body></html>
幾點需要注意的:
1. 子模板裡只能有{extends}和{block},其他標籤會被忽略;
2. Smarty3支援無限級繼承,但顯然更深層次的繼承意味著更多的開銷;
3. 除了可以在子模板裡支援extends的父模板,也可以在php裡這麼寫:
$smarty->display(‘extends:parent.tpl|child.tpl|grandchild.tpl‘);
4. block標籤裡還支援append、prepended兩個選項,表示追加和前置追加,如:
{block name=‘title‘ append} My title {/block}
四.其他
Smarty3裡還支援其他許多新特性,這裡先就不介紹了。如Plugin、PHP Templates、Varialbe Scope和Variable Storage。
五.總結
Smarty3做了很多易用性升級,新增的一些文法可以大大提供開發效率;新增的模板繼承也有利於我們更好的規劃模板結構,效能方面據官方說明提高了200%~300%。因為現在還是RC版,穩定性和效能方面有待進一步觀察。建議我們保持密切關注,合適的時候再升上去。