継承機能は、オブジェクト指向プログラミングの考え方をテンプレートに導入したものです。 これを使うと、ひとつあるいは複数の基底テンプレートを継承して子テンプレートを作ることができます。 継承とは、子テンプレートが親の名前付きブロックをオーバーライドできるということです。
継承ツリーは好きなだけ深くすること (つまり、あるファイルを継承したファイルを継承したファイルを… ということ) ができます。
子テンプレートでは、オーバーライドした
{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:
リソース
も参照ください。