模板繼承 繼承是從面向對象編程而來的概念,模板繼承能夠讓你定義一個或多個父模板,提供給子模板來進行擴展。 擴展繼承意味着子模板能夠覆蓋部分或所有父模板的塊區域。php
繼承結構能夠是多層次的,因此你能夠繼承於一個文件,而這個文件又是繼承於其餘文件,等等。css
在覆蓋父模板的{block}塊之外的地方, 子模板不能定義任何內容。任何在{block}之外的 內容都會被自動忽略。html
在子模板和父模板中的{block}內容,能夠經過 append 和 prepend來進行合併。 {block}的選項,和 {$smarty.block.parent} 或 {$smarty.block.child}會持有這些內容。編程
模板繼承在編譯時將編譯成單獨的一個編譯文件。對比效果類似的{include}包含模板功能,模板繼承的性能更高。app
子模板繼承使用{extends}標籤, 該標籤必定放要在子模板的第一行。 另外一種作法是將整個模板繼承樹,在PHP程序調用fetch() 或 display()的時候, 用extends:的模板資源類型,該作法有更大的靈活性。性能
Note 當開啓了$compile_check,繼承樹裏面的所有文件都會在每次調用的時候檢查是否有修改。 所以,在生產環境中你最好關閉$compile_check。fetch
Note 若是你的子模板裏面有用到{include} 來包含模板,而被包含的模板裏面存在供{include}模板 調用的{block}區域, 那麼在最頂層的父模板裏面,你須要放置一個空的 {block} 來做爲繼承。spa
Example 17.6. 模板繼承例子code
layout.tpl (父模板)htm
<html> <head> <title>{block name=title}默認頁面標題{/block}</title> {block name=head}{/block} </head> <body> {block name=body}{/block} </body> </html>
myproject.tpl (子模板)
{extends file='layout.tpl'} {block name=head} <link href="/css/mypage.css" rel="stylesheet" type="text/css"/> <script src="/js/mypage.js"></script> {/block}
mypage.tpl (孫子模板)
{extends file='myproject.tpl'} {block name=title}個人頁面標題{/block} {block name=head} <link href="/css/mypage.css" rel="stylesheet" type="text/css"/> <script src="/js/mypage.js"></script> {/block} {block name=body}個人HTML頁面內容在這裏{/block}
顯示上面的模板
$smarty->display('mypage.tpl');
頁面將輸出:
<html> <head> <title>個人頁面標題</title> <link href="/css/mypage.css" rel="stylesheet" type="text/css"/> <script src="/js/mypage.js"></script> </head> <body> 個人HTML頁面內容在這裏 </body> </html>
Example 17.7. 用extends:來進行模板繼承
代替模板內使用{extends}的繼承方式, 你能夠經過在PHP內定義繼承樹來進行繼承,使用 extends:的資源類型。
下面的代碼將返回和上面例子同樣的結果:
<?php $smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl'); ?>