SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

Zend Framework入門(11):
検証機能を含むリッチフォームの作成 - Zend_Form -(前編)

Zend Frameworkによる実践的なPHPアプリケーション開発 11

  • X ポスト
  • このエントリーをはてなブックマークに追加

Zend_Formとフォーム要素の作成

 ではまず、Zend_Formとフォーム要素の作成と設定について見てみましょう。最初はZend_Controller等と連携させず、単独のPHPスクリプトとして利用してみます(サンプルのmaking_form.phpと対応しています)。

Zend_Formのインスタンスの作成と設定

 ではまず、簡単なZend_Formのインスタンスを作成してみます。ここではZend_Formのコンストラクタを引数なしで呼び出し、属性を2つ設定しています:

Zend_Formの作成
require_once 'Zend/Form.php';

//form の作成・設定
$form = new Zend_Form;
$form->setAction('/index/hello')
    ->setMethod('post');

 ここで$formsetActionメソッドとsetMethodメソッドを呼び出していますが、これらはそれぞれ、フォームのaction属性とmethod属性を設定するためのメソッドです。

 このフォームに対応するHTMLのフォームは次のようになります:

このZend_Formに対応する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を設定
/* 使用する Zend_Viewを設定 */
require_once 'Zend/View.php';
$view = new Zend_View;
$form->setView($view);

 ここでは、まずZend_Viewのインスタンスを作成した後、setView$formに登録しています。

Zend_Viewの登録

 なお、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_FormZend_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)
addValidatorの引数
引数 標準の値 説明
$nameOrValidator (なし) Validatorの名前ないしValidatorのオブジェクト
$breakChainOnFailure false このValidatorで検証に失敗した場合、残りのValidatorをチェックするかどうか
$options null Validatorに渡す引数を配列に格納したもの

 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
名前 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バリデータが指定されているフォーム要素に英数字以外の入力が来た場合にはユーザーからの入力を解析する段階で検出されます。

次のページ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3094 2008/10/23 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング