子標題:Smarty 入門 - 3
從變數開始
如何使用變數
從上一章範例中,我們可以清楚地看到我們利用 { 及 } 這兩個標示符號將變數包起來,這是 Smarty 預設的標示符號。變數的命名方式和 PHP 的變數命名方式是一模一樣的,前面也有個 $ 字號 (這和一般的樣版引擎不同)。標示符號就有點像是 PHP 中的 (事實上它們在大部份的解析過程中,的確會被替換成這個符號) ,所以以下的樣版變數寫法都是可行的:
1. 一般的寫法:
![]()
![]()
{$var}2. 與變數中間留有空白
![]()
![]()
{ $var }3. 啟始的標示符號和結束的標示符號不在同一行
![]()
![]()
{$var
}
註:有時為了中文衝碼及 Javascript 的關係,我們透過 $left_delimiter 和 $right_delimiter 兩個 Smarty 類別屬性,來將標示符號換掉。
在 Smarty 裡,變數預設是全域的,也就是說你只要指定一次就好了。指定兩次以上的話,變數內容會以最後指定的為主。就算我們在主樣版中載入了外部的子樣版,子樣版中同樣的變數一樣也會被替代,這樣我們就不用再針對子樣版再做一次解析的動作。
如果想要顯示的資料已經放在一個陣列裡了,是否要將裡面的變數分離出來,再做 assign 的動作呢?其實不需要!我們可以直接就把這個陣列 assign 到樣版物件中,如下:
![]()
![]()
<?php
$this_user = array("fullname" => "Jace Ju", "phone" => "012345678", "email" => "jaceju@seed.net.tw");
$tpl->assign("this_user", $this_user);
?>
然後在樣版中這裡使用:
![]()
![]()
{$this_user.fullname}
{$this_user.phone}
{$this_user.email
如此一來就不需將陣列分離, PHP 程式裡也不會有一大堆的 assign 了。
另外我們也可以把「物件」 assign 到 Smarty 裡,例如:
![]()
![]()
<?php
$obj = new SomeObject();
$tpl->assign("obj", $obj);
?>
而在樣版中也是與 PHP 一樣使用「 -> 」來存取該物件的屬性與方法。
![]()
![]()
{$obj->fullname}
{$obj->method1()}
修飾你的變數
上面我們提到 Smarty 變數呈現的風貌是由樣版自行決定的,所以 Smarty 提供了許多修飾變數的函式。使用的方法如下:
![]()
![]()
{變數|修飾函式} <!-- 當修飾函式沒有參數時 -->
{變數|修飾函式:"參數(非必要,視函式而定)"} <!-- 當修飾函式有參數時 -->
範例如下:
![]()
![]()
{$var|nl2br} <!-- 將變數中的換行字元換成 <br /> -->
{$var|string_format:"%02d"} <!-- 將變數格式化 -->
好,那為什麼要讓樣版自行決定變數呈現的風貌?先看看底下的 HTML ,這是某個購物車結帳的部份畫面。
![]()
![]()
<input name="total" type="hidden" value="21000" /> 總金額:21,000 元
一般樣版引擎的樣版可能會這樣寫:
![]()
![]()
<input name="total" type="hidden" value="{total}" />
總金額:{format_total} 元
它們的 PHP 程式中要這樣寫:
![]()
![]()
<?php
$total = 21000;
$tpl->assign("total", $total);
$tpl->assign("format_total", number_format($total));
?>
而 Smarty 的樣版就可以這樣寫:
![]()
![]()
<input name="total" type="hidden" value=" {$total} " />
總金額: {$total|number_format:""} 元
Smarty 的 PHP 程式中只要這樣寫:
![]()
![]()
<?php
$total = 21000;
$tpl->assign("total", $total);
?>
所以在 Smarty 中我們只要指定一次變數,剩下的交給樣版自行決定即可。這樣瞭解了嗎?這就是讓樣版自行決定變數呈現風貌的好處!