MW211 EXIT

devlog
Smarty/テンプレート部品のアサイン
2011年12月23日
テンプレートのヘッダ部(header.tpl)とフッタ部(footer.tpl)を共通にして
それぞれのテンプレートからアサインする方法は以下の通り。
┌──────────────────────────────────────┐
│{include file='header.tpl'}                                                 │
│:                                                                          │
│{include file='footer.tpl'}                                                 │
└──────────────────────────────────────┘
PHPの「require」と同じでソースがベタに展開される。
当該テンプレートに「ヘッダ変数・フッタ変数」が記述されていなくても
「include」された先に定義があれば、記述したのと同じような感じになる。

なので、以下のような流れになるだろう。
┌──────────────────────────────────────┐
│$smarty = new Smarty;                                                       │
│$smarty->assign('ヘッダ変数', 値);                                          │
│$smarty->assign('フッタ変数', 値);                                          │
│$smarty->display('テンプレート.tpl');                                       │
├──────────────────────────────────────┤
│{include file='header.tpl'}                                                 │
│:                                                                          │
│{include file='footer.tpl'}                                                 │
└──────────────────────────────────────┘

一方、fetchメソッドを使えば、部分ごとに出力結果を確定させてしまうことができ、
この結果をまとめると上記と同様な感じになる。
┌──────────────────────────────────────┐
│$smarty = new Smarty;                                                       │
│$smarty->assign('ヘッダ変数', 値);                                          │
│$header = $smarty->fetch('header.tpl');                                     │
├──────────────────────────────────────┤
│$smarty = new Smarty;                                                       │
│$smarty->assign('フッタ変数', 値);                                          │
│$footer = $smarty->fetch('footer.tpl');                                     │
├──────────────────────────────────────┤
│$smarty = new Smarty;                                                       │
│$smarty->assign('header', $header);                                         │
│$smarty->assign('footer', $footer);                                         │
│$smarty->display('テンプレート.tpl');                                       │
├──────────────────────────────────────┤
│{$header}                                                                   │
│:                                                                          │
│{$footer}                                                                   │
└──────────────────────────────────────┘

前者と後者の違いは、後者はfetchしてしまうと確定してしまうので、
assignしても効果がない(つまり後で(←処理中の話)変更がきかない)。
しかし、後者の大きな利点は変数のスコープが絞り込まれるので
変数名の自由度が高くなるところ。
ローカル変数とグローバル変数の違いのようなもんだ。
分類:Smarty