對Smarty等模板引擎也有一些批評,批評者通常抱怨說引擎的特性集集成了某種程度的邏輯。畢竟模板引擎的主旨是完全分離表現層和邏輯層,對不對?雖然這是我們的理想,但不一定是最可行的解決方案。例如,如果沒有某種迭代邏輯,如何以某種格式輸出MySQL結果集?要得到十全十美的解決方案是不可能的。面對這個兩難處境,Smarty開發人員在引擎中集成了一些簡單但非常有效的應用程序邏輯。這似乎是一種理想的折衷,因為網站設計人員通常不是編程人員(反之亦然)。
本節將學習Smarty的表現特性:變量修飾符、控制結構和語句。首先對注釋做一個簡要介紹。
本章剩余部分在必要時都會使用注釋。因此,看來有必要先來介紹Smarty的注釋語法。注釋包圍在定界標記{*和*}之間,可以包括一行或多行。以下是一個合法的Smarty注釋:
在第9章已經看到,PHP提供了很多函數,這些函數能夠以你能想象到的任何方式處理文本。但是,你可能想在表現層中使用這樣一些特性——例如,確保文章作者的姓和名在文章描述中首字母大寫。為此,Smarty開發人員在庫中集成了許多表現特有的功能。本節將介紹一些比較有趣的特性。
在概要介紹之前,有必要先說明Smarty的一個不太傳統的變量修飾符語法。當然,定界符用來指示所請求的變量輸出,而在輸出前,需要修飾的變量值後面可以跟一個豎線,再後面是修飾符命令,如下:
你將看到在本節介紹修飾符時會反復使用這個語法。
1. 首字母大小
capitalize函數把變量中所有單詞的首字母變為大寫。示例如下:
article.tpl模板包含:
返回如下:
2. 單詞計數
count_words函數統計變量中的單詞總數。示例如下:
article.tpl模板包含:
這會返回:
3. 格式化日期
date_format函數是PHP strftime()函數的包裝器,它能將可以被strftime()解析的任何日期/時間格式字符串轉換為某種特殊格式。因為格式化標志在手冊和第12章中已做介紹,所以這裡沒必要重復列出。下面是一個使用示例:
article.tpl模板包含:
這會返回:
4. 賦默認值
當應用層沒有返回值時,default函數為指示特定變量的默認值提供了一種簡單的方式。例如:
default.tpl模板包含:
這會返回:
5. 刪除標記符
strip_tags函數刪除變量字符串中的標記符。例如:
striptags.tpl模板包含:
這會返回:
6. 截取字符串
truncate函數將變量字符串截取為指定數量的字符。雖然默認為80個字符,但可以通過提供一個輸入參數(如下例所示)來改變截取的長度。可以指定一個字符串(可選),追加到截取後的字符串後面,如省略號(...)。此外,可以指定到達指定的字符數限制後立即截取,或者還需要考慮單詞的邊界(參數為TRUE,則按確切的限制截取,FALSE則截取到達到限制後最近的單詞邊界)。例如:
truncate.tpl模板包含:
這會返回:
Smarty提供了幾種控制結構,能夠按條件和迭代處理傳入的數據。本節將介紹這些結構。
1. if函數
Smarty的if函數與PHP語言中的if函數相同。與PHP一樣,可以使用一些條件限定符,如下所列:
下面是一個簡單示例:
再考慮另一個示例。假設希望根據月份插入某個消息。如下示例使用了條件限定符、elseif以及else語句來完成這個任務:
注意,把條件語句包圍在小括號中是可選的,但在標准PHP代碼中這卻是必需的。
2. foreach函數
foreach函數的作用與PHP語句中的命令相同。但如下所示,其語法大不相同。它有4個參數,其中兩個是必要的。
q from。這個必要參數指定目標數組的名。
q item。這個必要參數確定當前元素的名。
q key。這個可選參數確定當前鍵的名。
q name。這個可選參數確定節的名。這個名是任意的,應當設置為一個你認為符合本節目的的描述性的名字。
考慮一個例子。假設希望循環處理一周中的每一天:
daysofweek.tpl文件包含:
這會返回如下結果:
可以使用key屬性迭代處理一個關聯數據。考慮以下例子:
daysofweek.tpl模板包含:
這會返回:
雖然foreach函數非常有用,但絕對需要花些時間學習另一個功能與之類似的函數——section函數。這個函數功能更強大,我們將在後面介紹。
3. foreachelse函數
foreachelse函數與foreach一起使用,與用於字符串的default標記作用類似,數組為空時foreachelse標記可以生成某個候選結果。以下是一個使用foreachelse的模板示例:
注意,foreachelse不使用結束括號,它嵌入到foreach中,這與elseif嵌入到if函數中很類似。
4. section函數
section函數的操作就像是一個改進的for/foreach語句,它會迭代處理並輸出數據數組,但其語法差別很大。這裡改進一詞是指它與for/foreach結構提供了相同的循環特性,另外還提供了很多附加選項,可以更多地控制循環的執行。這些選項要通過函數參數來支持。下面將通過幾個例子來介紹各個可用的選項參數。
有兩個參數是必要的,如下所示。
q name。確定節的名。節名可以任意,應當設置為能夠描述節的目的的任意名字。
q loop。設置循環迭代的次數。應當設置為與數組變量同名。
還有幾個可選參數,如下所示。
q start。確定迭代開始的索引位置。例如,如果數組包含5個值,而start設置為3,則迭代將從數組的索引3開始。如果給出的是負值,則起始位置由從數組末尾減去該數字來確定。
q step。確定在數組中移動的步長值。默認情況下,這個值為1。例如,設置step為3將導致迭代在數組索引0、3、6、9等等發生。設置step為負值將導致迭代從數組末尾向前進行。
q max。確定迭代的最大次數。
q show。確定是否確實顯示此節。可以使用這個參數進行調試(先設置為TRUE),然後在部署時再把這個參數設置為FALSE。
考慮兩個示例。第一個示例迭代處理一個簡單的索引數組:
titles.tpl模板包含:
這會返回:
在這個有些奇怪的語法中,注意,節名必須像數組中的索引值一樣引用。還要注意,$titles變量名有雙重職責,它既是循環指示器,也是實際的變量引用。
現在考慮一個使用關聯數組的例子:
section2.tpl模板包含:
這會返回: