1. 程式人生 > >smarty中的母板極制_extends和block標籤

smarty中的母板極制_extends和block標籤

模板繼承 繼承是從面向物件程式設計而來的概念,模板繼承可以讓你定義一個或多個父模板,提供給子模板來進行擴充套件。 擴充套件繼承意味著子模板可以覆蓋部分或全部父模板的塊區域。

繼承結構可以是多層次的,所以你可以繼承於一個檔案,而這個檔案又是繼承於其他檔案,等等。

在覆蓋父模板的{block}塊以外的地方, 子模板不能定義任何內容。任何在{block}以外的 內容都會被自動忽略。

在子模板和父模板中的{block}內容,可以通過 append 和 prepend來進行合併。 {block}的選項,和 {$smarty.block.parent} 或 {$smarty.block.child}會持有這些內容。

模板繼承在編譯時將編譯成單獨的一個編譯檔案。對比效果相似的{include}包含模板功能,模板繼承的效能更高。

子模板繼承使用{extends}標籤, 該標籤一定放要在子模板的第一行。 另一種做法是將整個模板繼承樹,在PHP程式呼叫fetch() 或 display()的時候, 用extends:的模板資源型別,該做法有更大的靈活性。

Note 當開啟了$compile_check,繼承樹裡面的全部檔案都會在每次呼叫的時候檢查是否有修改。 因此,在生產環境中你最好關閉$compile_check。

Note 如果你的子模板裡面有用到{include} 來包含模板,而被包含的模板裡面存在供{include}模板 呼叫的{block}區域, 那麼在最頂層的父模板裡面,你需要放置一個空的 {block} 來作為繼承。

Example 17.6. 模板繼承例子

layout.tpl (父模板)

複製程式碼
<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'); 
?>
轉自:http://www.cnblogs.com/a-xu/p/4177776.html