テンプレートの継承

継承機能は、オブジェクト指向プログラミングの考え方をテンプレートに導入したものです。 これを使うと、ひとつあるいは複数の基底テンプレートを継承して子テンプレートを作ることができます。 継承とは、子テンプレートが親の名前付きブロックをオーバーライドできるということです。

注意

$compile_check が有効な場合は、起動するたびに 継承ツリーの全ファイルの更新チェックを行います。そのため、実際の運用時には $compile_check を無効にするとよいでしょう。

注意

{include} でインクルードしたテンプレートに {block} エリアが含まれている場合にそれが正しく機能するのは、 {include} 自身がそれを囲む {block} の中でコールされたときだけです。最終的な親テンプレートには、ダミーの {block} が必要になるでしょう。

例 17.6. テンプレートの継承の例

layout.tpl (親)


<html>
<head>
  <title>{block name=title}Default Page 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}My Page 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}My HTML Page Body goes here{/block}

  

これらをレンダリングするには、次のようにします。


 $smarty->display('mypage.tpl');

結果は、このようになります。


<html>
<head>
  <title>My Page Title</title>
  <link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
  <script src="/js/mypage.js"></script>
</head>
<body>
My HTML Page Body goes here
</body>
</html>

例 17.7. テンプレートリソース extends: による継承

テンプレートファイルで {extends} タグを使うかわりに、PHP スクリプトの中でリソース型 extends: を使って継承ツリーを定義することもできます。

次のコードは、先ほどの例と同じ結果を返します。


<?php
$smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl'); 
?>

   

{block}{extends} および extends: リソース も参照ください。