【小(xiǎo)編推薦】ThinkPHP3.2——模闆布局

2014-06-26   σ​; |  &n αbsp;發布者:梁國(guó)芳  ®₹∞± |   查看(kàn)±✘¥:3320次

Thinkphp

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

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

開(kāi)啓LAYOUT_ON後,我們的(de)模闆渲≠÷₹§染流程就(jiù)有(yǒu)所變化(huà),例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. $this->display('add');
  6. }
  7. }

在不(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)寫法:

  1. <include file="Public:header" />
  2. {__CONTENT__}
  3. <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ú):

  1. '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):

  1. '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)布局•♣♦λ循環):

  1. <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ú):

  1. <layout name="newlayout"≈☆ />

還(hái)可(kě)以在layout标簽裡(lǐ)面指定要(​£✔yào)替換的(de)特定字符串:

  1. <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ǐ)

  1. <include file="Public:header" />
  2. <div id="main" class="main" >
  3. {__CONTENT__}
  4. </div>
  5. <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à)标簽:

  1. <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ú):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout(true);
  6. $this->display('add');
  7. }
  8. }

表示當前的(de)模闆輸出啓用(yòng)了(l ¶☆e)布局模闆,并且采用(yòng)默認的(de)layout布局模闆。↔&

如(rú)果當前輸出需要(yào)使用(yòng)不(bù)同的↑ ★'(de)布局模闆,可(kě)以動态的(de)指定布局模闆名稱,≥γ例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout('Layout/newlayout');
  6. $this->display('add');
  7. }
  8. }

或者使用(yòng)layout方法動态關閉&σ✘當前模闆的(de)布局功能(néng)(這(zhè<®')種用(yòng)法可(kě)以配合第一(yī)種布局方式,例£δ©→如(rú)全局配置已經開(kāi)啓了(le)布局,可(k•>ě)以在某個(gè)頁面單獨關閉):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout(false); // 臨時(shí)關閉當前模闆的(de≈♣→<)布局功能(néng)
  6. $this->display('add');
  7. }
  8. }

三種模闆布局方式中,第一(yī)種和(hé)第三種是(shì)在程序中配置實現γ₹✔(xiàn)模闆布局,第二種方式則是(shì¥>)單純通(tōng)過模闆标簽在模闆中使>±®用(yòng)布局。具體(tǐ)選擇什(₩€®£shén)麽方式,需要(yào)根據項目的(de)實際情況來(lái)‍☆♦了(le)。