CakePHP 完全 smarty 化への道
結局諦めきれずに bake の smarty 化に取り組み始めたわけですが。
CakePHP は rails を手本に下だけあってなんつーかよくできてて、
bake に手を入れるのも元ファイルに手を加えずに
別のコマンド作るところまでは結構サクサク進めました。
で、スクリプト中に埋め込まれてる bake の元テンプレートを
smarty テンプレートとして切り出し始めたわけです。
(これがやりたかった)
で、smarty で配列をどうやって扱うかってのはこちらの方がサクッとクリアしてるので、
テンプレート変数のメソッドなら治外法権という性質を利用して、 SmartyViewにラッパーメソッドを追加。
function aa() { $args = func_get_args(); return call_user_func_array('aa', $args); }SmartyViewのインスタンスは$viewとしてテンプレート内から参照できるので、
Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}と書くことができる。邪道な気もしますが。
楽勝かと思いきや、html ヘルパーのlink で上手くいかないんですよ
/** * ↓本来この形が想定されてるので、パラメタが渡せない * array('action'=>'edit', 2) */ $html->link('Edit', $view->aa('action', 'edit', 2))
で、SmartyView のメソッドをこんなんにしました。
function _array() { $args = func_get_args(); $array = array(); foreach ($args as $key=>$var) { if (ereg("=>", $var)) { $keys = split("=>", $var); $array[$keys[0]] = $keys[1]; } else { $array[$key] = $var; } } return $array; }
で、こう使う
/** * 'action=>edit' であって、'action'=>'edit'ではない */ $html->link('Edit', $view->_array('action=>edit', 2))
せっかくのスマートなソースをぐだぐだに書き換えつつ
どんどん道を外れていく気がする。
とのたまったこの方の懸念のさらに斜め下を進んでる気がする。