質問: PHP 5.6 CakePHP 2.7.9 元にした参考サイト↓ http://xn--cakephp-gt4fral1s5v.jp/form-cakeemail/ ・困っていること(実現したいこと) 確認画面付きお問合せフォームを作っています。 バリデーションのModelを作ったが、試しに必須項目を抜いてSubmitすると、そのまま確認画面に遷移してしまう。ただ、バリデーションが効いていないだけで、入力した内容は正常にメール送信されています。 どこにバリデーションを読み込む指定をすればうまく動くのか教えていただきたい。 ・やってみたこと 最初の文を、Form->create('Contact'); ?>にしたら、バリデーションは動作しましたが、画面遷移がされず今のページのままです。 ■/view/index.ctp Form->create('Contact', array('action' => 'confirm')); ?> 中略・・・ Form->textarea('other', array('type' => 'text', 'label' => 'その他')) . PHP_EOL; ?> Form->end('確認画面へ'); ?> ■/view/confirm.ctp Form->create('Contact', array('action' => 'send')) . PHP_EOL; ?> 中略・・・ Form->end('送信する') . PHP_EOL; ?>
回答: 手動でバリデーションを実行したいなら、以下のようにやればできますよ ``` $this->Contact->set($this->request->data); if(!$this->Contact->validates()){ // バリデート失敗時の処理 } ``` ただし、現状のaction構成だと、validateは、confirmアクションでやることになるので、バリデーションに失敗したときに、入力画面(indexアクション)にリダイレクトする感じでしょうか。そのときにすでに入力した値が消えないようにSESSIONとかで入力値を渡す処理を書く必要がありそうですね。 もしくは、indexとconfirmアクションは一つにまとめて、validateに成功したら、confirm.ctpで描画。validateに失敗したらindex.ctpを描画するという方法もありますが。以下のようにやるとaction名と異なるctpファイルを指定できます。 ``` $this->render('confirm'); ``` **(追記)** 今回の場合は、confirmアクションで、バリデートに失敗したらindexビューを描画するのがいいかもしれません。 ``` ```php $this->Contact->set($this->request->data); if(!$this->Contact->validates()){ $this->Session->setFlash('バリデート失敗'); $this->render('index'); return; } ```