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('.');
			}
		}
	}
		
}
?>