CakePHP 登録フォームの実装 其の三
確認画面画面前の入力チェック。
CakePHPの入力チェックは Model部分にて クラス変数 $validate を定義することで save()メソッドによる更新時、validates() メソッドによる明示的な操作のいずれかで入力チェックを行うことができる。
入力チェックの方式としてはあらかじめ定義されている、VALID_NOT_EMPTY, VALID_NUMBER, VALID_EMAIL, VALID_YEAR で行えるのと、正規表現を利用することが出来る。定数 VALID_* もようは正規表現を定数定義してるだけだしね。
確認画面を表示する前の入力チェックでは validates() による明示的な入力チェックが基本となるか。
例えば、User モデルの入力チェックを行う場合コントローラー内で
if($this->User->validates($this->data['User']) { // 無問題 } else { $this->validateErrors($this-User); // Viewで tagErrorMsgでメッセージを表示するための操作 $this->render('フォーム'); }
として、Viewでエラーメッセージを表示するように出来る View側では
<table class="registForm"> <tr> <td>氏名</td><td><?php echo $html->input('User/name') ?><?php echo $html->tagErrorMsg('User/name', '氏名を入力して下さい'); ?></td> </table>
とかしておくことで、name のバリデーションに引っかかった場合にのみ、’氏名を入力して下さい’ のメッセージが表示される。
この tagErrorMsg のエラーの吐き出しが、<div class=”error_message”></div> でエラーメッセージを表示してくれる。これによって CSSでerror_message を定義しておけば目立たせることなど出来る。個人的には <span> で囲ってほしかったわ。ここだけ <span> にしちゃいました。
また、入力エラーを目立たせたい場合以下のようにスタイルで class=”warning” などを使って、背景変えたり入力エラーの場所を目立たせることが多いので、
<table class="registForm"> <tr class="worning"> <td>氏名</td><td><?php echo $html->input('User/name') ?><?php echo $html->tagErrorMsg('User/name', '氏名を入力して下さい'); ?></td> </tr> </table>
次のヘルパー追加して実現しました。
function tagErrorClass($field, $text) { $error = 1; $this->setFormTag($field); if ($error == $this->tagIsInvalid($this->model, $this->field)) { return sprintf('%s', is_array($text) ? (empty($text[$error - 1]) ? 'Error in field' : $text[$error - 1]) : $text); } else { return null; } }
ま、tagErrorMsg を一部変えただけですね。呼び出す際は、
<table class="registForm"> <tr class="<?php echo $hige->tagErrorClass('User/name', 'warning'); ?>"> <td>氏名</td><td><?php echo $html->input('User/name') ?><?php echo $html->tagErrorMsg('User/name', '氏名を入力して下さい'); ?></td> </tr> </table>
と言った感じで。
入力エラーの表示方法はどうも上記の方法しか用意されていないように思われる。探してみたところ。あったらすいません。
例えばフォームの上部にまとめて入力エラーの内容を表示するとか簡単にできそうもない。
このあたり、Validationに関しては結構使い勝手がもう一歩届かないというのが、現在使っているところでの感触だ。
Comments
One Response to “CakePHP 登録フォームの実装 其の三”
Leave a Reply
参考にさせていただきました。
ありがとうございます^^