CakePHP

CakePHP2.1でバリデーション処理(実践編その5)

更新日:

今日は、入力フォームのバリデーション処理を行ってみたいと思います。『CakePHPでデータの検索』の続きです。CakePHPのバリデーションクラスは、主にモデルでのデータの保存時に用いられます。汎用的に利用することが出来ますので、コントローラ内で指定することも出来ますが、モデル内でバリデーション処理を行った方が楽ですので、モデルの作成から行います。

モデルの作成

1. CakePHPは、規約に則ってコントローラやデータベーステーブルを作成していれば、app/Model内にモデルは作成しなくても動いていたのですが、やはりバリデーション処理などを行うには、モデルは不可欠ですので、app/Model内にモデルを作成します。モデルは下記のたった3行の記述で動きます。

<?php
class Colleciton extende AppModel{
}

2. それでは、実際にモデルを作成し、バリデーションを設定したいと思います。下記のように記述します。5行目の使用するモデルの指定は省略することが出来ますが、この1行は明示的に表記した方がいいでしょう。

app/Model/Collection.php

<?php
 App::uses('AppModel', 'Model');
 class Collection extends AppModel{
 //使用するモデルの指定
 public $name = 'Collection';
 //バリデーションの設定
 public $validate = array(
 'title' => array(
 array(
 'rule' => 'notEmpty',
 'message' => 'タイトル名を入力して下さい。',
 ),
 array(
 'rule' => array('minlength',2),
 'message' => '2文字以上で入力して下さい。',
 ),
 ),
 'col_code'=>array(
 array(
 'rule' => 'notEmpty',
 'message' => 'コード番号を入力して下さい。',
 ),
 array(
 'rule' => array('maxLength',20),
 'message' => '20文字以内で入力して下さい。',
 ),
 array(
 'rule' => 'alphaNumeric',
 'message' => '半角英数字で入力して下さい。',
 ),
 ),
 'save_space'=>array(
 array(
 'rule' => 'notEmpty',
 'message' => '保管場所を入力して下さい。',
 ),
 ),
 );
 }

2. addアクションを下記のように修正します。

app/Controller/CollectionController.php

public function add(){
 //リクエストがPOSTの場合
 if ($this->request->is('post')) {
 //データが保存されたら
 if ($this->Collection->save($this->request->data)) {
 $this->Session->setFlash('データを保存しました');
 //indexページへ移動
 $this->redirect(array('action' => 'index'));
 //データが保存できなかったら
 } else {
 $this->Session->setFlash('Collectionテーブルは保存できませんでした。再度入力して下さい。');
 }
 }
 //リクエストがPOST以外の場合はビューadd.ctpを表示する
 }

3. editアクションも下記のように修正します。

app/Controller/CollectionController.php

public function edit($id=null){
 $this->Collection->id=$id;
 //データのセット
 $this->set('id',$id);
 //リクエストがPOSTかPUTの場合
 if($this->request->is('post') || $this->request->is('put')){
 //データが保存されたら
 if ($this->Collection->save($this->request->data)) {
 $this->Session->setFlash('データを保存しました');
 //indexページへ移動する
 $this->redirect(array('action'=>'index'));
 //データが保存できなかったら
 } else {
 $this->Session->setFlash('Collectionテーブルは更新できませんでした。再度入力して下さい。');
 }
 //リクエストがPOST,PUT以外の場合
 }else{
 //指定プライマリーキーのデータをセット
 $this->request->data=$this->Collection->read(null,$id);
 }
 }

4. ブラウザでアクセスしてみます。

http://ドメイン名/Collection/edit/1

5. 『Col Code』が空白のまま、更新ボタンを押してみます。バリデーションチェックに引っかかった箇所がオレンジの枠に囲まれてメッセージと共に表示されています。とても簡単ですね。

バリデーション

6. バリデーションルールは$validateの中に配列で記述します。まず1次元目にバリデーションを適用するフィールド名を記述します。2次元目にバリデーションの種類を『notEmpty』のように文字列で指定することもが可能ですが、基本的に3次元目に配列で指定するものと覚えた方がいいでしょう。3次元目に配列で列記するパラメータには、下記のようなものがあります。尚、同じ3次元目に併記することで、1つのフィールドに複数のバリデーションルールを適用することが出来ます。

  • rule
    『'rule'=>'notEmpty'』や『'rule'=>array('minlength',20)』のように記述します。
  •  message
    『 'messege'=>'入力して下さい'』のようにバリデーションチェック時に表示したい文字列を入力します。省略すれば英文が表示されます。
  • allowEmpty
    『'allowEmtpy'=>false』のように記述します。空文字を許可する場合はtrueにします。
  • required
    『'required'=>true』のように記述します。必須項目の時にはtureにします。
  • last
    『'last'=>false』のように記述します。 trueにした場合、そのエラーが発生した時点で、以降のバリデーションチェックを中止します。
  • on
    『'on'=>'create'』や『'on'=>'update'』のように記述します。 このバリデーションルールを適用する制限を決めます。

6. 下記にバリデーションルールの代表的なものを列記します。

  • notEmpty
    『'rule'=>'notEmpty'』のように記述します。 値が空の時にエラーになります。
  • alphaNumeric
    『'rule'=>'alphaNumeric'』のように記述します。値が半角英数字以外の時にエラーになります。ただ、今回私が検証した結果CakePHP 2.1.2では動作しませんでした(私の環境が影響している可能性もありますが)。
  • numeric
    『'rule'=>'numeric'』 のように記述します。値が半角数字以外の時にエラーになります。
  • minLength
    『'rule'=>array('minLength',最小値)』 のように記述します。入力値が最小値以下であるかどうかを判断します。
  • maxLength
    『'rule'=>array('maxLength',最大値』のように記述します。 入力値が最大値以下であるかどうかを判断します。
  • range
    『'rule'=>array('range',最小値,最大値)』のように記述します。 値が範囲内(最小値<入力値<最大値)かどうかを調べます。
  • between
    『'rule'=>array('between',最小値,最大値)』のように記述します。 文字長が範囲内(最小値<文字長<最大値)かどうかを調べます。
  • date
    『'rule'=>'date'』のように記述します。入力値が日付かどうかを判断します。
  • time
    『'rule'=>'time'』のように記述します。入力値が時間かどうかを判断します。
  • email
    『'rule'=>'email'』のように記述します。入力値がメールアドレスかどうかを判断します。
  • url
    『'rule'=>'url'』のように記述します。入力値がURLかどうかを判断します。
  • isUnique
    『'rule'=>'isUnique'』のように記述します。同じ値が既に存在していないかどうかを調べます。

本日は以上です。

-CakePHP
-

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.