php學習之Smarty----調用變數 轉

來源:互聯網
上載者:User

標籤: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版,穩定性和效能方面有待進一步觀察。建議我們保持密切關注,合適的時候再升上去。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.