Zend_Formの利用
次に、作成したZend_Form
をZend FrameworkのMCVモデルから利用する方法について説明します。
フォームのHTML出力
フォームのHTMLとして出力するにはZend_Form
のrender
メソッドを利用します。ただし、単純にフォームそのものをecho
するだけでもHTMLの出力はされます。例えば、先程作成した$form
をHTMLとして出力するには、次のようにします:
echo $form->render(); //単純に echo $form; でも良い
ここから紹介するサンプルはZend FrameworkのMCVモデルを利用しています。つまり、Zend_Controllerが全体の処理の流れを制御し、Zend_Viewを利用して出力を生成します。処理の流れですが、まず「index.php」でフロントコントローラが作成され、(標準では)ここからindexコントローラのindexアクションへ処理がディスパッチされます:
<?php ... class IndexController extends Zend_Controller_Action { ... private function createForm() { $form = new Zend_Form; ... return $form; } public function indexAction() { $form = $this->createForm(); $this->view->assign('form', $form); } ...
ここでcreateFrom
メソッドで作成したZend_Form
を変数$form
に格納し、それをビュースクリプトのassign
メソッドを使ってビュースクリプトへ引き渡しています。ここで引き渡された$form
はビュースクリプト内部からは$this->form
として参照できます。
実際に描画を担当するビュースクリプト「index.phtml」は次のようになっています:
<?php echo $this->Doctype('XHTML1_STRICT') ?> <html> <head><title>Zend Form Test</title></head> <body> <p> <a href="/">normal</a>/ <a href="/index/config">config</a> </p> <?php echo $this->form->render(); ?> </body> </html>
ここで、indexアクションから渡された$this->form
を出力しています。これを表示した結果は次のようになります:
ユーザーの入力の解析
ユーザーからの入力の解析にはフォームのisValid
メソッドを使います。このメソッドにユーザーからの入力を渡します。通常はリクエストオブジェクトを取得し、そのリクエストオブジェクトのgetParams
メソッドを利用してユーザーからの入力を得ます。
メソッド名 | 引数 | 説明 |
isValid | $data | $form->isValid($data)の形式で利用する。配列$dataで与えられた入力データを解析し、チェックする。成功すればtrueを、失敗すればfalseを返す。 |
isValidPartial | $data | $form->isValidPartial($data)の形式で利用する。配列$dataで与えられた入力データのうち、対応する要素があるものだけを対象にチェックする。成功すればtrueを、失敗すればfalseを返す。 |
processAjax | $data | $form->processAjax($data)の形式で利用する。基本的な処理はisValidPartialと同じで、フォームの一部のみをチェックする。成功すればtrueを返し、失敗すればチェックのエラーメッセージをmessageとして持つ、key/messageの組をJSON形式で返す。AJAXなどで利用することを想定している。 |
ここでは、サンプルを使い解説します。サンプルでユーザーからの入力を受け付けるのはhelloアクションです:
public function helloAction() { $form = $this->createForm(); $req = $this->getRequest(); if (!$form->isValid($req->getParams())) { $this->view->assign('form', $form); return $this->render('index'); } $values = $form->getValues(); $this->view->assign('user', $values['user']); }
このアクションでは、まず入力をチェックするためのフォームをまず作成し、$form
に代入しています。次にisValid
メソッドでユーザーからの入力が正しいかどうかチェックしています。
もし問題がある場合(isValid
がfalseの場合)には、helloビュースクリプトではなく、indexスクリプトを利用して描画します。もし問題がない場合には解析の結果をgetValues
で取得し、そこからuser
に設定された値をビュースクリプトの変数$user
に代入します。
正常に処理された場合
まず、フォームにTESTと入力された場合の処理結果を示します:
この場合チェックは正常に終了しますので、ビュースクリプトも「hello.phtml」の方が実行されます。なお、StringToLowerフィルタが設定されているため、入力のTESTはtestとして出力されていることに注意してください。
チェックに問題があった場合
次にフォームを空欄にしたまま送信してみます。すると、$user
はrequiredがtrueになっており、空欄であることは許されないためチェックでは問題が生じます。
この場合の処理は、「index.phtml」に$form
を渡し、それを描画するというものになります。実はエラーが発生したときに$form
を表示すると、エラーのあった箇所にエラーの内容が表示されます。
このように、フォームの入力に問題があった場合、フォーム要素にエラーが発生した場合の表示内容が設定されていれば、自動的にその内容を表示してくれます。なお、エラーメッセージは標準では英語で表示されます。この表示を日本語を表示でする方法については次回扱います。
また、今回のサンプルでは「Zend_Form_Element_Hash」を利用しています。そのため、フォームを利用しないでフォームへデータを送ろうとした場合もエラーになります。試しに「http://localhost/index/hello?user=codezine&checkHash=test」へアクセスした結果は次のとおりになります: