3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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というわけです。