Zend_Formによるフィルター・バリデーション処理

以前、Zend_ValidateZend_Filterについて調べてみました。Zend_ValidateZend_Filterは、単独でも使えますが、Zend_Formのなかで使うことを最初から考えて作られていますので、Zend_Formと組み合わせれば、結構簡単に使えるようです。今日は、Zend_Formのなかで、Zend_ValidateZend_Filterを使う方法を調べてみたいと思います。

1) まず、必須項目の箇所に『setRequired(true)』を指定します。これは必須項目のバリデーション(Zend_Validate_NotEmpty)を設定するメソッドです。引数にtureを入力すると自動的にZend_Validate_NotEmptyが設定されます。『addValidator』は、バリデーションを追加するためのものです。下記のような形で呼び出します。

addValidator(バリデーション名,エラー時の対応,必要な設定値)

2) 試しに、『StringLength』を指定してみます。第2引数には、エラーが発生したときにそこで、チェックを停止するか(残りのバリデーション処理を実行しないか)を示す真偽値を指定します。また、このStringLengthのように設定する値が必要な場合には、第3引数に配列として渡します。

addValidator(‘StringLength’,false,array(4,50));

3) addFileterで、フィルターも追加してみます。ここでは、『StripTags』を設定します。addFilterは引数にフィルタ名を指定することで、フィルター処理が組み込めます。このaddFilterもaddValidatorも組み込んだZend_Form_Elementインスタンス自身を帰すようになっていますので、いくつもメソッドを連結して実行することが出来ます。

4) 変更後のcreateAddFormを下記に記述します。

public function createAddForm(){
 //Zend_Formをインスタンス化します。
 $form=new Zend_Form();
 //フォームの基本情報をセットします。
 $form->setMethod('post')->setAction('add');
 //フォームのコントロールを組み込みます
 $title=new Zend_Form_Element_Text('title');
 $title->setAttrib('size',40)
 ->setLabel('タイトル')
 ->setRequired(true)//必須項目の指定
 ->addValidator('StringLength',false,array(1,50));//バリデーション
 $content=new Zend_Form_Element_Textarea('content');
 $content->setAttribs(array('cols'=>40,'rows'=>3))
 ->setLabel('コンテンツ')
 ->setRequired(true)//必須項目
 ->addFilter('StripTags');//フィルター処理
 $send=new Zend_Form_Element_Submit('send');
 $send->setLabel('新規追加');
 //コントローラの組込
 $form->addElement($title);
 $form->addElement($content);
 $form->addElement($send);
return $form;
 }

5) 次にaddActionも修正します。『isValid()』で、チェックする値を渡します。ここでは、引数に$_POST配列を渡します。このisValidメソッドでは、連想配列の形で値を渡すと、それぞれのキー名のZend_Form_Elemetにその値が渡され、バリデーションチェックとフィルター処理を自動的に行ってくれます。

6) addActionメソッドも下記に表示します。

public function addAction(){
 $errors=array();
 $form=$this->createAddForm();
 $this->view->assign('form',$form);
 //POST送信されたら
 if($this->getRequest()->isPost()){
 //検証OKなら
 if($form->isValid($_POST)){
 $title=$this->getRequest()->getParam('title');
 $content=$this->getRequest()->getParam('content');
 $data = array(
 'title' => $title,
 'content' => $content
 );
 //データベースにレコードを挿入
 $this->db->insert('dvd_collections',$data);
 //indexにリダイレクトします
 $this->_redirect('test/index');
 }
 }
 }

7) ブラウザで確認してみます。タイトルに全角で1文字『あ』と入力、コンテンツに<h1></h1>タグを挿入してみました。

8) addValidatorで指定したエラー表示や、addFilterで指定したフィルタリング(タグの削除)が行われています。尚、エラーメッセージや値の保持は、作成したプログラムでは一切行っていません。Zend_Formを使うとこれらを自動的に行ってくれるのですごく便利ですね。

エラーメッセージの設定

9) デフォルトのエラーメッセージは、英語ですので、英語の苦手な私としては、日本語で表示させたいと思います。Zend_Form_Elementに独自のエラーメッセージを組み込むsetErrorMessagesを使ってやってみたいと思います。

10) setErrorMessageは、バリデーション名をキーとする連想配列としてエラーメッセージをまとめたものを引数に渡します。

setErrorMessage(array(バリデーション名1=>メッセージ, バリデーション名2=>メッセージ));

11) createAddFormを修正します。

public function createAddForm(){
 //Zend_Formをインスタンス化します。
 $form=new Zend_Form();
 //フォームの基本情報をセットします。
 $form->setMethod('post')->setAction('add');
 //フォームのコントロールを組み込みます
 $title=new Zend_Form_Element_Text('title');
 $title->setAttrib('size',40)
 ->setLabel('タイトル')
 ->setRequired(true)//必須項目の指定
 ->addValidator('StringLength',false,array(1,20))
 ->setErrorMessages(array(
 'notEmpty'=>"タイトル名を入力して下さい。",
 'StringLength'=>"'%value%'は1~20文字以内で記入して下さい。"
 ));
 $content=new Zend_Form_Element_Textarea('content');
 $content->setAttribs(array('cols'=>40,'rows'=>3))
 ->setLabel('コンテンツ')
 ->addFilter('StripTags')
 ->setRequired(true)
 ->setErrorMessages(array(
 'notEmpty'=>"何か入力して下さい。"));
 $send=new Zend_Form_Element_Submit('send');
 $send->setLabel('新規追加');
 //コントローラの組込
 $form->addElement($title);
 $form->addElement($content);
 $form->addElement($send);
return $form;
 }

12) ブラウザで確認してみます。日本語でエラーメッセージが表示されました。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ