概要
同じモデルに対して複数のバリデーションルールを設定する方法はないかと模索していたところ、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
- 何かわかったら追記しますね [↩]