tp。3.2中的模板基礎


模板定義

每個模塊的模板文件是獨立的,為了對模板文件更加有效的管理,ThinkPHP對模板文件進行目錄划分,默認的模板文件定義規則是:

視圖目錄/[模板主題/]控制器名/操作名+模板后綴

模板賦值

 

如果要在模板中輸出變量,必須在在控制器中把變量傳遞給模板,系統提供了assign方法對模板變量賦值,無論何種變量類型都統一使用assign賦值。

$this->assign('name',$value); 或者 $this->name = $value; 

assign方法必須在display和show方法之前調用,並且系統只會輸出設定的變量,其它變量不會輸出(系統變量例外),一定程度上保證了變量的安全性。

系統變量可以通過特殊的標簽輸出,無需賦值模板變量

賦值后,就可以在模板文件中輸出變量了,如果使用的是內置模板的話,就可以這樣輸出: {$name}

如果要同時輸出多個模板變量,可以使用下面的方式:

$array['name'] = 'thinkphp'; $array['email'] = 'liu21st@gmail.com'; $array['phone'] = '12335678'; $this->assign($array); 

這樣,就可以在模板文件中同時輸出name、email和phone三個變量。

模板變量的輸出根據不同的模板引擎有不同的方法,我們在后面會專門講解內置模板引擎的用法。如果你使用的是PHP本身作為模板引擎的話 ,就可以直接在模板文件里面輸出了: <?php echo $name.'['.$email.''.$phone.']';?>

如果采用內置的模板引擎,可以使用: {$name} [ {$email} {$phone} ] 輸出同樣的內容。

渲染模板

渲染模板輸出最常用的是使用display方法,調用格式:

display('[模板文件]'[,'字符編碼'][,'輸出類型'])模板文件的寫法支持下面幾種:

用法 描述
不帶任何參數 自動定位當前操作的模板文件
[模塊@][控制器:][操作] 常用寫法,支持跨模塊 模板主題可以和theme方法配合
完整的模板文件名 直接使用完整的模板文件名(包括模板后綴)

下面是一個最典型的用法,不帶任何參數:

// 不帶任何參數 自動定位當前操作的模板文件 $this->display(); 

表示系統會按照默認規則自動定位模板文件,其規則是:

如果當前沒有啟用模板主題則定位到:當前模塊/默認視圖目錄/當前控制器/當前操作.html 如果有啟用模板主題則定位到:當前模塊/默認視圖目錄/當前主題/當前控制器/當前操作.html

如果有更改TMPL_FILE_DEPR設置(假設 'TMPL_FILE_DEPR'=>'_')的話,則上面的自動定位規則變成: 當前模塊/默認視圖目錄/當前控制器_當前操作.html 和 當前模塊/默認視圖目錄/當前主題/當前控制器_當前操作.html

所以通常display方法無需帶任何參數即可輸出對應的模板,這是模板輸出的最簡單的用法。

通常默認的視圖目錄是View(了解)

如果沒有按照模板定義規則來定義模板文件(或者需要調用其他控制器下面的某個模板),可以使用:

// 指定模板輸出 $this->display('edit'); 

表示調用當前控制器下面的edit模板

$this->display('Member:read'); 

表示調用Member控制器下面的read模板。

如果我們使用了模板主題功能,那么也可以支持跨主題調用,使用:

$this->theme('blue')->display('User:edit'); 

表示調用blue主題下面的User控制器的edit模板。

如果你不希望每個主題都重復定義一些相同的模版文件的話,還可以啟用差異主題定義方式,設置:

'TMPL_LOAD_DEFAULTTHEME'=>true 

設置后,如果blue主題下面不存在edit模板的話,就會自動定位到默認主題中的edit模板。

渲染輸出不需要寫模板文件的路徑和后綴,確切地說,這里面的控制器和操作並不一定需要有實際對應的控制器和操作,只是一個目錄名稱和文件名稱而已,例如,你的項目里面可能根本沒有Public控制器,更沒有Public控制器的menu操作,但是一樣可以使用

$this->display('Public:menu'); 

輸出這個模板文件。理解了這個,模板輸出就清晰了。

display方法支持在渲染輸出的時候指定輸出編碼和類型,例如,可以指定編碼和類型:

$this->display('read', 'utf-8', 'text/xml'); 

表示輸出XML頁面類型(配合你的應用需求可以輸出很多類型)。

事情總有特例,如果的模板目錄是自定義的,或者根本不需要按模塊進行分目錄存放,那么默認的display渲染規則就不能處理,這個時候,我們就需要使用另外一種方式來應對,直接傳入模板文件名即可,例如:

$this->display('./Template/Public/menu.html'); 

這種方式需要指定模板路徑和后綴,這里的Template/Public目錄是位於當前項目入口文件位置下面。如果是其他的后綴文件,也支持直接輸出,例如:$this->display('./Template/Public/menu.tpl');

只要./Template/Public/menu.tpl是一個實際存在的模板文件。

獲取內容

如果需要獲取渲染模板的輸出內容而不是直接輸出,可以使用fetch方法。

fetch方法的用法和display基本一致(只是不需要指定輸出編碼和輸出類型):

fetch('模板文件')模板文件的調用方法和display方法完全一樣,區別就在於fetch方法渲染后不是直接輸出,而是返回渲染后的內容,例如:

$content = $this->fetch('Member:edit'); 

使用fetch方法獲取渲染內容后,你可以進行過濾和替換等操作,或者用於對輸出的復雜需求。

渲染內容(了解)

如果你沒有定義任何模板文件,或者把模板內容存儲到數據庫中的話,你就需要使用show方法來渲染輸出了,show方法的調用格式:

show('渲染內容'[,'字符編碼'][,'輸出類型'])例如,$this->show($content);

也可以指定編碼和類型: $this->show($content, 'utf-8', 'text/xml');

show方法中的內容也可以支持模板解析。

內置標簽

volist標簽通常用於查詢數據集(select方法)的結果輸出,通常模型的select方法返回的結果是一個二維數組,可以直接使用volist標簽進行輸出。 在控制器中首先對模版賦值:

$User = M('User'); $list = $User->limit(10)->select(); $this->assign('list',$list); 

在模版定義如下,循環輸出用戶的編號和姓名:

<volist name="list" id="vo"> {$vo.id}:{$vo.name}<br/> </volist> 

Volist標簽的name屬性表示模板賦值的變量名稱,因此不可隨意在模板文件中改變。id表示當前的循環變量,可以隨意指定,但確保不要和name屬性沖突,例如:

<volist name="list" id="data"> {$data.id}:{$data.name}<br/> </volist> 

支持輸出查詢結果中的部分數據,例如輸出其中的第5~15條記錄

<volist name="list" id="vo" offset="5" length='10'> {$vo.name} </volist> 

輸出偶數記錄

<volist name="list" id="vo" mod="2" > <eq name="mod" value="1">{$vo.name}</eq> </volist> 

Mod屬性還用於控制一定記錄的換行,例如:

<volist name="list" id="vo" mod="5" > {$vo.name} <eq name="mod" value="4"><br/></eq> </volist> 

為空的時候輸出提示:

<volist name="list" id="vo" empty="暫時沒有數據" > {$vo.id}|{$vo.name} </volist> 

empty屬性不支持直接傳入html語法,但可以支持變量輸出,例如:

$this->assign('empty','<span class="empty">沒有數據</span>'); $this->assign('list',$list); 

然后在模板中使用:

<volist name="list" id="vo" empty="$empty" > {$vo.id}|{$vo.name} </volist> 

輸出循環變量

<volist name="list" id="vo" key="k" > {$k}.{$vo.name} </volist> 

如果沒有指定key屬性的話,默認使用循環變量i,例如:

<volist name="list" id="vo" > {$i}.{$vo.name} </volist> 

如果要輸出數組的索引,可以直接使用key變量,和循環變量不同的是,這個key是由數據本身決定,而不是循環控制的,例如:

<volist name="list" id="vo" > {$key}.{$vo.name} </volist> 

模板中可以直接使用函數設定數據集,而不需要在控制器中給模板變量賦值傳入數據集變量,如:

<volist name=":fun('arg')" id="vo"> {$vo.name} </volist>

<if condition="($name eq 1) OR ($name gt 100) "> value1
<elseif condition="$name eq 2"/>value2 <else /> value3 </if> 

在condition屬性中可以支持eq等判斷表達式,同上面的比較標簽,但是不支持帶有”>”、”<”等符號的用法,因為會混淆模板解析,所以下面的用法是錯誤的:

<if condition="$id < 5 ">value1 <else /> value2 </if> 

必須改成:

<if condition="$id lt 5 ">value1 <else /> value2 </if> 

除此之外,我們可以在condition屬性里面使用php代碼,例如:

<if condition="strtoupper($user['name']) neq 'THINKPHP'">ThinkPHP <else /> other Framework </if> 

condition屬性可以支持點語法和對象語法,例如: 自動判斷user變量是數組還是對象

<if condition="$user.name neq 'ThinkPHP'">ThinkPHP <else /> other Framework </if> 

或者知道user變量是對象

<if condition="$user:name neq 'ThinkPHP'">ThinkPHP <else /> other Framework </if> 

由於if標簽的condition屬性里面基本上使用的是php語法,盡可能使用判斷標簽和Switch標簽會更加簡潔,原則上來說,能夠用switch和比較標簽解決的盡量不用if標簽完成。因為switch和比較標簽可以使用變量調節器和系統變量。如果某些特殊的要求下面,IF標簽仍然無法滿足要求的話,可以使用原生php代碼或者PHP標簽來直接書寫代碼。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM