ThinkPHP如何給網頁加公共的header檔案和footer檔案
在thinkPHP的手冊的模板裡面有模板繼承,模板繼承的優勢其實是設計基礎模板中的區塊(block)和子模板中替換這些區塊
具體如下:
每個區塊由<block></block>標籤組成。下面就是基礎模板中的一個典型的區塊設計(用於設計網站標題):
1 |
<block name= "title" ><title>網站標題</title></block>
|
block標籤必須指定name屬性來標識當前區塊的名稱,這個標識在當前模板中應該是唯一的,block標籤中可以包含任何模板內容,包括其他標籤和變數,例如:
1 |
<block name= "title" ><title>{ $web_title }</title></block>
|
甚至還可以在區塊中載入外部檔案:
1 |
< block name = "include" >< include file = "Public:header" /></ block >
|
一個模板中可以定義任意多個名稱標識不重複的區塊,例如下面定義了一個base.html基礎模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< block name = "title" >< title >標題</ title ></ block >
</ head >
< body >
< block name = "menu" >選單</ block >
< block name = "left" >左邊分欄</ block >
< block name = "main" >主內容</ block >
< block name = "right" >右邊分欄</ block >
< block name = "footer" >底部</ block >
</ body >
</ html >
|
然後我們在子模板(其實是當前操作的入口模板)中使用繼承:
<extend name="base" />
<block name="title"><title>{$title}</title></block>
<block name="menu"><a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
</block><block name="left"></block>
<block name="content"><
volist name="list" id="vo">
<a href="/new/{$vo.id}">{$vo.title}</a><br/> {$vo.content}</volist>
</block>
<block name="right"> 最新資訊:<volist name="news" id="new"><a href="/new/{$new.id}">{$new.title}</a><br/>
</volist>
</block>
<block name="footer"> @ThinkPHP 版權所有</block>
可以看到,子模板中使用了extend標籤定義需要繼承的模板,extend標籤的用法和include標籤一樣,你也可以載入其他模板:
<extend name="Public:base" />
或者使用絕對檔案路徑載入
<extend name="./Template/Public/base.html" />
在當前子模板中,只能定義區塊而不能定義其他的模板內容,否則將會直接忽略,並且只能定義基礎模板中已經定義的區塊。
例如,如果採用下面的定義:
<block name="title"><title>{$title}</title></block><a href="/" >首頁</a><a href="/info/" >資訊</a><a href="/bbs/" >論壇</a>
導航部分將是無效的,不會顯示在模板中。
ThinkPHP的模板引擎內建了佈局模板功能支援,可以方便的實現模板佈局以及佈局巢狀功能。
有三種佈局模板的支援方式:
第一種方式:全域性配置方式
這種方式僅需在專案配置檔案中新增相關的佈局模板配置,就可以簡單實現模板佈局功能,比較適用於全站使用相同佈局的情況,需要配置開啟LAYOUT_ON 引數(預設不開啟),並且設定佈局入口檔名LAYOUT_NAME(預設為layout)。
'LAYOUT_ON'=>true,
'LAYOUT_NAME'=>'layout',
開啟LAYOUT_ON後,我們的模板渲染流程就有所變化,例如:
namespaceHome\Controller;
useThink\Controller;
ClassUserControllerextendsController{
Publicfunction add(){
$this->display('add');
}
}
在不開啟LAYOUT_ON佈局模板之前,會直接渲染 Application/Home/View/User/add.html
模板檔案,開啟之後,首先會渲染Application/Home/View/layout.html
模板,佈局模板的寫法和其他模板的寫法類似,本身也可以支援所有的模板標籤以及包含檔案,區別在於有一個特定的輸出替換變數{__CONTENT__}
,例如,下面是一個典型的layout.html模板的寫法:
<includefile="Public:header"/>
{__CONTENT__}
<includefile="Public:footer"/>
讀取layout模板之後,會再解析User/add.html
模板檔案,並把解析後的內容替換到layout佈局模板檔案的{CONTENT}
特定字串。
當然可以通過設定來改變這個特定的替換字串,例如:
'TMPL_LAYOUT_ITEM'=>'{__REPLACE__}'
一個佈局模板同時只能有一個特定替換字串。
採用這種佈局方式的情況下,一旦User/add.html 模板檔案或者layout.html佈局模板檔案發生修改,都會導致模板重新編譯。
如果需要指定其他位置的佈局模板,可以使用:
'LAYOUT_NAME'=>'Layout/layoutname',
就表示採用Application/Home/View/Layout/layoutname.html
作為佈局模板。
如果某些頁面不需要使用佈局模板功能,可以在模板檔案開頭加上 {__NOLAYOUT__}
字串。
如果上面的User/add.html 模板檔案裡面包含有{__NOLAYOUT__}
,則即使當前開啟佈局模板,也不會進行佈局模板解析。
第二種方式:模板標籤方式
這種佈局模板不需要在配置檔案中設定任何引數,也不需要開啟LAYOUT_ON,直接在模板檔案中指定佈局模板即可,相關的佈局模板調整也在模板中進行。
以前面的輸出模板為例,這種方式的入口還是在User/add.html 模板,但是我們可以修改下add模板檔案的內容,在頭部增加下面的佈局標籤(記得首先關閉前面的LAYOUT_ON設定,否則可能出現佈局迴圈):
<layoutname="layout"/>
表示當前模板檔案需要使用layout.html
佈局模板檔案,而佈局模板檔案的寫法和上面第一種方式是一樣的。當渲染User/add.html
模板檔案的時候,如果讀取到layout標籤,則會把當前模板的解析內容替換到layout佈局模板的{CONTENT}
特定字串。
一個模板檔案中只能使用一個佈局模板,如果模板檔案中沒有使用任何layout標籤則表示當前模板不使用任何佈局。
如果需要使用其他的佈局模板,可以改變layout的name屬性,例如: