2006年07月16日

form と $data の連携メカニズム

通常、素のPHP で入力フォームを作る際、名前などは任意に付けてしまいます。そして受ける側で、それを読み取り、データベースに入れる、という動作をします。

例えば:

1)入力フォーム:<input name="name" >

2)入力フォームから受ける.php: $name = $_POST['name'];

そして、3)サニタイズ+4)(データの加工)+5)データの検証+6)データベースへ、という形になります。

問題として、

★1)の名前がどんなものでもよい。ルール(規則)が何もない。⇒ページごとに、または開発者ごとに名前の付け方がばらばらになる可能性がある。
★5)で失敗した場合にどうやって1)まで戻すか〔他の正しいデータフィールドをどうするか〕という問題が生じる。

などが往々にして生じます。これまではみんなそれで苦労しました。ところが、CakePHP には、そのあたりを解決する手法が組み込まれています。

★基本となるのは、
--------------------------------------------------------------
・フォームからのデータは、名前を“data['テーブル名']['フィールド名']”として送信すると、自動的に変数$dataに格納してくれる。
・Model の save メソッドは、$変数名['テーブル名']['フィールド名'] = "値"というデータを一括格納できる。
--------------------------------------------------------------
というルールです。

例えば、users テーブルの中に、name フィールドがあるとします。入力フォーム(ビュー)の中に、
--------------------------------------------------------------
echo $html->input('User/name', array('id' => 'user_name', 'size' => '40', 'value' => $users['User']['name'], ))
--------------------------------------------------------------
と書いておくと、実際の HTML には、
--------------------------------------------------------------
<input name="data[User][name]" id="user_name" size="40" value="" type="text" />
--------------------------------------------------------------
と展開されます。

ここにデータが入ってきた場合、コントローラ側では、

empty($this->User) …… データが入力されていなければ True.

という関数でデータが入ってきたかどうかを調べ、もしデータが入力されているようであれば、

$this->User->save($this->data['User'])

という一文で、“usersテーブルへの1行分のデータをすべて”、保存することができます。これを理解していると、保存前にデータを加工したり、独自のデータを計算・追加することなども可能になります。

さて、データバリデーションはどういう仕組みになっているんでしょうか……。このあたりもかなり考え抜かれています。次回へ続く。


posted by SDozono at 11:11| ロサンゼルス ☀| Comment(0) | TrackBack(0) | CakePHP Model | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
手(パー)To make a comment: Please type your name and comment. at the validation field box, type 'cakephp'. And there two glay buttons. "Preview"/"Submit". Thank you!