Zend_Formとフォーム要素の作成
ではまず、Zend_Formとフォーム要素の作成と設定について見てみましょう。最初はZend_Controller等と連携させず、単独のPHPスクリプトとして利用してみます(サンプルのmaking_form.phpと対応しています)。
Zend_Formのインスタンスの作成と設定
ではまず、簡単なZend_Formのインスタンスを作成してみます。ここではZend_Formのコンストラクタを引数なしで呼び出し、属性を2つ設定しています:
require_once 'Zend/Form.php';
//form の作成・設定
$form = new Zend_Form;
$form->setAction('/index/hello')
->setMethod('post');
ここで$formのsetActionメソッドとsetMethodメソッドを呼び出していますが、これらはそれぞれ、フォームのaction属性とmethod属性を設定するためのメソッドです。
このフォームに対応するHTMLのフォームは次のようになります:
<form enctype="application/x-www-form-urlencoded"
action="/index/hello" method="post">
<dl class="zend_form">
</dl></form>
実際にはビューオブジェクトを登録しないとこのような出力は得られません。
実は、Zend_Form単体では内容のある出力をすることができず、Zend_Viewと組み合わせる必要があります。そこで、このフォームが利用するZend_ViewのオブジェクトをsetViewメソッドで登録してやります:
/* 使用する Zend_Viewを設定 */ require_once 'Zend/View.php'; $view = new Zend_View; $form->setView($view);
ここでは、まずZend_Viewのインスタンスを作成した後、setViewで$formに登録しています。
なお、Zend_Viewを登録しないまま、ある程度内容のあるフォームを出力しようとすると'ViewHelper decorator cannot render without a registered view object'というエラーが出てしまいます。また、後で紹介するようにコントローラ内で作成された場合には、自動的にZend_Viewが登録されます。
フォーム要素の作成と設定
次に、フォームの中身となるフォーム要素を作成します。さらにフォーム要素にチェック機能に関する設定(Validatorの設定)、フォーム要素の内容の加工に関する設定(Filterの設定)も行います。
フォーム要素の作成
フォーム要素を作成する方法としては、通常どおりにコンストラクタを呼び出す方法と、フォームのcreateElementを利用する方法とがあります:
require_once 'Zend/Form/Element/Text.php';
$user = new Zend_Form_Element_Text('user');
//上の二行のかわりに下でも良い
$user = $form->createElement('text', 'user');
通常はフォームのcreateElementを利用する方法が良いでしょう。というのも、こちらの方法を利用すれば、Zend_FormがZend_Loader_PluginLoaderを利用して、自動的にフォーム要素のクラスを探して来てくれるため、明示的にフォーム要素のクラスをrequireしなくて済みます。
実は、後から紹介するフォームのaddElementには、フォーム要素の作成と追加を同時に行う機能もあります。そのため、上のように明示的にフォーム要素を作成せずに、まとめてaddElementで作成と追加をすることも可能です。
フォーム要素の設定
次に、先程作成したフォーム要素の設定を行います。ここではフォーム要素の表示や(HTMLタグとしての)属性に関する設定だけでなく、ValidatorやFilterに関する設定も行います。
また、このフォーム要素がどのように表示されるかを変更するにはDecoratorを設定します。Decoratorについては次回扱う予定です。
フォーム要素のValidator
ValidatorはZend_Validateモジュールの機能を利用した、ユーザーからの入力が正しいかどうかをチェックするための仕組みです。フォーム要素のaddVaildatorで作成/追加することができます。ユーザーの入力を解析する際にisValidメソッドを使えば、このフォーム要素へのユーザーの入力がValidatorの条件に合っているかどうかを調べることができるようになります。
Validatorをフォーム要素に追加するにはフォーム要素のaddValidatorメソッドを使います。これはフォームのaddElement同様、あらかじめ作っておいたValidatorのオブジェクトを追加する方法と、addValidatorで作成と同時に追加する方法と、2通りあります。addValidatorの構文は、次のとおりです。
addValidator($nameOrValidator, $breakChainOnFailure, $options)
| 引数 | 標準の値 | 説明 |
| $nameOrValidator | (なし) | Validatorの名前ないしValidatorのオブジェクト |
| $breakChainOnFailure | false | このValidatorで検証に失敗した場合、残りのValidatorをチェックするかどうか |
| $options | null | Validatorに渡す引数を配列に格納したもの |
Validatorの名前にはクラス名の他に、クラス名を省略した形で渡すこともできます。
//予め作成したValidatorを追加
$validator = new Zend_Validator_Alnum();
$formElement->addValidator($validator);
//上と同じ
$formElement->addValidator('Alnum');
$formElement->addValidator('alnum');
//上と同じだが、引数を省略していないもの
//最後のarray(false)はZend_Validate_Alnumへの引数
$formElement->addValidator('Zend_Validate_Alnum', false, array(false));
組み込みのValidatorには次のようなものがあります($valueは検証対象の値)。
| 名前 | Validatorの引数 | 説明 |
| Alnum | $allowWhiteSpace | $valueが英数字のみ含むか調べる。$allowWhiteSpaceは省略可能で、標準ではfalse(trueなら空白も許容する)。 |
| Alpha | $allowWhiteSpace | $valueがアルファベットのみ含むか調べる。$allowWhiteSpaceは省略可能で、標準ではfalse(trueなら空白も許容する)。 |
| Barcode | $type | $value与えられたバーコードとして有効かどうかを調べる。$typeにはバーコードの種類("UPC-A"か"EAN-13")を指定する。 |
| Between | $min, $max, $inclusive | $valueが$minと$maxの範囲に入っているか調べる。$inclusiveは省略可能で、標準ではtrue。inclusiveがtrueなら境界値を含む。 |
| Ccnum | (なし) | $valueがクレジットカードとして有効な番号か調べる(Luhn algorithm)。 |
| Date | $format, $locate | $valueが日付として正しいフォーマット(YYYY-MM-DD)になっているか調べる。$formatや$localeは省略可能で、指定されていればそれに応じた正しいフォーマットになっているかを調べる。 |
| Digits | (なし) | $valueが数字のみを含むかを調べる。 |
| EmailAddress | $allow, $validateMx, $hostnameValidator | $valueが電子メールのアドレスとして有効であるか調べる。標準ではDNSのホスト名として正しいアドレスであるかを調べるが、$allow, $validateMx, $hostnameValidator を指定することによって変更することも可能。 |
| Float | (なし) | $valueが浮動小数であるか調べる。 |
| GreaterThan | $min | $valueが$minよりも大きいか調べる。 |
| Hex | (なし) | 16進数であるか調べる。 |
| Hostname | $allow, $validateIdn, $validateTld, $ipValidator | $valueが有効なホストであるか調べる。標準ではDNSホスト名として有効かのみ調べるが、$allow, $validateIdn, $validateTld, $ipValidatorを指定することで変更することも可能。 |
| InArray | $value, $haystack, $strict | $valueが配列$haystackに含まれているか調べる。$strictがtrueなら、型が一致しているかも調べる(標準ではfalse)。 |
| Int | (なし) | $valueが整数であるか調べる。 |
| Ip | (なし) | $valueがIPアドレスであるか調べる。 |
| LessThan | $max | $valueが$maxより小さいか調べる。 |
| NotEmpty | (なし) | $valueが空でないか調べる。 |
| Regex | $pattern | $valueが正規表現$patternにマッチするか調べる。 |
| StringLength | $min, $max | 文字列$valueの長さが、$minと$maxで与えられた範囲にあるか調べる。$min, $maxは省略可能で、標準の値は$minが0、$maxがnull(この場合は最大値は調べない) |
例えばAlnumバリデータが指定されているフォーム要素に英数字以外の入力が来た場合にはユーザーからの入力を解析する段階で検出されます。
