程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 《PHP與MySQL程序設計(第3版)》——19.5 Smarty的表現邏輯

《PHP與MySQL程序設計(第3版)》——19.5 Smarty的表現邏輯

編輯:MySQL綜合教程

Smarty等模板引擎也有一些批評,批評者通常抱怨說引擎的特性集集成了某種程度的邏輯。畢竟模板引擎的主旨是完全分離表現層和邏輯層,對不對?雖然這是我們的理想,但不一定是最可行的解決方案。例如,如果沒有某種迭代邏輯,如何以某種格式輸出MySQL結果集?要得到十全十美的解決方案是不可能的。面對這個兩難處境,Smarty開發人員在引擎中集成了一些簡單但非常有效的應用程序邏輯。這似乎是一種理想的折衷,因為網站設計人員通常不是編程人員(反之亦然)。

本節將學習Smarty的表現特性:變量修飾符、控制結構和語句。首先對注釋做一個簡要介紹。

19.5.1  注釋

本章剩余部分在必要時都會使用注釋。因此,看來有必要先來介紹Smarty的注釋語法。注釋包圍在定界標記{**}之間,可以包括一行或多行。以下是一個合法的Smarty注釋:

19.5.2  變量修飾符

在第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模板包含:

這會返回:

19.5.3  控制結構

Smarty提供了幾種控制結構,能夠按條件和迭代處理傳入的數據。本節將介紹這些結構。

1. if函數

Smartyif函數與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。例如,設置step3將導致迭代在數組索引0369等等發生。設置step為負值將導致迭代從數組末尾向前進行。

q max。確定迭代的最大次數。

q show。確定是否確實顯示此節。可以使用這個參數進行調試(先設置為TRUE),然後在部署時再把這個參數設置為FALSE

考慮兩個示例。第一個示例迭代處理一個簡單的索引數組:

titles.tpl模板包含:

這會返回:

在這個有些奇怪的語法中,注意,節名必須像數組中的索引值一樣引用。還要注意,$titles變量名有雙重職責,它既是循環指示器,也是實際的變量引用。

現在考慮一個使用關聯數組的例子:

section2.tpl模板包含:

這會返回:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved