• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cakephpのバリデーションについて。)

cakephpバリデーションでフォームのエラーチェックを行う方法

このQ&Aのポイント
  • cakephpのバリデーション機能を利用してフォームに入力されたデータのエラーチェックを行う方法について詳しく解説します。
  • フォームヘルパーを使用して入力されたデータをコントローラ側で受け取り、モデルで検索を行った後、結果をビューに表示します。
  • また、未入力の場合などにエラーチェックを行いたい場合、コントローラーに処理を記述することで実現できます。

質問者が選んだベストアンサー

  • ベストアンサー
  • higee
  • ベストアンサー率30% (4/13)
回答No.3

No.2です。 試していただけたようで、嬉しい限りです。 まず気になった点がありましたので、 その箇所について補足しておきます。 >エラー時、入力画面に戻る場合は >$this -> redirect('.'); >としています。 個人的にredirect関数の指定の仕方が気になりますね。。 多分今のところは問題ないのでしょうが、 カレントディレクトリでの指定だと、 今後の記述方法の一貫性が取れない等あるので、 なるべくURLでの記述が望ましいかと思えました。 下記のURL等を参照下さい。 http://book.cakephp.org/ja/view/425/redirect 以下は補足内容に対する回答になります。 >モデルにdataをセット >モデル内でエラーチェック >エラーがあった場合 >$this->inbalidate('text')とする。 >コントローラーで$resultに >モデルのvalidationErrorsを受け >この結果で処理を分岐する。 私の例がよろしくなかったかもしれません。 実はvalidationを行った結果は、 $resultに戻り値を返す必要は別にありません。 (何か別に用途があれば別ですが。。) $this->モデル名をバリデーションチェックの後に デバックしてみれば分かるのですが、 質問者様が$resultをデバックした[validationErrors]項目に 同じ【[validationErrors] => Array([text] => 1)】が表示されるかと思います。 これはModelに対してバリデーションエラーの定義がされているものです。 私も詳しい内部処理はわかりませんが、 この定義を読み取ってview側では同名で定義されたエラーを $form->errorで吐き出しています。 故に$resultに対しての分岐等は必要ありません。 cakephpの仕様なので、あまり意識することはないかと思います。 >結果として >エラー時にはリダイレクトされ、処理が進まなくなったのですが、 >エラーメッセージの表示がされません。 >そもそもエラー時に入力画面に戻すための記述の方法が >間違っている気もするのですが、通常どのように >記述するのでしょうか? 質問者様の意図がわかりませんので、こちらの憶測で言うしかありませんが。 まず、 エラーだった場合は別ページに飛ばさなければならない仕様なのでしょうか? そうであれば、私が教えた方法では無理が生じます。 ですが、リダイレクト先がカレントディレクトリに指定していたので、 勝手ながら「同一ページにエラー文を表示する」 という認識で回答させて頂きます。 上記で説明した通りの挙動だと、 モデルにvalidationErrorsの定義がされていますが、 リダイレクト処理をかけることでvalidationErrorsでの定義がリセットされます。 つまり再読み込みされているわけですから、 チェックに対する結果で出力するので、 エラーの結果は引き継げません。 なので、「同一ページにエラー文を表示する」のであれば 無理にリダイレクトする必要がないかと思います。 もしリダイレクトをして別ページに飛ばしたいのであれば、 $resultをセッションに格納し、遷移先の関数で分岐処理を記述すれば 正常に動作するかと思います。 質問者様の意図が掴みきれていないかもしれませんが、 もし何かまた不明点などありましたら、 再度補足にてコメントお願い致します。

inu_kun
質問者

お礼

higee様 引き続きのアドバイスありがとうございます。 バリデーションの件、確かに[validationErrors] => Array([text] => 1)がセットされていました。 その後のエラー処理は必要ないのですね。 リダイレクトの指定方法はリンク先を参考に致します。 大変参考になりました。 エラー処理の件については大変参考になりました。 higee様のエラー処理についてのアドバイス、悩んでいた部分の回答そのものです。 大変参考になりました。 今後はアドバイスのように致します。 higee様の回答のおかげで前進することができました。 ありがとうございました。

その他の回答 (2)

  • higee
  • ベストアンサー率30% (4/13)
回答No.2

どんな値に対してもバリデーションは出来ます。 基本的にモデルでもコントローラーでも記述は可能ですが、 統一性を考えるとなるとモデルの方が適切かと思います。 私の場合はいつもinvalidate関数をしようして、 別関数での実装を行っています。 tests_controller.php(Controller) $this->Test->set($this->data); // 独自のバリデーションを呼び出します $this->Test->_OtherValidate($this->data); $result = $this->Test->validationErrors; Test.php(Model) function _OtherValidate($data){ // ↓必要であればModelで指定した$validateのバリデーションを行う // parent::validates(); foreach($data as $key => $val){ switch($key){ case "text1": case "text2": if(empty($val)) $this->invalidate('text'); break; } test.ctp(view) // invalidateで指定した'text'をエラーを表示させたい場所に記述 // ただしform内でないと表示されません <?php echo $form->error('text',"未入力です"); ?>

inu_kun
質問者

補足

皆様 アドバイスありがとうございます。 もう少しなのですが、詰まっています。 アドバイスを受け モデルにdataをセット モデル内でエラーチェック エラーがあった場合 $this->inbalidate('text')とする。 コントローラーで$resultに モデルのvalidationErrorsを受け この結果で処理を分岐する。 というように記述してみました。 エラー時には$resultに1が代入されたので これでエラーの有り無しを判定し、 エラー有りの場合は フォームにエラーを表示し、再入力を促す。 としてみたのですが、うまく動きません。 エラー時、入力画面に戻る場合は $this -> redirect('.'); としています。 フォームには <?php echo $form->error('text',"未入力です"); ?> としています。 debugでみますと [validationErrors] => Array([text] => 1 となっています。 結果として エラー時にはリダイレクトされ、処理が進まなくなったのですが、 エラーメッセージの表示がされません。 そもそもエラー時に入力画面に戻すための記述の方法が 間違っている気もするのですが、通常どのように 記述するのでしょうか? 引き続きアドバイスいただけると助かります。

  • takubou05
  • ベストアンサー率52% (11/21)
回答No.1

cakePHPはバリデーションはモデルで行います。 ご質問の場合は、 データベースと連携しないモデルを作成すれば、 モデルでバリデーションが可能です。 ーーサンプル モデルーー class Contact extends AppModel { public $useTable = false; // テーブルを使用しない public $_schema = array('id' => array('type' => 'integer'));// 擬似フィールドの設定 /* * バリデーション定義 */ public $validate = array(省略); } とモデルを作成し、 コントローラー側で $this->Contact->set($this->data); $error = $this->validateErrors($this->Contact); と記述すればバリデーションをモデルに記述することが可能になります。

関連するQ&A