CakePHP1.2 のバリデーション
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 } } }
他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。
関連する投稿
12 comments
コメントをどうぞ
Additional comments powered by BackType
どうもはじめまして。いつも参考にさせてもらっています。
ちょっとしたことなんですが、
‘label’=>”
と書くとソースにlabelタグが残ってしまいます。消したい時は
‘label’=> false
と書くとタグが消えますよ。
‘label’=>false 教えていただきありがとうございました。本文にも追記させていただきました。
初めまして。
Cakeを勉強中で参考にさせてもらってます。
質問なんですが
コントローラでバリデーションチェックの中で
$this->User->create($this->data)
としていますが、cake/libs/model/model_php5.php のソースを見ると
create関数は引数を必要としないみたいなんですけど、
何で引数を与えているのでしょうか?
あ、すみません、自分見てたソースバージョン1.1.19でした
なるほど。mode_php5.php は CakePHP1.2 にはないですからね。また質問あればコメントください。
[...] 自動的にエラーメッセージを表示するためには CakePHP1.2 のバリデーション [...]
[...] CakePHP1.2 からバリデーションがかなり強力になっていますが、レコードを追加するときまたはレコードを更新するときのみにバリデーションルールを適用する指定方法がありました。 [...]
[...] CakePHP1.2 のバリデーション | Sun Limited Mt. http://www.syuhari.jp/blog/archives/187 [...]
初めまして。
CakePHPを使い始めるにあたり、とても参考にさせていただいております。
さっそくログイン画面を作る工程で、パスワードの確認用にcheckCompare関数を活用させていただきました。
http://www.secondbrain.co.jp/blog/?p=5
勝手な利用に問題がありましたら、すぐに削除いたします。
どうぞよろしくお願いいたします。
RyuheiAoki さん。はじめまして。
ブログに載せているソースを使っていただくことはまったく問題ないです。参考にしていただきありがとうございます。
matsuuraさん。
どうもありがとうございます。
CakePHPを使い始めたばかりのペーペーですが、matsuuraさんのブログを参考に、いろいろと使いこなしてみたいと思います。
今後ともどうぞよろしくお願いいたします。
[...] バリデーションの参考 http://cakephp.chorochoro.com/archives/197 http://blog.syuhari.jp/archives/187 http ://cakephp.hamazo.tv/e1577376.html http://blog.ecworks.jp/archives/792 [...]