読者です 読者をやめる 読者になる 読者になる

cakephp1.2 登録時と更新時で別のバリデートを実行したい&バリデートを複数定義して使い分けたい場合

cakephp

保守という観点でもやっぱりバリデートはmodelにまとめたいところ。

<?php
// validate1
var $validate = array(
    'col1' => array(
        // 登録時のみ
        'unique_create' =>
            array(
                'rule' => 'isUnique',
                'message' => 'err',
                'on' => 'create',
            ),
        // 更新時のみ
        'unique_update' =>
            array(
                'rule' => 'isUniqueUpdate',
                'message' => 'err',
                'on' => 'update',
            ),
    ),
);
// validate2
var $validate2 = array(
    'col2' => array(
        // 登録時のみ
        'unique_create' =>
            array(
                'rule' => 'isUnique',
                'message' => 'err',
                'on' => 'create',
            ),
        // 更新時のみ
        'unique_update' =>
            array(
                'rule' => 'isUniqueUpdate',
                'message' => 'err',
                'on' => 'update',
            ),
    ),
);

on => create,updateで登録時のみ、更新時のみに分けることが可能(パラメータにidが含まれるかどうかで区別している)。
バリデートを状況に応じて使い分けたい場合(例えばある状況ではcol2のみチェックしたいと言った場合)は、validate2と言った感じで別に定義してやればよい。
controllerでは以下のようにvalidateを上書きすればよい。

<?php
$this->Model->validate = $this->Model->validate2;
$this->Model->set($param);
if (!$this->Model->validates()) {
    $error = $this->Model->invalidFields();
}

16/4/28追記

<?php
//1回目のバリデート
$this->Model->validate = $this->Model->validate;
$this->Model->set($param);
$this->Model->validates();

//2回目のバリデート
$this->Model->validate = $this->Model->validate2;
$this->Model->validates();

例えばこんな感じで複数パターンのバリデートを連続してやった場合。
1回目のバリデートが失敗してしまうと2回目のバリデートもそれを引き継いで必ずエラーになってしまう(2回目のvalidatesは成功していたとしても)。
なので以下のように2回目以降はcreateを入れてvalidatesをリセットさせてやる。

<?php
//1回目のバリデート
$this->Model->validate = $this->Model->validate;
$this->Model->set($param);
$this->Model->validates();

//2回目のバリデート
$this->Model->validate = $this->Model->validate2;
$this->Model->create(); // <-- 追加
$this->Model->set($param); // <-- 追加
$this->Model->validates();

insertの時といい、createというおまなじないを唱えないといけない。

最近始めたfxがなかなか好調です。メインはSBIFXトレード使ってます。
低予算(1000通貨)で比較 | FX比較 低予算から始めるFXランキング 初心者の外為入門