Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Advertisement

テンプレートの継承

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

  • 継承ツリーは好きなだけ深くすること (つまり、あるファイルを継承したファイルを継承したファイルを… ということ) ができます。

  • 子テンプレートでは、オーバーライドした {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: リソース も参照ください。