WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [PHP]Smarty3を使ってみる

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

SmartyのメジャーバージョンアップSmarty3のBETAが煮詰まってきた感じなので試してみました。BETAなので機能は変更されるかもしれません。

まずソースを眺めて最初に気づくのは本体であるSmarty.class.phpが異様に小さいことです。assignやdisplayといったメソッドさえも見当たりません。個々の機能は小さなクラスに分かれていて、いわゆるLazy load(遅延ロード)をとりいれているようです。必要の無い機能は読み込まないというわけです。

セットアップ


基本的には以前のバージョンの構文が使えるらしいのですが、$default_modifiersが廃止されたので、使っている場合は注意が必要です。当然smarty:nodefaultsがテンプレに書いてあってもエラーになります。

$default_modifiersの替りにvariablefilterという機構が用意されました。アサインした変数すべてにフィルターをかけるcallback(is_callableがtrueを返すもの)を指定します。(委譲したクラスを使っているので適宜読み替えてください)

public function __construct($tmplPath = null, $extraParams = array())
{
$this->_smarty->loadPlugin('smarty_modifier_escape');
//$this->_smarty->register_variablefilter(array($this, 'escape'));
//release8で_を使ったメソッド名は廃止されました。
$this->_smarty->register->variableFilter(array($this, 'escape'));
}

public function escape($value, $smarty)
{
if(is_string($value))
{
return smarty_modifier_escape($value);
}
else
{
return $value;
}
}
smarty:nodefaultsはどうするのかというと

{$form.name->render() nofilter}
nofilterをつけます。

私が試した環境は、開発途中のまだ小さな環境だったので、躓いたのはこれだけでした。あとはtemplate_dirが配列になって複数の候補を持てるようになったくらいでしょうか。

public function setScriptPath($path)
{
$this->_smarty->setTemplateDir($path);
}
メソッドがあってうまい具合に配列に変換してくれるので使うと良いかもしれません。ちなみに、互換を保つためかメンバ変数はpublicのままで名前も同じです。

テンプレート構文


テンプレートを解析するエンジンが正規表現ではなく、あれこれを使用しているらしく、テンプレの構文がかなり拡張されました。非常に使いやすくなってます。

●オブジェクトに対してメソッドの連鎖呼び出しができるようになりました。引数も渡せます。

{$record->getCategory()->getName()}
{$record->getArticle('3 days')}


●foreachの書式がPHPと同じようにかけます

{foreach $list as $item}
{$item->geName()}
{$item@key} / {$item@iteration} / {$item@total} / {$item@index} / {$item@first} / {$item@last}
{/foreach}
配列のキーやカウントなどは、@でキーワードをつないで出せます。

●assignが簡潔になりました

{$var = 'test'}


●変数の名前を変数を連結して動的に作成できるようになりました

{$var = 'test'}
{$foo_{$var}}//$foo_testを表示します


●関数の呼び出しが簡単に

{time()}
独自関数(スタティックメソッド)もいけます。デバッグ表示する場合はこんな感じ
{Sdx_Debug::dump('hoge', 'title', false) nofilter}


●特定の変数や関数のみキャッシュしない

{time()}
{time() nocache}
これはすごいですね。

●テンプレートの継承。parent.tpl、child.tpl、grandchild.tplにそれぞれ以下のように書いて継承できます。
parent.tplに



{block name='title'}My site name{/block}


{block name='page-title'}Default page title{/block}



{block name='content'}
Default content
{/block}

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。

child.tplに

{extends file='parent.tpl'}
{block name='title'}
Child title
{/block}
grandchild.tplに

{extends file='child.tpl'}
{block name='title'}Home - {$smarty.parent}{/block}
{block name='page-title'}My home{/block}
{block name='content'}
{foreach $images as $img}
{$img.description}
{/foreach}
{/block}
ヘッダーフッター、メニューなどを共有する時に便利そうです。symfonyっぽいベーステンプレートが実現できます。

●テンプレの一部をfunctionとして定義して再利用

{function name=menu level=0}

    {foreach $data as $entry}
    {if is_array($entry)}
  • {$entry@key}

  • {menu data=$entry level=$level+1}
    {else}
  • {$entry}

  • {/if}
    {/foreach}

{/function}

{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
['item3-3-1','item3-3-2']],'item4']}

{menu data=$menu}
再帰呼び出しが出来るみたいです。余談ですが正規表現で構文解析してたときは、これが難しかったらしいです。

色々便利になったようです。でも、ちょっと思ったのはテンプレがわかりづらくなるというか、デザイナー・コーダーが扱えなくなってしまうのでは、という不安があります。functionの再帰呼び出しなどは論外?!として、オブジェクトが扱いやすくなったし、ORMやフォームオブジェクトなど、今後、テンプレートでオブジェクトを扱う機会が増えるのは自明の理だと思います。

すでに「テンプレート作業はプログラマの仕事」という仕事場もあると思いますが、うちはコーダーにおしつけ?てるので、色々ケアが必要になってくるかなと、考えてます。
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。