継承機能は、オブジェクト指向プログラミングの考え方をテンプレートに導入したものです。 これを使うと、ひとつあるいは複数の基底テンプレートを継承して子テンプレートを作ることができます。 継承とは、子テンプレートが親の名前付きブロックをオーバーライドできるということです。
継承ツリーは好きなだけ深くすること (つまり、あるファイルを継承したファイルを継承したファイルを… ということ) ができます。
子テンプレートでは、オーバーライドした {block}
タグの内部のコンテンツ以外を変更することはできません。
{block}
タグの外側に書いた内容は削除されます。
子テンプレートと親テンプレートの {block}
タグの内容をマージすることができます。その場合は、
{block} タグのオプションのフラグ
append あるいは prepend と、プレースホルダ
{$smarty.block.parent} あるいは {$smarty.block.child} を使います。
テンプレートの継承はコンパイル時に行われ、コンパイル後はひとつのテンプレートファイルになります。
子テンプレートを使う手法のひとつである {include}
タグによるインクルードと比べて、レンダリング時のパフォーマンスがはるかに優れています。
子テンプレートが親テンプレートを継承するときには
{extends}
タグを使います。このタグは、子テンプレートの最初の行になければなりません。
テンプレートファイルで {extends}
タグを使う方法のほかに、PHP スクリプト側でテンプレートの継承ツリー全体を定義することもできます。
その場合は、fetch() あるいは
display() をコールするときに
テンプレートリソース型 extends: を使います。
後者の方法のほうが柔軟性があります。
$compile_check が有効な場合は、起動するたびに
継承ツリーの全ファイルの更新チェックを行います。そのため、実際の運用時には
$compile_check を無効にするとよいでしょう。
{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}
mypage.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: リソース
も参照ください。