継承機能は、オブジェクト指向プログラミングの考え方をテンプレートに導入したものです。 これを使うと、ひとつあるいは複数の基底テンプレートを継承して子テンプレートを作ることができます。 継承とは、子テンプレートが親の名前付きブロックをオーバーライドできるということです。
継承ツリーは好きなだけ深くすること (つまり、あるファイルを継承したファイルを継承したファイルを… ということ) ができます。
子テンプレートでは、オーバーライドした
{block}タグの内部のコンテンツ以外を変更することはできません。{block}タグの外側に書いた内容は削除されます。子テンプレートと親テンプレートの
{block}タグの内容をマージすることができます。その場合は、{block}タグのオプションのフラグappendあるいはprependと、プレースホルダ{$smarty.block.parent}あるいは{$smarty.block.child}を使います。テンプレートの継承はコンパイル時に行われ、コンパイル後はひとつのテンプレートファイルになります。 子テンプレートを使う手法のひとつである
{include}タグによるインクルードと比べて、レンダリング時のパフォーマンスがはるかに優れています。子テンプレートが親テンプレートを継承するときには
{extends}タグを使います。このタグは、子テンプレートの最初の行になければなりません。 テンプレートファイルで{extends}タグを使う方法のほかに、PHP スクリプト側でテンプレートの継承ツリー全体を定義することもできます。 その場合は、fetch()あるいはdisplay()をコールするときに テンプレートリソース型extends:を使います。 後者の方法のほうが柔軟性があります。
Note
$compile_check が有効な場合は、起動するたびに
継承ツリーの全ファイルの更新チェックを行います。そのため、実際の運用時には
$compile_check を無効にするとよいでしょう。
Note
{include}
でインクルードしたテンプレートに
{block}
エリアが含まれている場合にそれが正しく機能するのは、
{include}
自身がそれを囲む {block}
の中でコールされたときだけです。最終的な親テンプレートには、ダミーの
{block}
が必要になるでしょう。
Example 15.6. テンプレートの継承の例
layout.tpl (親)
<html>
<head>
<title>{block name=title}Default Page Title{/block}</title>
<span style="color: blue">{block name=head}{/block}</span>
</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}
myproject.tpl (孫)
{extends file='project.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>
Example 15.7. テンプレートリソース extends: による継承
テンプレートファイルで {extends}
タグを使うかわりに、PHP スクリプトの中でリソース型 extends:
を使って継承ツリーを定義することもできます。
次のコードは、先ほどの例と同じ結果を返します。
<?php
$smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl');
?>
{block}、
{extends}
および
extends: リソース
も参照ください。
