(cakePHP)コントローラからモデルにアクセス
久しぶりにcakePHPに開発に復帰しましたが、2週間ほど離れただけで早くもいろいろ忘れています。
今回バリデートの機能の豊富さを見越してcakePHPを1.2にバージョンアップさせました。
その時のメモはまた後日公開します。
ところでcakePHP1.2ではビューの入力に使ってたHtmlヘルパーの大半がFormヘルパーに移行されてます。
よく使うのは $form->input でしょう。これも大幅機能強化されたみたいで、日付の入力のセレクトボックスとかも1.1時代より簡単に使えるようになった気がします。(これについても後日)
で、日付入力セレクトボックス作ったのですが、この値は指定したモデルに下記のような配列で格納されてました。
Array ( [year] => 1966 [month] => 11 [day] => 07 )
今、入力後に確認画面に飛ぶようなつくりにしているのですが、確認ビュー側で下記のようにしてやってもArrayと表示されるだけで値が取れません。
$form->value('Member.mem_birthday.year')
DBに保存するときもyyyyMMddという文字列で保存したいということでコントローラ側でデータを加工してから(単一の文字列にしてから)DBに渡すことにしました。
で、いきなりつまずいたのが、コントローラからモデルの中身にどやったらアクセスできるの? ということです。
cakePHPには debug() 関数たるものがあって、これで簡単に変数がのぞけます。
これを駆使した結果下記のようにしてコントローラからモデル(日付セレクトボックスの値)にアクセスできることが判明しました。
//ビューから送られてきた日付セレクトボックス( $form->input の "type" => "date" )でできたモデルに格納された値を取得。 debug( $this->data['Member']['mem_birthday']['year']); debug( $this->data['Member']['mem_birthday']['month']); debug( $this->data['Member']['mem_birthday']['day']); //DBから拾ってきたモデル本体の値をとるには debug( $this->Member->data['Member']['mem_birthday']['year'] ); debug( $this->Member->data['Member']['mem_birthday']['month'] ); debug( $this->Member->data['Member']['mem_birthday']['day'] );
上と下では意味が違うみたいなので注意。
上のほうはビューから送られてきたデータです。
下は本当のモデルです。
しかし、本当にこの方法でいいのかは不明です。
では確認画面として使ってるビューのほうでどうやれば取り出せるのか試してみました。
どうやら下記のようにするとうまくいくようです。
$form->value('Member.mem_birthday.year')
ドットで区切れば配列であっても見えるということですね。
これで確認画面から送られてきたモデルを加工し、配列から文字列に直してDBにセットすればOKというわけです。