cakephpで手動でバリデーションを行う方法

このQ&Aのポイント
  • cakephpで手動でバリデーションを行う方法についての質問です。サービス内で情報を登録する機能があり、複数ページで情報を入力していきます。最後の確認ページでそれまでの情報を表示し、[登録]ボタンをクリックすると情報をDBに登録します。しかし、アソシエーション先のテーブルの検証が行われないため、バリデーションを手動で行う際にアソシエーション先を含めて検証する方法を知りたいです。
  • cakephpで手動でバリデーションを行う際、アソシエーション先のテーブルの検証ができないという問題があります。現在の仕組みでは、ページ遷移ごとにModelのvalidates()メソッドを使用して手動で検証を行っていますが、このメソッドではアソシエーション先のテーブルの検証が行われません。他に効果的な解決策があるかどうか知りたいです。
  • 現在、cakephpでWEBサービスを開発しており、情報の登録機能の実装について悩んでいます。複数のページで情報を入力し、最後の確認ページで情報を表示して登録する仕組みです。しかし、手動でバリデーションを行う際にアソシエーション先のテーブルの検証が行えないことが課題です。他に有効な解決策があれば教えていただきたいです。
回答を見る
  • ベストアンサー

cakephpで手動でバリデーションを行う方法

現在cakephpでWEBサービスを作成しています。 このサービス内である情報を登録する機能があるのですが、複数ページで情報を入力していき、 最後の確認ページでそれまで入力した情報を表示して、[登録]ボタンをクリックすると 情報をDBに登録する、というものです。 また、入力値のバリデーションはページ毎に行い、問題無ければ次のページへ、 エラーがあれば元ページでエラーを表示します。 このような造りのため、ページ遷移ごとにModelのvalidates()メソッドを活用して手動で検証を 行っているのですが、このメソッドではアソシエーション先のテーブルの検証が行われません。 手動でバリデーションを行うときに、アソシエーション先も含めて検証を行うことは出来ないのでしょうか。 また、他にいい解決策があれば、教えていただけると幸いです。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.1

構成がよくわからないので答えづらいのですが、 アソシエーション先のModelを呼び出してきてソレのvalidatesメソッドも叩けば良いのではないでしょうか。 アソシエーション先のデータも含めて保存してくれるsaveAssociatedメソッドの中身も、それぞれのvalidatesメソッドを叩いているだけだったと思います。 $this->YourModel->set($data); $this->YourModel->validates(); $this->YourModel->AssociatedModel->set($data); $this->YourModel->AssociatedModel->validates();

hogeo131029
質問者

お礼

お礼が遅くなり申し訳ありません。 なるほど、モデルのオブジェクトのメンバーからアソシエーションしているモデルをたどってset()→validates()を実行するということですね。 それでももちろん良いのですが、そこらへんの処理がどこかのメソッドにまとまっていないかと思い、質問させていただいた次第です。 ただ、モデル側のsaveAssociatedでお教えいただいたような方法で検証しているということは、自分の希望を叶えるには独自にメソッド化しないといけないようですね。。。

その他の回答 (1)

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.2

cake2の話ですね。cake1とは互換性がありませんので、版数を明確にして質問されたほうがいいと思います。 cake2の話としてお答えします。 validateは、ruleに関数名を設定できるのをご存じでしょうか。 その関数は、model内に定義してください。

hogeo131029
質問者

お礼

お礼が遅くなり申し訳ありません。 ご回答有難うございました。

関連するQ&A

  • CakePHPのバリデーションエラー表示について

    CakePHPの入力フォーム作成中で、バリデーションエラーがあった場合、{$form->error('')}で各項目部分にエラーを表示させています。 しかし入力項目が多いため、ページ下部でエラーが発生しても、エラーが起きているのかどうかひと目では分かりません。 1つでもバリデーションエラーがあったとき、ページ上部にエラーメッセージ表示をするにはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • cakephpのバリデーションについて。

    cakephpのバリデーションについて。 windowsxp環境にxamppをインストール php:5.3.1 cakephp:1.2.6 mysql:5.1.41 書籍を読みながらcakephpを始めました。 現在 フォームで入力された項目に該当する データをmysqlのデータベースで検索後、 結果をビューに表示するものを作っています。 フォームヘルパーを使用し、inputされたデータを コントローラ側で受け、その値をモデルで検索後 ビューへ渡しています。 このようなデータベースに保存は行わない検索だけの場合 フォームに入力されたデータをcakePHPのバリデーション機能 を利用してチェックできるのでしょうか? ビューでは $form->input('form.text1'array('label'=>'検索対象1')); $form->input('form.text2'array('label'=>'検索対象2')); としています。 このform.text1とform.text2について未入力の場合など エラーチェックが行いたいです。 そもそもこのような場合のエラーチェックは コントローラーに処理を記述しバリデーションは利用しないのかなど、 どなたかアドバイスいただけると助かります。

    • ベストアンサー
    • PHP
  • Cakephpでランキング機能の作成方法について。

    Cakephpでランキング機能の作成方法について。 Cakephpで、お気に入り数順のランキング機能を作りたいと考えています。 以下のような構造でランキングを表示させたいのですが、 やり方が分からず困っています。 ■システム概要 コーヒーの紹介サイトです。 様々なコーヒーが登録されており、ユーザーは任意のコーヒーをお気に入り登録できます。 Coffeeテーブル id , name Userテーブル id , name Favoriteテーブル id , coffee_id , user_id 現在、ランキングを表示させたいページであるindex.ctpには、$this->Coffee->find();でCoffeeの情報を表示させています。 アソシエーションでUserテーブル、Favoriteテーブルの情報も取れていますが、これをお気に入り数順にソートするやり方がわかりません。宜しくお願いします。

    • ベストアンサー
    • PHP
  • CakePHPでvalidateのメッセージの表示

    バリデーションで設定したエラーメッセージをsetFlashで表示したいのですが、 エラーメッセージ(下記のhoge)を取得する方法はありますか? CakePHP 2x Model public $validate = array( 'username' => array( 'rule' => 'notEmpty' 'message' => 'hoge' ) ); Controller $this->Session->setFlash('test'); $this->redirect('index');

    • 締切済み
    • PHP
  • cakePHPでFormを使用したDBへの登録

    cakePHP初心者です。 ブラウザで入力画面→確認画面→完了画面と遷移して、 DBに入力した値を登録する基本の動きをさせたいのですが、 Controllerの動きが分かりません。 Viewのファイルを 入力画面:entry.ctp 確認画面:confirm.ctp 完了画面:complete.ctp とします。 1.SampleControllerからentryページを表示 public function entry(){ } 2.etntry.ctpでFormを作成 <?php echo $this->Form->create('Sample', array('action' => 'confirm')) . PHP_EOL; ?> 3.SampleControllerでconfirmメソッドが呼ばれる public function confirm(){ if($this->request->is('post')){ データを画面にセット? } } 4.confirm.ctpが表示され、登録ボタンを押すと完了画面にFormを作成 <?php echo $this->Form->create('Sample', array('action' => 'complete')) . PHP_EOL; ?> 5.SampleControllerでcompleteメソッドが呼ばれる public function confirm(){ if($this->request->is('post')){ バリデーションチェック後、DBに登録? } } この流れでよいのでしょうか。 完了画面のcompleteでバリデーションチェックを行うことに違和感を感じています。 仮にconfirmで実施するとしても、書き方が良く分かりません。 <?php echo $this->Form->create('Sample', array('action' => 'confirm')) . PHP_EOL; ?> と書いたら、3の処理とかぶってしまいますよね・・・? 説明分かりにくくてすみません・・・。 ネットで調べつつやっていたのですが、一連の流れをすべて書いたサイトに見当たらず、 途方に暮れています。 どなたかご教示お願いします。

    • 締切済み
    • PHP
  • cakephp エラーハンドリングができません

    cakephpを利用しているシステムで、2種類のエラーを作っておいてcontrollersの呼び出しで振り分けたいと思いますがうまくできません。 マニュアルページ(http://book.cakephp.org/ja/view/154/Error-Handling)を参考に、 app/app_error.phpを以下のように作成しました。 ((1)エラー:error(2)エラー:errorsta) ----------------------------------------------------------------- <?php class AppError extends ErrorHandler{ function error(){ $this->controller->viewPath = 'errors'; $this->__outputMessage('error'); } function errorsta(){ $this->controller->viewPath = 'errors'; $this->__outputMessage('errorsta'); } } ?> ----------------------------------------------------------------- 上記内容で、メソッドerrorは実行できるのですが、errorstaが一向に動いてくれず、404扱いになってしまいます。 app/app_error.php以外にも設定が必要なものがあるのでしょうか?

    • 締切済み
    • PHP
  • cakePHPでvalidateの結果を取得したい

    最近cakePHPの勉強を始めました。 入力フォームで、入力エラーの表示をカスタマイズしたいので、 エラー項目の内容を取得したいのです。 たとえば、 エラー項目のテキストボックスの背景に色をつけたり、 フォーム上部にエラー項目を列挙してリンクを張り、リンクをクリックすると該当のテキストボックスに飛ばせるなどという感じです。 いろいろネット検索したのですが、ほしい情報にたどり着くことができませんでした。 ご存じの方、ご教授のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • cakePHPについて

    現在、cakePHPを勉強しているのですが、分からなくて進めない箇所があり困っています。 ユーザーがフォームからデータを入力し、DBにデータを格納する際、フォーム項目にないデータを一緒に入力するためにはどうすればいいのか分かりません。 例)ユーザーフォーム入力欄 name email password ↓ ■DB側に格納したいデータ id(AUTO_INCREMENT) contact_id(問題箇所) name email password created modified 現在、下記のようなコードになっているのですが、ご教授頂ければ幸いです。 ■Controller/RequestController public function index(){ if(!empty($this->request->data)){ if($this->request->data[$this->Request->alias]['confirmed']){ //保存実行 //成功時に画面遷移・失敗時にメッセージを表示 if($this->Request->saveAll($this->request->data)){ $this->Session->setFlash('お申し込み有難う御座います。新規依頼が完了しました。'); $this->redirect(array('action' => 'index','controller' => 'details')); }else{ $this->request->data[$this->Request->alias]['confirmed'] == false; $this->Session->setFlash('新規依頼に失敗しました。'); } }else{ if($this->Request->saveAll($this->request->data, array('validate' => 'only'))){ //saveALLは値をまとめて保存するモデルメソッドだけど('validate' => 'only')にすることで //保存処理を行わずにバリデーションのみを実行することができます //入力データに問題がなかった場合は確認画面を呼び出し $this->render('confirm'); }else{ $this->Session->setFlash('エラーがあります。入力内容をご確認下さい。'); } } } }

    • 締切済み
    • PHP
  • CakePHP3 belongsTo NULL登録

    CakePHP3.0 を使用して、顧客情報を登録するアプリケーションを作成しています。 顧客情報には言語カラムがあり、外部の言語テーブルのコードを参照しています。 顧客情報の言語カラムはNULLを許容します。 DB [Table] client_entities | language_code1 | char(2) | NULL YES | MUL | | language_code2 | char(2) | NULL YES | MUL | | language_code3 | char(2) | NULL YES | MUL | | language_code4 | char(2) | NULL YES | MUL | | language_code5 | char(2) | NULL YES | MUL | | language_code6 | char(2) | NULL YES | MUL | [Table] languages | id | int(11) | NULL NO | PRI | | code | char(2) | NULL NO | UNI | CakePHPでは、Tableにアソシエーションの定義を追加しました。 (Controllerのindex()にも設定を追加していますが、edit()、update()は未変更です) ClientEntitiesTable public function initialize(array $config) { $this->belongsTo('Languages', [ 'foreignKey' => 'language_code1', 'bindingKey' => 'code', 'joinType' => 'LEFT' ]); ..... continue } LanguagesTable public function initialize(array $config) { $this->hasMany('ClientEntities', [ 'foreignKey' => 'language_code1', 'bindingKey' => 'code' ]); ..... continue } この状態で、顧客情報の登録・更新処理において、言語カラム未設定でsubmitすると、 NULLの状態で送られた情報が内部で空文字''に変換されてしまいDBの参照整合性エラーが発生してしまいます。 Error情報 Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`cir`.`client_entities`, CONSTRAINT `client_entities_ibfk_7` FOREIGN KEY (`language_code2`) REFERENCES `languages` (`code`)) UPDATE client_entities SET language_code2 = :c0 WHERE id = :c1 解決方法として、TableクラスのbeforeSave()メソッドを内で空文字をNULLへ変換する処理を追加したのですが、 別のエラーが発生してしまいます。 Undefined variable: _SESSION [CORE\src\Network\Session.php, line 440] どなたか、CakePHPにて外部参照制約のついているカラムへNULLを登録する方法をご教授願えませんでしょうか?

    • 締切済み
    • PHP
  • CakePHPのデータベース接続エラーについて

    MySQLもCakePHPも初心者です。 詳しい方よろしくお願い申し上げます。 当方のPC環境はMac OS X 10.9.5で、MAMPをインストールして 色々なサイトを見ながらなんとか初期設定までは完了しました。 その後、下記の様なエラーが表示されて、色々グーグル検索し、 CakePHP is NOT able to connect to the database. Database connection "Mysql" is missing, or could not be created. database.phpのファイルも書き換えて、iTermからMysqlに接続して ユーザーも作成出来ましたが、依然としてエラーは解消されないので PHPの設定もphp.iniで追記してみましたが、エラーが解消されず もうどうして良いかわかりません。 (参考にしたページ:http://www.phpbook.jp/cakephp/install/index2.html  http://locombox.com/posts/35  他) どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL