HOME>WEBプログラム覚書>[CakePHP2.2.x] 複数フィールドのバリデーション。例えばメールアドレスの再入力とか。

[CakePHP2.2.x] 複数フィールドのバリデーション。例えばメールアドレスの再入力とか。

メールアドレスの再入力とかうっとおしい派としてはあまりやりたくないのですが、一定の効果はあるみたいなので需要はあるようですね。 ってことでメールアドレスの再入力のような複数のフィールドの型が同じ場合のやりかた。 結果はこんな感じになります。バージョンは2.2.4。

なおベストプラクティスってわけではありません。おれおれなので信用しないでくださいw

View

ビューのコード。 バリデーションは個々におこないますがエラーはひとまとめにします。 (どちらかがエラーなら両方inValid的な扱い)

view

  1. <?php
  2. echo $this->Form->create('CodesRetry');
  3.  
  4. echo $this->Form->input('CodesRetry.email.base', array(
  5.     'label'    => 'メールアドレス',
  6.     //'required' => 'required',
  7.     'div'      => false,
  8. ));
  9.  
  10. echo $this->Form->input('CodesRetry.email.re_enter', array(
  11.     'label'    => 'メールアドレス再入力',
  12.     //'required' => 'required',
  13.     'div'      => false,
  14. ));
  15.  
  16. if ($this->Form->isFieldError('email')) {
  17.     echo $this->Form->error('email');
  18. }
  19.  
  20. if (isset($success)) {
  21.     echo '<h2>Valid!</h2>';
  22. }
  23. echo $this->Form->end('チェック');
  24. ?>

このフォームをpostして$controller->request->dataをdumpすると下記のようになります。 emailを配列で受け取る形です。

controller

  1. <?php
  2. array(1) {
  3.     ["CodesRetry"]=> array(1) {
  4.         ["email"]=> array(2) {
  5.             ["base"]=> string(0) ""
  6.             ["re_entry"]=> string(0) ""
  7.         }
  8.     }
  9. }
  10. ?>

Model

emailをバリデーションするためのモデルのコードは下記のようになります。 入力があるかのチェックとEmailのフォーマットのチェックと2つの入力値が等しいかのチェックをおこなっています。

model

  1. <?php
  2. class CodesRetry extends AppModel {
  3.  
  4.     public $useTable = false;
  5.  
  6.     public $validate = array(
  7.         'email' => array(
  8.             'notEmpties' => array(
  9.                 'rule' => array('notEmpties', 'email'),
  10.                 'message' => '入力は必須です。',
  11.                 'required' => true,
  12.             ),
  13.  
  14.             'emails' => array(
  15.                 'rule' => array('emails', 'email'),
  16.                 'message' => 'メールアドレスの形式が異なっています。',
  17.             ),
  18.  
  19.             'equalToValue' => array(
  20.                 'rule' => array('equalToValue', 'email', 'base', 're_entry'),
  21.                 'message' => '入力された2つのメールアドレスが異なっています。',
  22.             ),
  23.         ),
  24.     );
  25.  
  26.     /**
  27.      * emptyチェック
  28.      * $fieldValues[$fieldKey]が一つでもemptyの場合false
  29.      *
  30.      * @param array $fieldValues
  31.      * @param string fieldKey
  32.      * @return boolean
  33.      */
  34.     public function notEmpties(Array $fieldValues, $fieldKey)
  35.     {
  36.         $result = true;
  37.        
  38.         foreach ($fieldValues[$fieldKey] as $key => $value) {
  39.             if (!Validation::notEmpty($value)) {
  40.                 $result = false;
  41.             }
  42.         }
  43.  
  44.         return $result;
  45.     }
  46.  
  47.     /**
  48.      * メールアドレスチェック
  49.      * $fieldValues[$fieldKey]が一つでもメールアドレスの
  50.      *
  51.      * @param array $fieldValues
  52.      * @param string fieldKey
  53.      * @return boolean
  54.      */
  55.     public function emails(Array $fieldValues, $fieldKey)
  56.     {
  57.         $result = true;
  58.  
  59.         foreach ($fieldValues[$fieldKey] as $key => $value) {
  60.             if (!Validation::email($value)) {
  61.                 $result = false;
  62.             }
  63.         }
  64.  
  65.         return $result;
  66.     }
  67.  
  68.     /**
  69.      * $fieldValuesに含まれる2つの値が等しいかチェック
  70.      *
  71.      * @param array $fieldValues
  72.      * @param string $fieldKey
  73.      * @param int|string $one
  74.      * @param int|string $two
  75.      * @return boolean
  76.      */
  77.     public function equalToValue(Array $fieldValues, $fieldKey, $one = 0, $two = 1)
  78.     {
  79.         if ($fieldValues[$fieldKey][$one] === $fieldValues[$fieldKey][$two]) {
  80.             $result = true;
  81.         } else {
  82.             $result = false;
  83.         }
  84.  
  85.         return $result;
  86.     }
  87. }
  88. ?>

組み込みのバリデーションルールは1つの値に対するものなので、 複数の値をチェックする独自のバリデーションメソッドを作ってます。 色々なところで使うのであればAppModelとかにおいてもよいかと思います。

Controller

コントローラーは下記のようなメソッドがあるだけで特に何もやってません。

controller

  1. <?php
  2.     public $uses = array('CodesRetry');
  3.  
  4.     public function retry()
  5.     {
  6.         if ($this->request->is('post')) {
  7.             $this->CodesRetry->set($this->request->data);
  8.             if ($this->CodesRetry->validates()) {
  9.                 $this->set('success', 'true');
  10.             }
  11.         }
  12.     }
  13. ?>

実行結果はこちら

データベースへの保存

データベースに保存する場合は、バリデーション後にデータベースの 構造に合わせてデータを加工する必要があります。

Controller

  1. <?php
  2. $this->request->data['Model']['email'] = $this->request->data['Model']['email']['base'];
  3. $this->Model->save($this->request->data);
  4. ?>
投稿日 2012年12月26日 13:45
カテゴリ PHP
タグ CakePHP
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1317

コメント

コメントする
Name
Email Address
URL