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 のバリデーション”
Leave a Reply
Additional comments powered by BackType




2月 22nd, 2008 at 11:38 pm
どうもはじめまして。いつも参考にさせてもらっています。
ちょっとしたことなんですが、
‘label’=>”
と書くとソースにlabelタグが残ってしまいます。消したい時は
‘label’=> false
と書くとタグが消えますよ。
2月 23rd, 2008 at 4:01 am
‘label’=>false 教えていただきありがとうございました。本文にも追記させていただきました。
3月 2nd, 2008 at 12:36 am
初めまして。
Cakeを勉強中で参考にさせてもらってます。
質問なんですが
コントローラでバリデーションチェックの中で
$this->User->create($this->data)
としていますが、cake/libs/model/model_php5.php のソースを見ると
create関数は引数を必要としないみたいなんですけど、
何で引数を与えているのでしょうか?
3月 2nd, 2008 at 2:26 am
あ、すみません、自分見てたソースバージョン1.1.19でした
3月 2nd, 2008 at 4:33 am
なるほど。mode_php5.php は CakePHP1.2 にはないですからね。また質問あればコメントください。
5月 7th, 2008 at 4:30 pm
[...] 自動的にエラーメッセージを表示するためには CakePHP1.2 のバリデーション [...]
5月 30th, 2008 at 3:08 pm
[...] CakePHP1.2 からバリデーションがかなり強力になっていますが、レコードを追加するときまたはレコードを更新するときのみにバリデーションルールを適用する指定方法がありました。 [...]
7月 11th, 2008 at 4:13 pm
[...] CakePHP1.2 のバリデーション | Sun Limited Mt. http://www.syuhari.jp/blog/archives/187 [...]
7月 11th, 2008 at 4:31 pm
初めまして。
CakePHPを使い始めるにあたり、とても参考にさせていただいております。
さっそくログイン画面を作る工程で、パスワードの確認用にcheckCompare関数を活用させていただきました。
http://www.secondbrain.co.jp/blog/?p=5
勝手な利用に問題がありましたら、すぐに削除いたします。
どうぞよろしくお願いいたします。
7月 11th, 2008 at 4:39 pm
RyuheiAoki さん。はじめまして。
ブログに載せているソースを使っていただくことはまったく問題ないです。参考にしていただきありがとうございます。
7月 11th, 2008 at 8:19 pm
matsuuraさん。
どうもありがとうございます。
CakePHPを使い始めたばかりのペーペーですが、matsuuraさんのブログを参考に、いろいろと使いこなしてみたいと思います。
今後ともどうぞよろしくお願いいたします。