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」へアクセスした結果は次のとおりになります:

