1. 程式人生 > >ThinkPHP如何給網頁加公共的header檔案和footer檔案

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)。

  1. 'LAYOUT_ON'=>true,
  2. 'LAYOUT_NAME'=>'layout',

開啟LAYOUT_ON後,我們的模板渲染流程就有所變化,例如:

  1. namespaceHome\Controller;
  2. useThink\Controller;
  3. ClassUserControllerextendsController{
  4. Publicfunction add(){
  5. $this->display('add');
  6. }
  7. }

在不開啟LAYOUT_ON佈局模板之前,會直接渲染 Application/Home/View/User/add.html 模板檔案,開啟之後,首先會渲染Application/Home/View/layout.html 模板,佈局模板的寫法和其他模板的寫法類似,本身也可以支援所有的模板標籤以及包含檔案,區別在於有一個特定的輸出替換變數{__CONTENT__},例如,下面是一個典型的layout.html模板的寫法:

  1. <includefile="Public:header"/>
  2. {__CONTENT__}
  3. <includefile="Public:footer"/>

讀取layout模板之後,會再解析User/add.html 模板檔案,並把解析後的內容替換到layout佈局模板檔案的{CONTENT} 特定字串。

當然可以通過設定來改變這個特定的替換字串,例如:

  1. 'TMPL_LAYOUT_ITEM'=>'{__REPLACE__}'

一個佈局模板同時只能有一個特定替換字串。

採用這種佈局方式的情況下,一旦User/add.html 模板檔案或者layout.html佈局模板檔案發生修改,都會導致模板重新編譯。

如果需要指定其他位置的佈局模板,可以使用:

  1. 'LAYOUT_NAME'=>'Layout/layoutname',

就表示採用Application/Home/View/Layout/layoutname.html作為佈局模板。

如果某些頁面不需要使用佈局模板功能,可以在模板檔案開頭加上 {__NOLAYOUT__} 字串。

如果上面的User/add.html 模板檔案裡面包含有{__NOLAYOUT__},則即使當前開啟佈局模板,也不會進行佈局模板解析。

第二種方式:模板標籤方式

這種佈局模板不需要在配置檔案中設定任何引數,也不需要開啟LAYOUT_ON,直接在模板檔案中指定佈局模板即可,相關的佈局模板調整也在模板中進行。

以前面的輸出模板為例,這種方式的入口還是在User/add.html 模板,但是我們可以修改下add模板檔案的內容,在頭部增加下面的佈局標籤(記得首先關閉前面的LAYOUT_ON設定,否則可能出現佈局迴圈):

  1. <layoutname="layout"/>

表示當前模板檔案需要使用layout.html 佈局模板檔案,而佈局模板檔案的寫法和上面第一種方式是一樣的。當渲染User/add.html 模板檔案的時候,如果讀取到layout標籤,則會把當前模板的解析內容替換到layout佈局模板的{CONTENT} 特定字串。

一個模板檔案中只能使用一個佈局模板,如果模板檔案中沒有使用任何layout標籤則表示當前模板不使用任何佈局。

如果需要使用其他的佈局模板,可以改變layout的name屬性,例如: