レイアウトとウェブフォームを併せて使う
最後に、DijitレイアウトとDijitウェブフォームを併せて使う方法を簡単に紹介します。最初に説明したとおり、Dijitレイアウトはペインごとに入力を必要とします。一方でウェブフォームはウェブフォーム単位でまとめて出力されます。そのため、通常の方法ではウェブフォームの中身の一部をあるペインに、別の一部を他のペインに...ということはできません。では、一つのフォームの内容を複数のペインに分割して表示するにはどのようにすれば良いでしょうか?
これを実現するためには、
- ペインごとに分割したい内容を子フォーム(Subform)に登録するようにし、
- 親フォームがレイアウトのコンテナとして、子フォームがペインとしてふるまうようにそれぞれにデコレータを登録する
という方法があります。デコレータは、ウェブフォームのオブジェクトがどのように描画されるかを変更するためのZend_Formの仕組みで、フィルタのように前から受け取った内容を加工し、後ろに出力します。
では、まず各フォームのデコレータの変更を見ていきましょう。
//(親)フォーム $form = new Zend_Dojo_Form; ... $form->setDecorators(array( //TabContainer以外のデコレータ 'FormElements', //TabContainerとしてふるまうためのデコレータ(1) array('TabContainer', array( ... //TabContainerのパラメータ ) ), //TabContainer以外のデコレータ 'DijitForm' ) ); ... //子フォーム $subform1 = new Zend_Dojo_Form_Subform; ... $subform1->setDecorators(array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), //ContentPaneとしてふるまうためのデコレータ(2) 'ContentPane', ) ); ...
リスト13の(1)を含むメソッド呼び出しでは親フォームのデコレータを設定しています。前にある「FormElements」と後にある「DijitForm」は標準でも使われるデコレータなので、そのまま登録されるようにしておきます。その間にある「TabContainer」デコレータの登録がミソで、これを入れることでこの親フォームがDijitレイアウトのTabContainerとしてふるまいます。
(2)でも同様に、子フォームのデコレータを設定しています。こちらは「ContentPane」デコレータを登録することで、Dijitレイアウトのペインとしても機能するようにしています。
この後は分散したいウェブフォーム要素を子フォームに登録し、通常どおり出力すればペインごとに分割されたフォームを作成することができます。Tabレイアウトとフォームを組合せたサンプルの実行結果が図17です(サンプルはhttp://localhost/index/formtabで表示されます)。
このように、ちょっと手続きが複雑ですが柔軟なウェブフォームとレイアウトを組み合わせることができます。
おわりに
今回はDojo Toolkitの高機能ウェブウィジェットDijitをZend_Frameworkから使う方法について説明しました。カスタムウェブフォーム要素やレイアウトを少し活用するだけで、随分と見栄えのするページを作成することができると思います。
次回はテキスト検索エンジンのZend_Search_Luceneモジュールの紹介を行います。Zend_Search_Luceneは完全にPHPで書かれたテキスト検索エンジンで、ローカルのファイルに索引を持つため、他のプログラム等に依存せずに利用することができます。名前の通り索引の形式がApache Luceneと互換性があるため、Apache Luceneで作成した索引をZend_Search_Luceneで利用することも可能ですし、HTMLファイルやOffice 2007のファイル(Word 2007、Powerpoint 2007、Excel 2007のファイル)から自動的に索引を作る機能も持っているため、ファイルを管理するシステムを手軽に作ることができます。