> 模板繼承,顧名思義就是定義一個子模板,一個基礎模板,子模板內可以重寫父模板內的代碼塊
> block標簽是不支持嵌套的
### 定義基礎模板
基礎模板中可以定義任意多個名稱標識**不重復**的區塊,例如下面定義了一個`layout.html`基礎模板:
~~~html
<html>
<head>
<title>{block name="title"}標題{/block}</title>
</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="layout"}`來繼承基礎模板
* layout是基礎模板的路徑,路徑的解析參考視圖章節的[視圖文件路徑](views.md)
* `extend`代碼必須在子模板中的第一行才有效!!!
~~~html
{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"}
{loop $arr $value}
<a href="/new/{$value}">{$value}</a><br/>
{/loop}
{/block}
{block name="right"}
{if $name=='news'}<b>最新資訊:</b>{/if}
{/block}
{block name="footer"}
<ul>
<li>{parent}</li>
<li>版權</li>
<li>其他</li>
</ul>
{/block}
~~~
* 上例中,我們在子模板中使用了`extend`標簽來繼承了`layout`模板。
* 在子模板中,可以對基礎模板中的區塊進行重載定義,如果沒有重新定義的話,則表示沿用基礎模板中的區塊定義,如果定義了一個空的區塊,則表示刪除基礎模板中的該區塊內容。上面的例子,我們就把left區塊的內容刪除了,其他的區塊都進行了重載。
* 在`footer`塊中,我們用`{parent}`標簽來引用父級模板中的內容。
* 在子模板中,只能定義區塊而不能定義其他的模板內容,否則將會直接忽略,如果區塊在基礎模板中不存在,則直接忽略。
* 模板可以無限級繼承,比如B繼承了A,而C又繼承了B,最終C中的區塊會覆蓋B和A中的同名區塊。
* 注意不要形成A繼承A,或者A繼承B而B又繼承A這樣的死循環。
* 子模板中的區塊定義順序是隨意的。
- 序言
- 更新日志
- 安裝
- 規范
- 常量
- 配置
- 自動加載
- MVC
- 模塊
- 控制器
- 模型
- 視圖
- php原生模板
- 模板引擎
- 變量輸出
- 模板注釋
- 模板繼承
- 模板引用
- 流程控制
- 原樣輸出
- 服務組件
- Hook組件
- Request組件
- Router組件
- Cookie組件
- Encrypter組件
- Dispatch組件
- Response組件
- View組件
- Session組件
- Helper組件
- 數據分頁
- 數據驗證
- Logger組件
- Cache組件
- Redis組件
- Connection組件
- 執行sql語句
- 查詢生成器
- 查詢方法詳解
- Schema
- Captcha組件
- CLI
- CLI工具
- 事件
- 類事件
- 實例事件
- 全局事件
- 助手函數
- 擴展
- 異常
- 部署
- Apache
- Nginx
- IIS
- 虛擬主機