ThinkPHP的(de)模闆引擎內(nèi)置了(l"☆↕e)布局模闆功能(néng)支持,可(kě)以方便的(♥×de)實現(xiàn)模闆布局以及布局嵌套功βε©能(néng)。
有(yǒu)三種布局模闆的(de)支持方式:
第一(yī)種方式:全局配置方式
這(zhè)種方式僅需在項目配置文(wén)件(jiàn)中添加相(xi×àng)關的(de)布局模闆配置,就(jiù)可(kě)以簡單實現(xià≠₩n)模闆布局功能(néng),比較适用(yòng)→≤"于全站(zhàn)使用(yòng)相(xiàng)同布局的(de)情況,需要(∞★•∏yào)配置開(kāi)啓LAYOUT_ON 參數(shù)(默認不(₽✘bù)開(kāi)啓),并且設置布局入口文(♦↑∞↓wén)件(jiàn)名LAYOUT_NAME(默認為(wèi)lay☆¥out)。
'LAYOUT_ON'=>true,'LAYOUT_NAME'=>'layout',
開(kāi)啓LAYOUT_ON後,我們的(de)模闆渲≠÷₹§染流程就(jiù)有(yǒu)所變化(huà),例如(rú):
namespace Home\Controller;use Think\Controller;Class UserController extends Controller{Public function add() {$this->display('add');}}
在不(bù)開(kāi)啓LAYOUT_ON布局模闆之前,會(huì)直♠↓接渲染 Application/Home/View/User/add.h↔≠☆tml 模闆文(wén)件(jiàn),開(kāi)啓之後,首先會(huì)渲€↑•₽染Application/Home/View/layout.ht↔εml 模闆,布局模闆的(de)寫法和(hé)其他(tā)模闆的(de)寫法類似,< ≥本身(shēn)也(yě)可(kě)以支持所有(yǒu ¶€∏)的(de)模闆标簽以及包含文(wén)件(jiàn),↔區(qū)别在于有(yǒu)一(yī)個(gè)特∏↓定的(de)輸出替換變量{__CONTENT__},例如(rú),下(xià)面是(shì•₩)一(yī)個(gè)典型的(de)layout.html模闆的(δ≤de)寫法:
<include file="Public:header" />{__CONTENT__}<include file="Public:footer"≤δ ; />
讀(dú)取layout模闆之後,會(h₽uì)再解析User/add.html 模闆文(wén)件(jiàn),并把解析後的(d♥&★£e)內(nèi)容替換到(dào)layout布局模闆文(wén)件(jiàn"₩)的(de){CONTENT} 特定字符串。
當然可(kě)以通(tōng)過設置來(lá€↕↑™i)改變這(zhè)個(gè)特定的(de)₽ π替換字符串,例如(rú):
'TMPL_LAYOUT_ITEM' => '{__REPLACE__}'
一(yī)個(gè)布局模闆同時(shí)隻能(néng)有(yǒ÷®≥λu)一(yī)個(gè)特定替換字符串。
采用(yòng)這(zhè)種布局方式的(de)情況下(xià),一(yī)∑£旦User/add.html 模闆文(wén)件(jiàn)或者lay☆•out.html布局模闆文(wén)件(jiàn ☆Ω☆)發生(shēng)修改,都(dōu)會(huì)導緻模闆重新編譯↓£。
如(rú)果需要(yào)指定其他(tā)位置的(de)布局模闆,可(k•δΩě)以使用(yòng):
'LAYOUT_NAME'=>'Layout/layoutname',
就(jiù)表示采用(yòng)Application/Home/Vie✔€w/Layout/layoutname.ht£♣ml作(zuò)為(wèi)布局模闆。
如(rú)果某些(xiē)頁面不(bù)"™需要(yào)使用(yòng)布局模闆功能(néng♥ σσ),可(kě)以在模闆文(wén)件(jiàn<φσ)開(kāi)頭加上(shàng) {__NOLAYOUT__} 字符串。
如(rú)果上(shàng)面的(de)User/add<•₽.html 模闆文(wén)件(jiàn)裡(lǐ)面包含有£≠(yǒu){__NOLAYOUT__},則即使當前開(kāi)啓布局模闆,也(yě)不(bù)∞↑會(huì)進行(xíng)布局模闆解析。βσ∏≥
第二種方式:模闆标簽方式
這(zhè)種布局模闆不(bù)需要(yàoΩ∞∏)在配置文(wén)件(jiàn)中設置任何參數(shù)δδ,也(yě)不(bù)需要(yào)開(kβāi)啓LAYOUT_ON,直接在模闆文(βλ↕→wén)件(jiàn)中指定布局模闆即可(kě),相(xiàng)關的★γα(de)布局模闆調整也(yě)在模闆中進行(xíng)。
以前面的(de)輸出模闆為(wèi)例,這(zhè)種方式的(de™πε)入口還(hái)是(shì)在User/add.html 模闆,但(dà¶§$Ωn)是(shì)我們可(kě)以修改下(xià)aΩ•→dd模闆文(wén)件(jiàn)的(de)內©★(nèi)容,在頭部增加下(xià)面的&<✘★(de)布局标簽(記得(de)首先關閉前面的(d♥®φπe)LAYOUT_ON設置,否則可(kě)能(néng)出現(xiàn)布局•♣♦λ循環):
<layout name="layout" />
表示當前模闆文(wén)件(jiàn)需要(yào)使用(yδ∏òng)layout.html 布局模闆文(wén)件(jiàn),而布局模闆文(wén δβ)件(jiàn)的(de)寫法和(hé)上(shànγ₩♦εg)面第一(yī)種方式是(shì)一(yī)樣的(de) <。當渲染User/add.html 模闆文(wén)件(jiàn)的(de)時(↓•∞σshí)候,如(rú)果讀(dú)取到(dào)layout标簽,則會(huì® §)把當前模闆的(de)解析內(nèi)容替換到(dào)la§↑Ω yout布局模闆的(de){CONTENT} 特定字符串。
一(yī)個(gè)模闆文(wén)件(jiàΩ¶n)中隻能(néng)使用(yòng)一(yī)個≥'(gè)布局模闆,如(rú)果模闆文(wén)件(jiàn)中沒有(yφ"↕ǒu)使用(yòng)任何layout标簽則表示當前模闆不(bù)¶∞✔使用(yòng)任何布局。
如(rú)果需要(yào)使用(yòng)其他(←'↓tā)的(de)布局模闆,可(kě)以改變layφ™→☆out的(de)name屬性,例如(rú):
<layout name="newlayout"≈☆ />
還(hái)可(kě)以在layout标簽裡(lǐ)面指定要(£✔yào)替換的(de)特定字符串:
<layout name="Layout/newlayou↕φ×₹t" replace="{__REPLACE__}" />
由于所有(yǒu)include标簽引入的(de)文(wén)件(₩÷φjiàn)都(dōu)支持layout标簽,所以,我們可(kě)以借助la ¥yout标簽和(hé)include标簽相(xiàng)結合的↔↑β(de)方式實現(xiàn)布局模闆的(de)嵌§ €套。例如(rú),上(shàng)面的(de)例子(zǐ)
<include file="Public:header" /><div id="main" class="main" >{__CONTENT__}</div><include file="Public:footer&↓quot; />
在引入的(de)header和(hé)f™ ooter模闆文(wén)件(jiàn)中也(yě)可(kě) ∏•以添加layout标簽,例如(rú)header模®€≥←闆文(wén)件(jiàn)的(de)開(kāiαε♣©)頭添加如(rú)下(xià)标簽:
<layout name="menu" />
這(zhè)樣就(jiù)實現(xiàn)了(le)在頭部模闆中引用"≈(yòng)了(le)menu布局模闆。
也(yě)可(kě)以采用(yòng)兩種布局方式的(d★•≥e)結合,可(kě)以實現(xiàn)更加複☆×εσ雜(zá)的(de)模闆布局以及嵌套功能(néng)。
第三種方式:使用(yòng)layout控制(zhì)模闆布α☆π局
使用(yòng)內(nèi)置的(de)layout方法可(k♠≤£€ě)以更靈活的(de)在程序中控制(zhì)模闆輸出的(de)布局功能(nφ$éng),尤其适用(yòng)于局部需要(yào)布局或者®δΩ關閉布局的(de)情況,這(zhè)種方式也(yě)不(bù)需要→₽↔∏(yào)在配置文(wén)件(jiàn)中開(kāi)啓LAYOUT_≤$φ©ON。例如(rú):
namespace Home\Controller;use Think\Controller;Class UserController extends Controller{Public function add() {layout(true);$this->display('add');}}
表示當前的(de)模闆輸出啓用(yòng)了(l ¶☆e)布局模闆,并且采用(yòng)默認的(de)layout布局模闆。↔&
如(rú)果當前輸出需要(yào)使用(yòng)不(bù)同的↑ ★'(de)布局模闆,可(kě)以動态的(de)指定布局模闆名稱,≥γ例如(rú):
namespace Home\Controller;use Think\Controller;Class UserController extends Controller{Public function add() {layout('Layout/newlayout');$this->display('add');}}
或者使用(yòng)layout方法動态關閉&σ✘當前模闆的(de)布局功能(néng)(這(zhè<®')種用(yòng)法可(kě)以配合第一(yī)種布局方式,例£δ©→如(rú)全局配置已經開(kāi)啓了(le)布局,可(k•>ě)以在某個(gè)頁面單獨關閉):
namespace Home\Controller;use Think\Controller;Class UserController extends Controller{Public function add() {layout(false); // 臨時(shí)關閉當前模闆的(de≈♣→<)布局功能(néng)$this->display('add');}}
三種模闆布局方式中,第一(yī)種和(hé)第三種是(shì)在程序中配置實現γ₹✔(xiàn)模闆布局,第二種方式則是(shì¥>)單純通(tōng)過模闆标簽在模闆中使>±®用(yòng)布局。具體(tǐ)選擇什(₩€®£shén)麽方式,需要(yào)根據項目的(de)實際情況來(lái)☆♦了(le)。




