1.1系でも、コントローラ内で複雑なバリデーションをかける機能が標準で組み込まれているという話です。
Problems with simple invalidate test
http://groups.google.com/group/cake-php/browse_thread/thread/354a677b21779c0/
通常、bake.php や decorate.php などを使ってデータを出力すると、下記のようなコードが生成されます。
function add() {
//もしデータがPOSTされていない=一回目なら
if (empty($this->data)) {
//入力画面を出力
$this->render();
} else {
//データがPOSTされているなら、
//日付データの連結処理をする“まとめ”関数
$this->cleanUpFields();
//$this->dataの内容を保存
if ($this->Category->save($this->data)) {
$this->Session->setFlash('The Category has been saved');
$this->redirect('/categories/index');
} else {
//バリデーションに失敗したのでエラーを出力。修正を促す
$this->Session->setFlash('Please correct errors below.');
}
}
}
しかしこれを、
function add() {
//もしデータがPOSTされていない=一回目なら
if (empty($this->data)) {
//入力画面を出力
$this->render();
} else {
//データがPOSTされているなら、
//日付データの連結処理をする“まとめ”関数
$this->cleanUpFields();
//データを移動 *ここがポイント*
$this->Category->set($this->data);
//データをチェックして必要であれば、条件で下記のようなエラーを発生させる。
$this->Category->invalidate("name");
$this->Category->invalidate("ビューのtagErrorMsg()に設定する値");
//$this->dataの内容を保存
if ($this->Category->save()) { //*注意*
$this->Session->setFlash('The Category has been saved');
$this->redirect('/categories/index');
} else {
//バリデーションに失敗したのでエラーを出力。修正を促す
$this->Session->setFlash('Please correct errors below.');
}
}
}
と書き直すと、複数フィールドをまたいだバリデーション処理や、ひとつのフィールドに複数のバリデーションルールを適用することができます。
ちなみに、これまで
$this->data['Category']['name']
などとして操作していたデータは、$this->Category->set($this->data)後は、
$this->Category->data['Category']['name']
という形でのアクセスになります。