2008年

CakePHP1.2 のバリデーション このエントリーを含むはてなブックマーク

CakePHP Add comments

CakePHP 1.2 を使用してフォームを作成してバリデーションを使用したメモです。

下記サイトを参考にさせていただきました。
cakePHP 1.2のバリデーションを理解する – cakephp – クロアチアで働くプログラマー日記

例としてメールアドレスを2回入力させるフォームを考えて見ます。
バリデーションルールとして

  • 必須項目
  • メールアドレスとして正しい
  • メールアドレスがユニーク
  • 2回入力したメールアドレスが一致する

モデルにバリデーションを定義する

var $validate = array(
    'email' => array(
        'unique' => array(
    	    'rule' => array('checkUnique', 'email'),
    	    'message' => 'メールアドレスは既に登録されています'
    	),
        'rule1' => array(
       	    'rule' => array('email'),
       	    'message'=>'メールアドレスが正しくありません'
      	 ),
        'required' => array(
       	    'rule'=>VALID_NOT_EMPTY ,
       	    'message' => '必須項目です'
       	),
    ),
    'email_confirm' => array(
        'rule1' => array(
    	    'rule'=> array('checkCompare'),
    	    'message'=>'一致しません'
    	),
    ),
);

私はエラーメッセージをバリデーション定義にまとめておきたいので、上記のように各ルールに
'message' => 'エラーメッセージ'
として定義しています。
ここで定義しておけば、後でビューに書くフォームヘルパーでフォームを出力するときに引っかかったエラーを自動的に出力することができます。

また、自分でバリデーション関数を作成してチェックすることもできます。それが checkUnique と checkCompare です。

メールのユニークチェックは参考サイトを参考にさせていただきました。

function checkUnique($field){
    foreach( $field as $key => $value ){
        $this->recursive = -1;
        $found = $this->find(array("{$this->name}.$key" => $value));
        return !$found;
    }
}

次にメールアドレスを2回入れたものが一致するかのチェックです。
これはパスワードなどでもたまに使用するので汎用性を持たせてあります。
例えばメールアドレスのフィールド名が email の場合、確認用のフィールド名は ‘_confirm’を付けて email_confirm としておけばこの2つが一致するかチェックします。

function checkCompare($field) {
    foreach( $field as $key => $value ){
        if (preg_match('/^(.+)_confirm$/', $key, $regs)) {
            return $this->data[$this->name][$regs[1]] == $this->data[$this->name][$key];
        }
    }
}

ビューでフォームを設定

<?php echo $form->input('User/email', array('type'=>'text')); ?>
<?php echo $form->input('User/email_confirm', array('type'=>'text')); ?>

このように書いておけばバリデーションエラーがある場合は、モデルのバリデーションに定義したエラーメッセージを自動的に出力してくれます。

ちなみに上記のように書くと input タグの前に email などのフィールド名が出力されます。これを消したい場合は
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>'')); ?>
と書くと表示されなくなります。

追記:
コメントで教えていただきました。label=>” だと表示されないが、label タグは残るので
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>false)); ?>
とするとラベルタグも出力されなくなります。

コントローラでバリデーションチェック

以下のようになります。

function action() {
    if ($this->data) {
        if ($this->User->create($this->data) && $this->User->validates()) {
	    // バリデーションOK
	}
    }
}

他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。

関連する投稿

11 Responses to “CakePHP1.2 のバリデーション”

  1. k1LoW Says:

    どうもはじめまして。いつも参考にさせてもらっています。
    ちょっとしたことなんですが、

    ‘label’=>”

    と書くとソースにlabelタグが残ってしまいます。消したい時は

    ‘label’=> false

    と書くとタグが消えますよ。

  2. matsuura Says:

    ‘label’=>false 教えていただきありがとうございました。本文にも追記させていただきました。

  3. kiyoyu Says:

    初めまして。
    Cakeを勉強中で参考にさせてもらってます。
    質問なんですが
    コントローラでバリデーションチェックの中で
    $this->User->create($this->data)
    としていますが、cake/libs/model/model_php5.php のソースを見ると
    create関数は引数を必要としないみたいなんですけど、
    何で引数を与えているのでしょうか?

  4. kiyoyu Says:

    あ、すみません、自分見てたソースバージョン1.1.19でした

  5. matsuura Says:

    なるほど。mode_php5.php は CakePHP1.2 にはないですからね。また質問あればコメントください。

  6. CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法 | Sun Limited Mt. Says:

    [...] 自動的にエラーメッセージを表示するためには CakePHP1.2 のバリデーション [...]

  7. CakePHP1.2 「新規時のみ」or「更新時のみ」のバリデーション指定 | Sun Limited Mt. Says:

    [...] CakePHP1.2 からバリデーションがかなり強力になっていますが、レコードを追加するときまたはレコードを更新するときのみにバリデーションルールを適用する指定方法がありました。 [...]

  8. Think Twice - ログイン画面を作る Says:

    [...] CakePHP1.2 のバリデーション | Sun Limited Mt. http://www.syuhari.jp/blog/archives/187 [...]

  9. RyuheiAoki Says:

    初めまして。
    CakePHPを使い始めるにあたり、とても参考にさせていただいております。

    さっそくログイン画面を作る工程で、パスワードの確認用にcheckCompare関数を活用させていただきました。
    http://www.secondbrain.co.jp/blog/?p=5

    勝手な利用に問題がありましたら、すぐに削除いたします。
    どうぞよろしくお願いいたします。

  10. matsuura Says:

    RyuheiAoki さん。はじめまして。
    ブログに載せているソースを使っていただくことはまったく問題ないです。参考にしていただきありがとうございます。

  11. RyuheiAoki Says:

    matsuuraさん。
    どうもありがとうございます。

    CakePHPを使い始めたばかりのペーペーですが、matsuuraさんのブログを参考に、いろいろと使いこなしてみたいと思います。
    今後ともどうぞよろしくお願いいたします。

Leave a Reply

Additional comments powered by BackType

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン