CakePHP1.3.6:データの追加に自作のバリデーションを適用する。
以前、scaffoldのログでモデルにバリデータを設定した。
実際にはいろんなパターンのバリデーションを適用するから、今回は自作のバリデータをモデルに設定する。
サンプルでは、これまで使ってきたモデルに対して、
- 名前;ひらがなに入力を制限する。
- 郵便番号;000-0000(数字で3桁-4桁)の形式に制限する。
これらの制限に違反すると、エラーになるようにする(下の画面)。
モデルの修正
バリデータはモデルに設定する。バリデータは手持ちの2つのバリデータクラス(MyValidator.class.phpとMyMBValidator.class.php)を使った。これらは、/app/vendorsにいれ、モデルcustomer.phpの先頭でrequire_onceする。
<?php require_once '../vendors/MyValidator.class.php'; require_once '../vendors/MyMBValidator.class.php'; class Customer extends AppModel { public $name = 'Customer'; public $validate = array( 'name'=>array( array( 'rule' => array('checkHiragana','name'), 'message' =>'ひらがなで入力してください'), array( 'rule' => 'notEmpty', 'message' =>'入力してください' ) ), 'zip'=>array( array( 'rule' => array('checkZip','zip'), 'message' =>'形式がただしくありません'), array( 'rule' => 'notEmpty', 'message' =>'入力してください' ) ), 'address'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'tel'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください'), 'mail'=>array( 'rule' => 'notEmpty', 'message' =>'入力してください') ); public function checkZip($data,$name){ return MyValidator::validate('ja', 'isZip', $data[$name]); } public function checkHiragana($data,$name){ return MyMBValidator::validate('isHiragana', $data[$name]); } } ?>
checkZipとcheckHiraganaは、バリデーションのためのメソッドで第一引数には、$dataを決まり文句として設定する。zipの場合、$data['zip']に値が入っている。この関数名をzipのruleに設定する。ruleは配列になっていて、array('checkZip','zip')の'zip'が、checkZip関数の第2引数となる。
ビュー
/vendors/customers/add.ctpは以下。なんの変更もない。
<h2>顧客の登録</h2> <?php echo $form->create(null,array('type'=>'post','action'=>'add')); ?> <table> <?php echo "<tr><th>名前</th>"; echo "<td>{$form->text('Customer.name',array('size'=>'20'))}{$form->error('Customer.name')} </td>"; echo "</tr>"; echo "<tr><th>郵便番号</th>"; echo "<td>{$form->text('Customer.zip',array('size'=>'10'))}{$form->error('Customer.zip')}</td>"; echo "</tr>"; echo "<tr><th>住所</th>"; echo "<td>{$form->text('Customer.address',array('size'=>'20'))}{$form->error('Customer.address')}</td>"; echo "</tr>"; echo "<tr><th>電話</th>"; echo "<td>{$form->text('Customer.tel',array('size'=>'15'))}{$form->error('Customer.tel')}</td>"; echo "</tr>"; echo "<tr><th>携帯</th>"; echo "<td>{$form->text('Customer.mobile',array('size'=>'15'))}</td>"; echo "</tr>"; echo "<tr><th>メール</th>"; echo "<td>{$form->text('Customer.mail',array('size'=>'40'))}{$form->error('Customer.mail')}</td>"; echo "</tr>"; echo "<tr><th>メモ</th>"; echo "<td>{$form->textarea('Customer.memo')}</td>"; echo "</tr>"; echo $form->end('送信'); ?> </table> <a href=".">リストに戻る</a>
コントローラー
/app/controllers/customers_controller.phpにもなんの変更も加えない。
<?php class CustomersController extends AppController{ public $name = 'Customers'; public $layout = 'myznala'; /** * * 初期画面(一覧表示) */ function index(){ $this->set('title_for_layout', "顧客の一覧"); $req=null; if(!empty($this->data)){ require_once '../vendors/MyConverter.class.php'; $req = MyConverter::getRequestParams($this->data["Customer"]); $result = $this->Customer->find('all', array('conditions' => array('Customer.name like ?' => array("%{$req["name"]}%")))); }else{ $result = $this->Customer->find('all'); } $this->set('result',$result); } /** * * データの追加 */ function add(){ $this->set('title_for_layout', "顧客の登録"); if(!empty($this->data)){ $this->Customer->save($this->data); if($this->Customer->validates()){ $this->redirect('.'); } } } } ?>