首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 模板繼承機制詳解:佈局佈局與區塊覆寫實戰

     編輯:PHP 相關知識

ThinkPHP 模板繼承機制詳解:佈局佈局與區塊覆寫實戰

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>

關鍵規則與最佳實踐

  1. <extend> 必須放在文件第一行(除註釋外),否則無效
  2. 子模板只能包含 <block> 標籤,不能有其他輸出內容
  3. 區塊名稱唯一:父模板中每個 name 僅能出現一次
  4. 可選覆寫:子模板可選擇性覆寫部分區塊,未覆寫則使用父模板默認內容
  5. 多層繼承:支持 A 繼承 B,B 繼承 C,但建議不超過 3 層

進階技巧:區塊追加與預設內容

1. 追加父區塊內容(而非完全覆寫)

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>

2. 父模板提供默認內容,子模板可選擇替換

<!-- 父模板 -->
<block name="sidebar">
    <div class="sidebar">默認側邊欄</div>
</block>

<!-- 子模板 A:使用默認 -->
<!-- 不寫 sidebar block -->

<!-- 子模板 B:完全替換 -->
<block name="sidebar">
    <div class="sidebar custom">自定義側邊欄</div>
</block>

模板繼承 vs 模板包含 對比

特性模板繼承 (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

常見問題 FAQ

Q: 子模板中變量不生效?
A: 確認控制器 assign() 正確,模板中用 {$var} 輸出。繼承不影響變量作用域
Q: 如何在父模板中判斷當前子模板?
A: 使用 Think.__ACTION__、Think.__CONTROLLER__、Think.__MODULE__ 模板常量
Q: 繼承鏈過長導致渲染慢?
A: 減少繼承層級,合理拆分組件用 include,開啟模板緩存 'TMPL_CACHE_ON'=>true

模板繼承是 ThinkPHP 模板引擎最強大特性之一,善用它能構建清晰、可維護、高復用的視圖層架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved