Symfony + Smarty での 問題回避メモ
Symfony で Smarty は 使わない方がいいです
冒頭から否定的ですいませんが、現状では Symfony で Smarty は使わない方がいいです。逆にメンドウ。
下記は Symfony + Smarty で作り始めて、引くに引けなくなった人のバッドノウハウです。
JavaScript が素直に書けない
ちょっとしたJavaScript関数だったらテンプレートに直書きしたい。でも素直には書けない。・・・Smartyのデリミタが'{'と'}'だから。
普通は '{ldelim}' と '{rdelim}' を使うんだろうけど、JavaScriptヘルパーとの兼ね合いでもちろん使えません。
Smartyのデリミタを変更するとか、JavaScriptヘルパーいらねえ!とかやりようはいくらでもありますが、もはやテンプレートとは呼べない代物になる。
まぁ、このケースは'{php}'で逃げれたので、素直に逃げました。
再帰的に評価してくれない
こういうのをなんて言うのか知らんが、とりあえずダメって言われた。//ダメ
{$hoge->$fuga()->piyo()}
//アリ
{$hoge->$fuga->piyo()}
返り値に対してさらに評価するって事が出来ない。さらに、今回のケースは特殊で'{php}'使えませんでした。
使えない理由として'$hoge'はSmartyの'foreach'によって生成された変数で、'{php}'内からは参照できませんでした。
'foreach' 自体(全て)を'{php}'でやるっていうのが解決法だと思ったんだけど、なんかうまくイカンかった。
・・・で、結局'assign'使った。
{foreach item="hoge" from=$hoges}
{assign var="fuga" value=$hoge->fuga()}
~
{$fuga->piyo()}
~
{/foreach}
'assign'を使って事前に戻り値を、テンプレート変数に追加する事で回避した。静的な呼び出しが出来ない
どーしても 'app.yml' に記述したデータをテンプレートで使いたい状況が発生。しかも、'layout.yml'で使いたいので、'action.class.php'とかで変数作ったりは変更箇所が多くてメンドウ。
良い方法を教えてください。それまでは自力でナントカ(下記参照)。
とりあえず、現状こうなります。
//シンタックスエラー
{sfConfig::get('hoge')}
//そんな子いません
{$sf_config->get('hoge')}
・・・困った。'$sf_config' が無いのはナゼ? セキュリティ的な対応?
そもそも、'sfConfig'のインスタンスを作ってるとこ見たこと無い。
むー。。。しょうがないので、人の道に外れても'sfConfig'のインスタンスをテンプレート内で作ることにした。
まず、'$this'をダンプしてテンプレート変数の格納場所をサーチ。
・・・結果→'$this->_tpl_vars'
(※ここの'$this'のダンプは、悪意の無いブラクラですのでご注意を!)
では、準備がととのったので実装しましょう。
//$sf_configを生成
{php}
if(!isset($this->_tpl_vars['sf_config'])){
$this->_tpl_vars['sf_config'] = new sfConfig();
}
{/php}
//$sf_configを使う
{$sf_config->get('hoge')}
はい、回避できました。でもこの問題は、正しい回避策、あるいは仕様がありそう。
随時調査します。
--
役に立たないことばかりに時間を費やしているな!オレ!
About this entry
Archive type
Individual archive
Published
2007/02/21 18:53
0 Comments