ThinkPHP內(nèi)置了一個基于XML的編譯型模板引擎,本篇開始對其內(nèi)置的標(biāo)簽做深入的講解,如果你使用的是Smarty等第三方模板引擎,請忽略。
變量的輸出我們已經(jīng)在快速入門的變量輸出中做了詳細(xì)的描述,后面主要講解變量的輸出判斷、循環(huán)和控制,以及包含公共模板和資源文件等。
包含公共模板
[-more-]
include標(biāo)簽
使用include標(biāo)簽在當(dāng)前模板中包含公共模板,例如常見的header和footer等公共模板,include標(biāo)簽最常用的屬性是file,但是支持不同的用法,其用法基本和我們常用的模板渲染方法display方法差不多。例如:
包含Public目錄下面的header模板
<include file="Public:header" />
包含當(dāng)前模板目錄下面的menu模板
<include file="menu" />
如果當(dāng)前使用了多模板主題功能,還可以包含其他主題的模板
<include file="blue:User:read" />
表示包含blue模板主題下面的User/read模板文件,include標(biāo)簽所支持的模板深度只能到操作層次,也就是說ThinkPHP默認(rèn)的模板結(jié)構(gòu)采用的是:
主題/模塊/操作.模板后綴,使用上述用法包含模板的時候,file屬性不需要指定模板后綴,如果你的模板結(jié)構(gòu)不是標(biāo)準(zhǔn)結(jié)構(gòu),可以采用包含完整模板文件的方式:
<include file="./Tpl/default/header.html" />
如果你在file屬性中指定了模板文件后綴,則就會認(rèn)為是包含完整模板的規(guī)則,如果你采用的是相對路徑包含,那么當(dāng)前的起始目錄應(yīng)該是項(xiàng)目入口文件所在的位置。
也可以用變量的方式:
<include file="$filename" />
但是并不推薦變量調(diào)用方式,因?yàn)橛捎谀0逡娴木幾g特性,編譯后會被緩存。
參數(shù)傳遞
include標(biāo)簽除了file屬性之外,還支持傳入一些簡單的參數(shù),并直接傳遞給模板文件使用,舉個例子,我們包含一個頭部文件,希望在模板文件里面動態(tài)指定網(wǎng)頁標(biāo)題和關(guān)鍵字信息,那么可以通過:
<include file="Public:header" title="ThinkPHP框架" keywords="開源WEB開發(fā)框架"/>
這里我們在包含header公共模板的時候,還傳入了title和keywords兩個參數(shù),我們來看下header模板文件怎么接收這些參數(shù):
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
模板文件中的[title]和[keywords]來替換include標(biāo)簽中傳入的參數(shù)。
包含多個模板
從3.1版本開始,include標(biāo)簽可以支持同時包含多個模板文件,例如:
<include file="Public:header,Public:menu" />
也可以支持不同方式的包含混合,例如:
<include file="Public:header,./Tpl/default/menu.html" />
嵌套包含模板
include標(biāo)簽支持嵌套使用,例如,我們可以在header公共模板文件中再次包含另外一個公共模板:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[title]</title>
<meta name="keywords" content="[keywords]" />
</head>
<include file="Public:menu" />
并且理論上不限制嵌套層次,只要避免不發(fā)生循環(huán)嵌套的情況即可。
總結(jié)
include標(biāo)簽可以一定程度上簡化重復(fù)的模板書寫,和便于同步修改,不足就是如果公共模板文件發(fā)生更改,但是當(dāng)前的主模板文件沒有更改,則不會自動更新模板緩存,除非你設(shè)置了模板緩存有效期,那么在緩存過期后會自動更新模板緩存。