このパッケージは、PageController デザインパターンを実装したものです。 これは、リクエストの受け取りと (受け取った GET データあるいは POST データに依存した) アクションの実行をひとつのページで行うことを意味します。 PageController パターンについては、 Martin Fowler のウェブサイト および WACT プロジェクトのウェブサイト でより詳しく説明されています。
QuickForm においてこれがどのような意味を持つかというと、 ひとつのスクリプト内で、リクエストの内容に応じて さまざまなフォームの表示や入力内容の検証を行うということです。 これにより、複数ページで構成される複雑なフォーム (ウィザードなどを思い浮かべでください) を ほんとうに簡単に作成できるようになります。
PageController パターンの最も基本的な実装は、以下のようになります。
switch ($_REQUEST['action']) { case 'foo': doFoo(); break; case 'bar': doBar(); break; default: echo 'Hello, world!'; } |
HTML_QuickForm_Controller: このクラスは、リクエストからアクション名を抽出して 適切なハンドラをコールします。ここには複数のページが含まれます。
HTML_QuickForm_Page: このクラス (HTML_QuickForm を継承しています) は、 フォームの各ページを表します。
HTML_QuickForm_Action: このクラスは、Command デザインパターン (つまり、オブジェクト指向のコールバック) を実装します。
セッションの初期化 ページ間でのデータのやりとりの必要がないため、この例ではセッションを使用しません。 しかし、実際に複数ページのフォームを使用する際にはきっとセッションが必要となるでしょう。 HTML_QuickForm_Controller は、セッションを自動的には開始 しません。コントローラクラスのインスタンスを作成する前に、 session_start() を明示的にコールする必要があります。
このパッケージの機能について理解するため、 HTML_QuickForm チュートリアル の例を HTML_QuickForm_Controller で書き直してみましょう。
例 47-1基本的なコントローラの使用法
|
もとのコードより冗長になってしまっていると思われるかもしれません。 確かにそのとおりですが、3 ページからなるウィザード形式のフォームを 作成する場合のことを考えてみましょう。HTML_QuickForm_Controller を使用している場合は、 HTML_QuickForm_Page のサブクラスを 3 つ作成し、 HTML_QuickForm_Action に基づいた 'process' イベントのハンドラを作成して それらをコントローラに追加するだけですみます。 しかし、HTML_QuickForm_Controller を使用していない場合は 大量のプログラミングが必要となることでしょう。
まず HTML_QuickForm_Page のサブクラスを作成し、 buildForm() メソッドをオーバーライドする必要があります。 (QuickForm になじみが深い方なら) その内容は見慣れているでしょうが、多少の例外があります。
$this->_formBuilt = true; |
2 番目に注意すべき点は、以下の行です。
$this->addElement('submit', $this->getButtonName('submit'), 'Send'); |
3 番目は、以下の行です。
$this->setDefaultAction('submit'); |
通常は、'process' および 'display' の 2 つのアクションについてのハンドラを作成する必要があります。 前者については、ここで説明することは困難です。というのも、 そのフォームで何をどのように処理すべきなのかを知っているのは あなた自身だけだからです。後者については、 HTML_QuickForm_Action_Display のサブクラスを作成してその _renderForm() メソッドをオーバーライドし、適切な レンダラ をコールして独自の出力を行えるようにする必要があります。
次に、上で定義したページクラスのインスタンスを作成します。
$page =& new FirstPage('firstForm'); |
$page->addAction('process', new ActionProcess()); |
それから、コントローラのインスタンスを作成します。
$controller =& new HTML_QuickForm_Controller('tutorial'); |
それから、フォームのデフォルト値を設定してそれをページに追加します。
$controller->setDefaults(array( 'name' => 'Joe User' )); $controller->addPage($page); |
最後に、コントローラの run() メソッドをコールします。
$controller->run(); |