シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP]MultivalidatableBehaviorを入れてみた・・・が。

概要

同じモデルに対して複数のバリデーションルールを設定する方法はないかと模索していたところ、Multivalidatableビヘイビアの存在を知り試してみました。

どのように使いたいかというと…
フォームからPOSTされた情報を

  1. まず「formCheck」バリデーションでチェックして、
  2. Trueなら、次にデータベースに保存するためPOSTされた情報を整形しもう一度「saveCheck」バリデーションでチェックする。
  3. 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]

  1. 何かわかったら追記しますね []

シェアする

  • このエントリーをはてなブックマークに追加

フォローする