iniファイルを利用してフォームを育成する際の注意点
注意点という訳では無いのですが、はまったので覚え書き!
やりたいこと
Zend_Formを利用する際にiniファイルを利用する場合にdl,dt,dtを使わないでテーブルを利用します。
デコレータの設定
まずはapplications/config/直下に「form.ini」のような名前で空ファイルを作成します。
次にセクション単位でデコレータを設定していきます。
この際セクションを利用しなくてもOKです。
利用しない場合はセクション名が配列のルートになるようにします。
例
[section_name] → section_name.ViewHelper.decorator = "ViewHelper"
デコレータを設定すると以下のようになります。
[form]method = "post"
action = "/admin/user/confirm/"
; フォームタグなどのデコレータ
[decorators]
FormElements.decorator = "FormElements"
htmlTag.decorator = "HtmlTag"
htmlTag.options.tag = "table"
htmlTag.options.cellpadding = "0"
htmlTag.options.cellspacing = "0"
form.decorator = "Form"
; 要素のデコレータ
[elementDecorators]
ViewHelper.decorator = "ViewHelper"
;ViewHelper.options[] =
Description.decorator = "Description"
Description.options.tag = "span"
HtmlTag.decorator = "HtmlTag"
HtmlTag.options.tag = "td"
Label.decorator = "Label"
Label.options.tag = "th"
alias.OuterHtmlTag.decorator = "HtmlTag"
alias.options.tag = "tr"
; フォーム要素の生成
[elements]
name.type = "user_name"
name.options.class = "input"
name.options.label = "ユーザー名"
aliasから始まっているのは、Zend_Formでフォームを生成する際に同一デコレータ名が指定されていると最後に指定されたでデコレータを利用してしまうため、別名をつけて回避するためです。
フォームを生成する
decoratorやフォーム要素を記述したら、後はZend_FormのコンストラクタにZend_Config_Iniの結果オブジェクトを渡し、render()メソッドを呼び出すことでフォームを生成出来ます。
はまったところ
tableタグはtrを追加しないと正常にレンダリングされませんが、このtrをつけるのがやっかいでした。
どうすんだーどうすんだー!って悩んで居ましたが、「aliiasをつけることで回避出来ます」と見て、aliasと付け足し回避しました。
「alias」は好きな言葉を設定する事も可能です。
例えば「hoge」でもaliasの扱いになります。
最後に
iniファイルだけでは余り自由度が高くありませんが、登録フォームや簡単なメールフォームであれば事足りる位です。
それと今回の方法では、追加された要素全てに適用されますので、送信ボタン等を生成する際は個別に指定した方が良いかもしれません。
それか一括で指定して、
$form = new Zend_Form($config);$submit = $form->getElement("submit") ;
$submit->setDecorators(array(
array("ViewHelper")
));
のように特定要素のみを変更しても良いかもしれません。