模板繼承
模(mo)(mo)(mo)(mo)板(ban)(ban)繼承(cheng)是一(yi)項更加(jia)靈活的模(mo)(mo)(mo)(mo)板(ban)(ban)布局(ju)方式,模(mo)(mo)(mo)(mo)板(ban)(ban)繼承(cheng)不同于模(mo)(mo)(mo)(mo)板(ban)(ban)布局(ju),甚至來說,應該在模(mo)(mo)(mo)(mo)板(ban)(ban)布局(ju)的上層。模(mo)(mo)(mo)(mo)板(ban)(ban)繼承(cheng)其(qi)(qi)實并不難理解,就好(hao)比(bi)類(lei)的繼承(cheng)一(yi)樣,模(mo)(mo)(mo)(mo)板(ban)(ban)也可以定義(yi)一(yi)個基(ji)礎模(mo)(mo)(mo)(mo)板(ban)(ban)(或者(zhe)是布局(ju)),并且其(qi)(qi)中定義(yi)相關的區塊(block),然后繼承(cheng)(extend)該基(ji)礎模(mo)(mo)(mo)(mo)板(ban)(ban)的子模(mo)(mo)(mo)(mo)板(ban)(ban)中就可以對(dui)基(ji)礎模(mo)(mo)(mo)(mo)板(ban)(ban)中定義(yi)的區塊進行重載。
因此,模板(ban)繼承(cheng)的(de)(de)優勢(shi)其實是(shi)設計基礎模板(ban)中的(de)(de)區塊(block)和子模板(ban)中替換這些區塊。
每個區塊由{block} {/block}標(biao)(biao)簽(qian)組成。 下面就(jiu)是基礎模板中的一(yi)個(ge)典型的區塊(kuai)設(she)計(ji)(用于設(she)計(ji)網(wang)站標(biao)(biao)題):
{block name="title"}<title>網站標題</title>{/block}
block標簽必須指定(ding)name屬(shu)性來標識(shi)當前區塊(kuai)的名稱,這個標識(shi)在當前模板中應(ying)該是唯一的,block標簽中可以包含任何(he)模板內容(rong),包括其他標簽和變(bian)量,例如:
{block name="title"}<title>{$web_title}</title>{/block}
你(ni)甚至還可(ke)以(yi)在(zai)區塊中加載外部文(wen)件:
{block name="include"}{include file="Public:header" /}{/block}
一個模板中可以定義任意多個名稱標識不重復的區塊,例如下面定義了一個base.html基礎模板:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{block name="title"}標題{/block}</title>
</head>
<body>
{block name="menu"}菜單{/block}
{block name="left"}左邊分(fen)欄{/block}
{block name="main"}主(zhu)內容{/block}
{block name="right"}右邊分欄{/block}
{block name="footer"}底部{/block}
</body>
</html>
然(ran)后(hou)我們在子(zi)模板(其實是當前操作的(de)入口模板)中(zhong)使用(yong)繼承:
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{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"}
{__block__}
@ThinkPHP 版權所有(you)
{/block}
上例中,我們可以看到在子模板中使用了extend標簽來繼承了base模板。
在(zai)子(zi)模板中,可以(yi)對基(ji)礎(chu)模板中的(de)(de)(de)區(qu)(qu)塊(kuai)進(jin)行(xing)重載(zai)定(ding)義(yi),如果沒(mei)有重新定(ding)義(yi)的(de)(de)(de)話,則表(biao)示(shi)(shi)沿用基(ji)礎(chu)模板中的(de)(de)(de)區(qu)(qu)塊(kuai)定(ding)義(yi),如果定(ding)義(yi)了(le)一個空(kong)的(de)(de)(de)區(qu)(qu)塊(kuai),則表(biao)示(shi)(shi)刪除基(ji)礎(chu)模板中的(de)(de)(de)該區(qu)(qu)塊(kuai)內容。 上面(mian)的(de)(de)(de)例子(zi),我們就把left區(qu)(qu)塊(kuai)的(de)(de)(de)內容刪除了(le),其他的(de)(de)(de)區(qu)(qu)塊(kuai)都進(jin)行(xing)了(le)重載(zai)。而
{block name="footer"}
{__block__}@ThinkPHP 版權所有
{/block}
這一區塊中有{_block_}這個(ge)標(biao)(biao)簽,當(dang)區(qu)(qu)塊(kuai)中有這個(ge)標(biao)(biao)記時,就不只是(shi)(shi)直接重載這個(ge)區(qu)(qu)塊(kuai),它表(biao)示引用所繼承(cheng)模板(ban)對應(ying)區(qu)(qu)塊(kuai)的內容(rong)到(dao)這個(ge)位置,最終(zhong)這個(ge)區(qu)(qu)塊(kuai)是(shi)(shi)合并后的內容(rong)。所以這里(li)footer區(qu)(qu)塊(kuai)最后的內容(rong)是(shi)(shi): 底(di)部@ThinkPHP 版權所有
extend標簽的用法和include標簽一(yi)樣,你(ni)也可以加載其他模板:
{extend name="Public:base" /}
或者使用絕對文件路徑加載
{extend name="./Template/Public/base.html" /}
在當(dang)前子模(mo)板中,只能(neng)定(ding)義區塊而(er)不能(neng)定(ding)義其他的模(mo)板內容,否則將會直接忽略,并且只能(neng)定(ding)義基礎模(mo)板中已經定(ding)義的區塊。
例如(ru),如(ru)果采(cai)用下(xia)面的定義:
{block name="title"}<title>{$title}</title>{/block}
<a href="/" >首頁</a>
<a href="/info/" >資訊</a>
<a href="/bbs/" >論壇</a>
導航部分(fen)將是無效的,不會顯(xian)示在模板中。
模板(ban)可以多級繼承,比如B繼承了(le)A,而(er)C又繼承了(le)B,最終C中(zhong)的區塊會覆蓋B和(he)A中(zhong)的同(tong)名區塊,但C和(he)B中(zhong)的區塊必須是A中(zhong)已定義過(guo)的。
子模(mo)板(ban)(ban)中的區塊定義(yi)順序是隨意的,模(mo)板(ban)(ban)繼承的用(yong)法關鍵在于(yu)基礎模(mo)板(ban)(ban)如何布(bu)局(ju)(ju)和(he)設(she)計規劃(hua)了,如果(guo)結合原來的布(bu)局(ju)(ju)功能,則會更(geng)加(jia)靈(ling)活。
