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に記述するバリデーションの内容です。
コメントを書いていますが、必須チェックのほか、電話番号、メールアドレス、郵便番号の入力チェックを行うバリデーションを記述しています。
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」コマンドで削除していきます。
その結果、必要なバリデーションだけが残り、その処理が実行される、という仕組みになっています。
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でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
CakePHPのユーザ認証に使用するオフィシャルなプラグインAuthenticationだが、CakePHP5系では Authentication Ver.3系を使う必要があるが、公式ChiffonBookが間違えている。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。
-
-
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。
-
-
CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説
CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。
-
-
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
CakePHPのデバッグ用のツールであるDebugKitは適切な設定をしないとエラーログにワーニングメッセージが出力される。それを解消する方法を解説。
-
-
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。
-
-
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
