溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中Smarty模板如何實(shí)現(xiàn)模板繼承

發(fā)布時(shí)間:2021-10-19 10:30:40 來源:億速云 閱讀:86 作者:小新 欄目:web開發(fā)

這篇文章主要介紹PHP中Smarty模板如何實(shí)現(xiàn)模板繼承,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

{extends}
模板繼承中,你可以在子模板內(nèi)使用{extends}標(biāo)簽來擴(kuò)展父模板。
1.{extends}必須放在模板的第一行。
2.如果子模板要用{extends}來擴(kuò)展父模板,那么它只能有 {block}的區(qū)域。

3.任何其他的模板內(nèi)容都會(huì)被忽略。

擴(kuò)展使用在$template_dir 之外的文件,請(qǐng)使用模板資源的語法。

Note
當(dāng)你擴(kuò)展一個(gè)父模板名稱的變量如{extends file=$parent_file},

請(qǐng)確保$parent_file變量放到同一個(gè) $cache_id中. 否則Smarty無法辨別不同的$parent_file變量。

parent.php頁面

<?php 
//創(chuàng)建smarty對(duì)象
require_once './libs/Smarty.class.php';
//定義根目錄
define('ROOT', str_replace("\\", "/",dirname(__FILE__))."/");
//實(shí)例化Smarty類
$smarty=new Smarty();
//設(shè)定定界符
$smarty->left_delimiter="<{";
$smarty->right_delimiter="}>";
//設(shè)置為false 定界符號(hào)左右可以有空格
$smarty->auto_literal = false;

//添加一個(gè)插件的目錄
//$smarty->setPluginsDir(ROOT."/libs/myplugins/");

//注意添加一個(gè)插件,要把系統(tǒng)默認(rèn)設(shè)置的路徑加入 否則不能使用默認(rèn)系統(tǒng)的插件
$smarty->setPluginsDir(array(
    ROOT."/libs/plugins/",//系統(tǒng)默認(rèn)設(shè)置的路徑
    ROOT."/libs/myplugins/",//自定義的
));

//變量輸出
$smarty->display('parent.tpl');

?>

child.php頁面

<?php 
//創(chuàng)建smarty對(duì)象
require_once './libs/Smarty.class.php';
//定義根目錄
define('ROOT', str_replace("\\", "/",dirname(__FILE__))."/");
//實(shí)例化Smarty類
$smarty=new Smarty();
//設(shè)定定界符
$smarty->left_delimiter="<{";
$smarty->right_delimiter="}>";
//設(shè)置為false 定界符號(hào)左右可以有空格
$smarty->auto_literal = false;

//變量輸出
$smarty->display('child.tpl');

?>

parent.tpl頁面

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <title><{block name="one"}>This is a title<{/block}></title>
</head>
<body>
<{block name="two"}>This is a content....<{/block}>
<{block name="three"}>我是<{/block}>
<{block name="four"}>中國<{/block}>
<{block name="five"}>電影<{/block}>
<{block name="six"}>我要去<{$smarty.block.child}>上大學(xué)<{/block}>
</body>
</html>

child.tpl頁面

<{extends 'parent.tpl'}>
<{block name="one"}>我是第一個(gè)block<{/block}>
<{block name="two"}>我是第二個(gè)block<{/block}>
<{block name="three" append}>津沙港灣<{/block}>
<{block name="four" prepend}>我愛你,<{/block}>
<{block name="five" }>你喜歡看<{$smarty.block.parent}>嗎?<{/block}>
<{block name="six" }>上海<{/block}>

瀏覽器輸出(child.php頁面輸出)

我是第二個(gè)block
我是津沙港灣
我愛你,中國
你喜歡看電影嗎?
我要去上海上大學(xué)

模板繼承
繼承是從面向?qū)ο缶幊潭鴣淼母拍睢?/p>

模板繼承可以讓你定義一個(gè)或多個(gè)父模板,提供給子模板來進(jìn)行擴(kuò)展。

擴(kuò)展繼承意味著子模板可以覆蓋部分或全部父模板的塊區(qū)域。

繼承結(jié)構(gòu)可以是多層次的,所以你可以繼承于一個(gè)文件,而這個(gè)文件又是繼承于其他文件,等等。

在覆蓋父模板的{block}塊以外的地方, 子模板不能定義任何內(nèi)容。

任何在{block}以外的 內(nèi)容都會(huì)被自動(dòng)忽略。

在子模板和父模板中的{block}內(nèi)容,可以通過 append 和 prepend來進(jìn)行合并。

{block}的選項(xiàng),和 {$smarty.block.parent} 或 {$smarty.block.child}會(huì)持有這些內(nèi)容。

模板繼承在編譯時(shí)將編譯成單獨(dú)的一個(gè)編譯文件。

對(duì)比效果相似的{include}包含模板功能,模板繼承的性能更高。

子模板繼承使用{extends}標(biāo)簽, 該標(biāo)簽一定放要在子模板的第一行。

另一種做法是將整個(gè)模板繼承樹,在PHP程序調(diào)用fetch() 或 display()的時(shí)候,

用extends:的模板資源類型,該做法有更大的靈活性。

Note
當(dāng)開啟了$compile_check,繼承樹里面的全部文件都會(huì)在每次調(diào)用的時(shí)候檢查是否有修改。

因此,在生產(chǎn)環(huán)境中你最好關(guān)閉$compile_check。

Note
如果你的子模板里面有用到{include} 來包含模板,而被包含的模板里面存在供{include}模板 調(diào)用的{block}區(qū)域, 那么在最頂層的父模板里面,你需要放置一個(gè)空的 {block} 來作為繼承。

以上是“PHP中Smarty模板如何實(shí)現(xiàn)模板繼承”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI