Home > php > CakePHP日記:Smaryテンプレート内での配列生成

CakePHP日記:Smaryテンプレート内での配列生成

  • 2007-03-29
  • php

CakePHPからSmartyを使うのは一見いいとこどりのようで、実際結構大変かもしれない。

素のCakePHPだと

<p>Title: <?php echo $html->input('Post/title', array('size'=>40, 'class'=>'classname'))}</p>

みたいな感じのものを、Smartyテンプレート内では配列を生成できないので、

{assign_assoc var='ArrayName' value='size=>40,class=>classname'}
<p>Title: {$html->input('Post/title', $ArrayName)}</p>

と書こうという話。そんなassignは個人的に許せないわけですよ。 CakePHPのbasic.phpにはaとかaaとかhとかprとか色々便利な関数があるのと、 Smartyテンプレート内では関数を自由に呼び出すことはできないけど、 テンプレート変数のメソッドなら治外法権という性質を利用して、 SmartyViewにラッパーメソッドを追加。

function aa() {
    $args = func_get_args();
    return call_user_func_array('aa', $args);
}

SmartyViewのインスタンスは$viewとしてテンプレート内から参照できるので、

<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>

と書くことができる。邪道な気もしますが。あと、同様にprも追加しておいた。

あと、テンプレート変数をヘルパーの引数に渡したい時とかどうしよう(ループカウンタとか)。 $view->Smarty->get_template_vars()かなぁ。どんどん道を外れていく気がする。

2007-04-03 追記:CakePHP日記:SmartyからHTMLヘルパーの属性を指定する

Writeback:2

CakePHP日記:CakePHPでSmartyを使う時のTips from memo-space 2007/04/11 (Wed) 17:47:15
CakePHPでViewにSmartyViewを使う時、おおざっぱにいうとこんな動きになっています。コントローラがビューに変数を渡すビューがSmartyに変数を渡す(ついでに自分自身をviewというSmarty変数に登録する)レンダリングこのように、変数のコピーが2度発生します。{$post.id} // これはSmartyの変数{$html->link('linkto', $post.id)} // この$postはPHPの(SmartyViewがセットした)変数ここで困るのは、レンダリング中にセットされた変数はSmartyの世界からしか見えないこうことです。典型的な例としてはループで使われる変数です。ブログチュートリアルを例にとると、A.8. Posts Controller の作成 link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>これをSmatryで書くとこうなります。{foreach from=$posts item=post} {$post.Post.id} {*$html->link($post.Post.title, "/posts/view" . $post.Post.id) これはエラー*} {*$html->link($post.Post.title, "/posts/view/$post.Post.id") これは予想通りに動かない*} url("/posts/view/")}{$post.Post.id}">{$post.Post.title}$postは実行時にセットされる変数なので、$html->link()から参照することができません。なので最後の例のように$html->link()ではなく$html->url()を使わないとダメなのかなぁと思っていましたが、こんな風に書けることに気づきました。 {$html->link($post.Post.title, "/posts/view/`$post.Post.id`")}Smartyではバッククォートで評価順を制御することができるようです。Smartyマニュアル:ダブルクォート内に埋め込まれた変数ついでにこちらもどうぞ。memo-space :: CakePHP日記:Smaryテンプレート内での配列生成
$view => $this では? from yanoshin 2007/06/15 (Fri) 05:55:09
ども、Smarty+CakePHPで同様の悩みにぶち当たってしまい、参考にさせていただきました。

>$view->aa('size', 40,…

とありますが、この$viewって、実際は$thisではないでしょうか?
私の環境では$viewはだめで、$thisにしたら動作したため… もし間違っていたらすみません。
Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/php/e070329_smarty.trackback

Page Top