ThinkPHP 模板引擎支持模板繼承,通過 <extend> 和 <block> 標籤實現「父模板定義骨架,子模板填充內容」的模式,極大減少重複代碼,提升維護效率。
| 標籤 | 用途 | 屬性 |
|---|---|---|
<block name="xxx"> | 定義可覆寫區塊 | name (必填) |
<extend name="xxx" /> | 繼承父模板 | name (必填,父模板路徑) |
<include file="xxx" /> | 包含其他模板 | file (必填) |
文件:Tpl/Public/base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><block name="title">默認標題</block></title>
<block name="css"></block>
</head>
<body>
<!-- 頂部廣告區塊 -->
<block name="top">
<div style="border:1px solid gray;background:#abcdef;height:100px;">默認頂部廣告</div>
</block>
<!-- 主體內容區塊 -->
<block name="body">
<div style="border:1px solid gray;background:#abcdef;height:100px;">默認主體內容</div>
</block>
<!-- 底部廣告區塊 -->
<block name="footer">
<div style="border:1px solid gray;background:#abcdef;height:50px;">默認底部廣告</div>
</block>
</body>
</html>
文件:Tpl/User/profile.html
<extend name="Public:base" />
<block name="title">用戶資料 - 我的網站</block>
<block name="css">
<link rel="stylesheet" href="__PUBLIC__/Css/user.css" />
</block>
<block name="top">
<include file="Public:header" />
</block>
<block name="body">
<div class="user-profile">
<h2>用戶資料</h2>
<p>用戶名:{$username}</p>
<p>郵箱:{$email}</p>
<p>註冊時間:{$reg_time}</p>
</div>
</block>
<block name="footer">
<include file="Public:footer" />
</block>
<extend> 必須放在文件第一行(除註釋外),否則無效<block> 標籤,不能有其他輸出內容name 僅能出現一次ThinkPHP 不直接支持 append,但可通過變量實現:
<!-- 父模板 -->
<block name="css">
<link rel="stylesheet" href="__PUBLIC__/Css/base.css" />
{$extra_css|default=''}
</block>
<!-- 子模板 -->
<block name="css">
<php>$extra_css = '<link rel="stylesheet" href="__PUBLIC__/Css/user.css" />';</php>
</block>
<!-- 父模板 -->
<block name="sidebar">
<div class="sidebar">默認側邊欄</div>
</block>
<!-- 子模板 A:使用默認 -->
<!-- 不寫 sidebar block -->
<!-- 子模板 B:完全替換 -->
<block name="sidebar">
<div class="sidebar custom">自定義側邊欄</div>
</block>
| 特性 | 模板繼承 (extend/block) | 模板包含 (include) |
|---|---|---|
| 關係 | 父子繼承,結構化 | 平級組合,片段化 |
| 複用粒度 | 頁面級佈局 | 組件級片段 |
| 覆寫機制 | 區塊級覆寫 | 無覆寫,直接輸出 |
| 適用場景 | 整站佈局、多頁面共用骨架 | 導航欄、側邊欄、表單組件 |
| 組合使用 | 父模板中 include 公共組件,子模板 extend 父模板 | |
Tpl/
├── Public/
│ ├── base.html # 根佈局模板
│ ├── header.html # 頁頭組件
│ ├── footer.html # 頁腳組件
│ └── sidebar.html # 側邊欄組件
├── Home/
│ ├── index.html # extend Public:base
│ └── about.html
├── User/
│ ├── profile.html # extend Public:base
│ └── settings.html
└── Admin/
└── layout.html # extend Public:base (後台不同佈局)
├── index.html # extend Admin:layout
└── user_list.html
assign() 正確,模板中用 {$var} 輸出。繼承不影響變量作用域Think.__ACTION__、Think.__CONTROLLER__、Think.__MODULE__ 模板常量include,開啟模板緩存 'TMPL_CACHE_ON'=>true模板繼承是 ThinkPHP 模板引擎最強大特性之一,善用它能構建清晰、可維護、高復用的視圖層架構。