CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
CakePHPで入力値によってバリデーションを切り替える
CakePHP 2でバリデーションを条件によって切り替える方法
入力フォームから入力された項目によって、バリデーション(入力チェック)の内容を変えたい、という場面があると思いますが、その方法を CakePHPで実装する方法を解説します。
対象バージョン:CakePHP2系(CakePHP 2.2以上)
参考サイト
https://book.cakephp.org/2.0/ja/models/data-validation.html#id11
条件によってバリデーションの内容を変える具体的な例
想定している具体的なイメージは下記のような感じです。
「連絡手段を選択し、選択した連絡手段の連絡先の情報を入力してください。」
上記の入力フォームで、「連絡手段」の選んだ選択肢によって、「連絡先情報」の入力内容が変わるため、それに合わせて「連絡先情報」のバリデーションの内容を変更する必要があります。
「連絡手段:電話」 の場合は、電話番号チェック
「連絡手段:メール」の場合は、メールアドレスチェック
「連絡手段:郵送」 の場合は、郵便番号チェック
「連絡手段:その他」の場合は、必須チェックのみ
CakePHPで unsetを利用して入力値を条件としてバリデーションを切り替える具体的なソースコードと解説
バリデーションを切り替える処理の実装手順
実装の手順としては以下の通りです。
1.Modelに、必要なバリデーションを記述します。
2.Controllerに、条件よって使わないバリデーションを削除する処理を記述します。
1.Modelに、必要なバリデーションを記述
では、具体的なソースコードを確認していきます。
まず、Modelに記述するバリデーションの内容です。
コメントを書いていますが、必須チェックのほか、電話番号、メールアドレス、郵便番号の入力チェックを行うバリデーションを記述しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public $validate = array( 'contact_number' => array( // 必須チェック 'notEmpty' => array( 'rule' => 'notEmpty', 'allowEmpty' => false, 'message' => 'アカウントIDが入力されていません' ), // 電話番号のチェック 'telCheck' => array( 'rule' => '/^\d{10,11}$/', 'allowEmpty' => false, 'message' => '電話番号はハイフンなしで入力してください' ), // メールアドレスのチェック 'mailCheck' => array( 'rule' => 'email', 'allowEmpty' => false, 'message' => 'メールアドレスを入力してください' ), // 郵便番号のチェック 'zipCheck' => array( 'rule' => '/^\d{3}-\d{4}$/', 'allowEmpty' => false, 'message' => '3桁 - 4桁の形式で入力してください' ), ), ); |
上記の「rule」では、
「/^\d{10,11}$/」(10桁~11桁の数値)
「/^\d{3}-\d{4}$/」(3桁の数値 + 「-」 + 4桁の数値)
のように、正規表現を使って入力条件を指定しています。
2.Controllerに、条件よって使わないバリデーションを削除する処理を記述
続いて、1で設定したバリデーションを、条件によって使わない処理を記述していきます。
入力された「連絡手段」を「$this->request->data['Contact']['method']」で取得し、電話の場合、メールの場合、電話の場合と振り分け、必要ないバリデーションを「unset」コマンドで削除していきます。
その結果、必要なバリデーションだけが残り、その処理が実行される、という仕組みになっています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public function add() { if ($this->request->is('post') || $this->request->is('put')) { // 電話が選択された場合 if ( $this->request->data['Contact']['method'] == "1" ) { unset ( $this->Contact->validate["contact_number"]["telCheck"] ); unset ( $this->Contact->validate["contact_number"]["mailCheck"] ); unset ( $this->Contact->validate["contact_number"]["zipCheck"] ); // メールが選択された場合 } elseif ( $this->request->data['Contact']['method'] == "2" ) { unset ( $this->Contact->validate["contact_number"]["telCheck"] ); unset ( $this->Contact->validate["contact_number"]["mailCheck"] ); unset ( $this->Contact->validate["contact_number"]["zipCheck"] ); // 郵送が選択された場合 } elseif ( $this->request->data['Contact']['method'] == "3" ) { unset ( $this->Contact->validate["contact_number"]["telCheck"] ); unset ( $this->Contact->validate["contact_number"]["mailCheck"] ); unset ( $this->Contact->validate["contact_number"]["zipCheck"] ); // その他が選択された場合 } else { unset ( $this->Contact->validate["contact_number"]["telCheck"] ); unset ( $this->Contact->validate["contact_number"]["mailCheck"] ); unset ( $this->Contact->validate["contact_number"]["zipCheck"] ); } // エラーがない場合は正常処理 if ( $this->Contact->validates() ) { if ($this->Contact->save($this->request->data)) { $this->Session->setFlash(__('The contact has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The contact could not be saved. Please, try again.')); } } } $this->set(compact('contacts')); } |
ちなみに、この「unset」は CakePHP 2.2で追加されたため、CakePHP 2系でも 2.2より前のものではこの方法は使えません。
CakePHPで条件によってバリデーションを振り分ける処理のまとめ
入力条件によってバリデーションを振り分ける処理として、今回は「unset」関数を使ってすでにあるバリデーションを削除していく、という処理で条件に合致するバリデーションを指定する方法を紹介しました。
これ以外にも方法はあるようですが、この方法は理解しやすく、実装しやすい方法だと感じます。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。
-
-
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。
-
-
CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除
CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。
-
-
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。
-
-
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5のヘルパーで他のヘルパーを読み込む方法を解説。公式の日本語CookbookはCakePHP4のソースのままで間違っているため注意が必要。CakePHP4からの移行の際も同じ点に注意が必要。
-
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。
-
-
CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2
ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。
