2007年08月07日

invalidateの使い方

実は下記のスレッドには非常に重要なことが書いてあります。
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']
という形でのアクセスになります。
posted by SDozono at 21:23| 東京 ☁| Comment(0) | TrackBack(0) | CakePHP Tips | このブログの読者になる | 更新情報をチェックする