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 FrameworkのMCVモデルから利用する方法について説明します。

フォームのHTML出力

 フォームのHTMLとして出力するにはZend_Formrenderメソッドを利用します。ただし、単純にフォームそのものをechoするだけでもHTMLの出力はされます。例えば、先程作成した$formをHTMLとして出力するには、次のようにします:

フォームのHTML出力
echo $form->render();
//単純に echo $form; でも良い

 ここから紹介するサンプルはZend FrameworkのMCVモデルを利用しています。つまり、Zend_Controllerが全体の処理の流れを制御し、Zend_Viewを利用して出力を生成します。処理の流れですが、まず「index.php」でフロントコントローラが作成され、(標準では)ここからindexコントローラのindexアクションへ処理がディスパッチされます:

IndexControllerのindexAction(IndexController.php)
<?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」は次のようになっています:

サンプルの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と入力された場合の処理結果を示します:

フォームにTESTと入力した
フォームにTESTと入力した
TESTと入力された結果
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」へアクセスした結果は次のとおりになります:

Zend_Form_Element_Hashによるエラー
Zend_Form_Element_Hashによるエラー

次のページ
Zend_Configを使ったフォームの作成

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング