Get Smarty

Donate

Paypal

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: リソース も参照ください。

Comments
No comments for this page.

Advertisement

Sponsors [info]

Sponsors