CakePHPのbindModelとunbindModel

CakePHPで各々のModelにアソシエーションを設定してて、

検索で使いたくないときはunbindModelを使うとはずせる。

Modelに定義してないけど、今回だけアソシエーションにしたい場合はbindModelで設定できる。

それは知っていたんだけど、unbindModelとbindModelを使用して、paginateを使用したら検索がうまくいかなかった。

paginateはcountのSQLを実行した後、中身を取るSQLを実行してくれるんだけど、

ログを見たらcountのSQLには指定したunbindModelとbindModelは適用されてるのだけど、2回目のSQLにはされてなかった。

試しに2回unbindModelとbindModelを実行したらうまくいったよ。

しかし、絶対もっといい方法があるよなぁとか思いつつ、model.phpのソースをみたら、

引数に$resetなるものが。

コメントはIf $reset is false, association will not be reset to the originals defined in the model

$resetにfalseを渡せばモデルで定義されたアソシエーションに戻りませんよって感じかな。

結局、$resetにfalseを渡してあげたらうまくいった。

そりゃ当然想定されてるよね。

今までページネーションが必要な時に、bindModelとかを使用したことがなかったんだなぁ。

このページのトップに戻る
投稿日:2008/6/27  投稿者:zuya  コメント(1)

Smartyで困ったこと

smartyはあんまり使用してなかったのですが、最近本格的に使い始めました。
それで今日困ったことをメモ。

smartyを使っていて、表示項目を簡単にエスケープしたかった。
そしたらdefalut_modeifiresってのを発見。
こいつを指定してやればhtmlを全ての変数に指定したエスケープを行ってくれるらしい。

こりゃ便利だなと思って、とりあえず下のようにhtmlを指定した。

結果、今まで正常に動いてた画面にエラーが。
どうもこいつを指定してやると、{foreach}とかで使用している、配列もエスケープしてるようだ。

とりあえず、エスケープは下のように1つ1つやるしかないのかな。

で、困ったのがここからでdefalut_modeifiresを指定した部分を消してもエラーが消えなくなった。

原因はキャッシュだった。
smartyは意識しなくてもキャッシュを残して速度を上げてくれるそうで。
エラー時のキャッシュが残ったままだったのが原因だったみたい。
キャッシュを消したら、元通り動くようになった。

便利な機能だけど、意識してないとまた起きてもおかしくなさそうだなぁ。
覚えておかないと。

このページのトップに戻る
投稿日:2008/6/6  投稿者:zuya  コメント(2)