概要
同じモデルに対して複数のバリデーションルールを設定する方法はないかと模索していたところ、Multivalidatableビヘイビアの存在を知り試してみました。
どのように使いたいかというと…
フォームからPOSTされた情報を
- まず「formCheck」バリデーションでチェックして、
 - Trueなら、次にデータベースに保存するためPOSTされた情報を整形しもう一度「saveCheck」バリデーションでチェックする。
 - Trueなら保存する。
 
という感じで使いたいと思ったのですが…それは後ほど。
導入方法
まずはビヘイビアを用意しましょう。
こちらのページの「Finally, this is the behavior:」と書かれた部分のソースをそのままコピペしてCakePHPの/app/models/behaviorsにmultivalidatable.phpという名前で保存します。
次はモデルの設定です。
Multivalidatableビヘイビアを使いたいモデルに
var $actsAs = array('Multivalidatable');
で、ビヘイビアをセットしてください。
次に該当モデルにMultivalidatableビヘイビア用の検証ルールを作成します。
$validationSetsというクラス変数を作って、そこにバリデーションセットごとの検証ルールを設定します。
var $validationSets = array(
    // ルール1
    'formCheck' => array(
        "name" => array(
            "required" => array(
                "rule" => VALID_NOT_EMPTY,
                "message" => "名前は必須です",
            );
        );
    ),
    // ルール2
    "saveCheck" => array(
        ......
    );
);
このように複数のルールを作ることができます。
それではコントローラ側で実際に使ってみましょう。
POSTされたデータをまずは”saveCheck”で検証し、通ればデータを整形して”saveCheck”で検証、通れば保存するという体で書いてみます。
// $this->dataにPOSTされたデータが格納されているとする。
// submitはisset($this->params['form']['submit'])でチェックする
if (isset($this->params['form']['submit'])) {
    // 検証ルール"formCheck"をセット
    $this->Model->setValidation('formCheck');
    $this->Model->set($this->data);
    if (!$this->Model->validates()) {
        // 検証失敗
        return;
    }
    // POSTされたデータを整形
    .........データを整形中.........
    $save = 整形したデータ;
    // 念のため$this->Modelを初期化
    $this->Model->create();
    // 検証ルール"saveCheck"をセット
    $this->Model->setValidation("saveCheck");
    $this->Model->set($save);
    if (!$this->Model->validates()) {
        // 検証失敗
        return;
    }
    // "saveCheck"の検証ルールを追加したので保存
    $this->Model->save($save);
}
と、まあこんな感じで書けばいいと思うのですが…ここで問題発生。
最初の”formCheck”はちゃんと検証されるのですが、次の”saveCheck”がどうしても検証してくれません。
おそらく何も検証されずにスルーしているようです。
pr($this->Model):
で中身を見比べてもちゃんと新たな検証ルールが$this->Model->validateに適用されているようですし、2回目の検証ルールを通常のModel::validateにセットして、$this->Model->restoreDefaultValidation()で通常の検証ルールに書き換えてもうまくいかない。。。
一応最初のバリデーションは通るのでそこまでは間違っていないと思うのですが、そこから先が何か違うのかなぁ?
もし何かお分かりの方がいらっしゃいましたら、コメントでも右メニューのチャットでも結構ですので教えていただけると助かります。
というわけでこのエントリー、未完成のまま保留とさせていただきますm_ _m*1
- 何かわかったら追記しますね [↩]