スパイスラボ神部です。
実験的にですが、CakePHP で formHelper を使いながら他のモデルのデータを編集する試みをしてみましたので、共有してみます。果たしてこの方法が正しいのか?というところもあわせてですので、ツッコミあれば宜しくお願いします。
コントローラとモデルの基本原則に逆らわないこと
さて、読み込みだけならご存じ var $uses に指定すればどんなモデルでも読み込めます。
そこから先、違うコントローラの中で、しかも formHelper による edit ライクな機能を実装していこうとすると問題が起こります。
1.別のユーザモデルをフォームのにセットすると、そのモデルの edit に飛んでしまう
2.User を User2 などにすると、ユーザモデルがないので formHelper による自動補完が利かない
これは不便で困ります。
私の考えた回避方法
たとえば Basic 認証をかけた Admins コントローラの中で、一般ユーザの編集モデルを作りたかったとしましょう。そういうときは
1.まず、edituser などのアクションを用意し、User データモデルの情報を ID から引っ張ってくる
2.それをいったん、Admin データモデルの ID、ユーザ ID他に代入する。
※このとき、Admin データモデルにないフィールドで、User データモデルにあるフィードでも代入可能
3.edituser アクションのビューで、モデルを Admin、フォームの action を edituser にして formHelper でフォーム作成
※IDがきっちり入力されており、$form->input で出力されているフィールドの User モデルとフィールドが合致していればフォームにあらかじめ値がセットされている状態になる。
4.edituser アクションにて、 $this->data が empty でないとき、Admin.User モデルに入ってきた値を、改めて $this->data['User'] に代入。
5.$this->User-save($this->data['User'] などとして、User データモデルに値を保存
※パスワードや created, modified などは、null すなわちなにも指定しない状態にしておけば上書きされず前回の値が使われる。
まとめ
ということで、今回は特定のデータモデルをカプセルのように使って別のユーザモデルのデータを受け渡し、なおかつ formHelper による簡単入力補完というところも実現してみました。このようなイレギュラーなやり方が認められるのかわかりませんが、とりあえず出来ましたということで共有しておきます。
関連記事



コメント ( 2 )
> 匿名さん
なんか、それで良さそうですね…無駄なエントリをあげてしまったかも。
投稿者: Ryuji | 2009年05月18日 13:15
日時: 2009年05月18日 13:15