Zend_Formの履歴
PEAR::HTML_QuickFormっぽい。DecoratorとかView_Helperとかあってますます複雑に…。結局柔軟なデザインしようと思ったらテンプレートにべた書きするのが一番。
Element生成が設定ファイルからできるのは楽だなぁ。
Decoratorとは?
Zend_Formオブジェクトは[add|get|set|remove]Decoratorで指定する。
Zend_Form_ElementオブジェクトはsetElementDecoratorsで指定する。
デコレーターは登録した順に実行される。
ViewHelperデコレーターは要素部分をZend_View_Helperを使って出力するデコレーター。例えばZend_Form_Element_TextはZend_View_Helper_FormTextを使ってHTMLに出力する。
同じDecoratorは複数登録できない!?
テーブルレイアウトしようとして、次のようにしたけど動かない。
<?php $element->setDecorators(array( 'ViewHelper', 'Description', 'Errors', 'HtmlTag', array('tag' => 'td'), 'Label', array('tag' => 'td'), 'HtmlTag', array('tag' => 'tr'), )); ?>
こうするとinput周りのtdが消去されてしまう。
どうやら同じデコレーターを複数登録すると、先に登録した方は消されてしまうようだ。
で、どうやら配列で囲むといいらしい。
http://devzone.zend.com/article/3450-decorators-with-zend_fo...
<?php $element->setDecorators(array( 'ViewHelper', 'Errors', array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), array('Label', array('tag' => 'td'), array(array('row' => 'HtmlTag'), array('tag' => 'tr')), )); ?>
getValuesで値を取得したくない要素を設定する
setIgnoreする
<?php $e = $form->createElement('hidden', 'hoge') ->setIgnore(true); $form->addElement($e); ?>
遅い…
xdebugで確認したところ、select要素のaddMultiOption、getMulitOption内にある_translateValueが頻繁に呼び出されてて、ここがネックになってるっぽい。
というわけで、Mindia_Form_Element_FastSelectを作ってみた。
しかし、それでもQuickFormに比べると2倍ぐらい遅い。Zend_Formをインスタンス化したものをキャッシュとってようやく同等ぐらいになった。
Validatorのメッセージを変更したい
Zend_RegistryにZend_Translateを登録すると自動的に変更してくれます。
ハマリポイント! 何故かZend_Translateのlocaleを指定すると、キャッシュからデータを得た場合にlocaleがおかしくなる。自動にすると正しくやってくれます(v1.5)。
<?php $file = "ja.language.ini" $frontendOptions = array( 'automatic_serialization' => true, 'cache_id_prefix' => 'config', 'master_file' => $file ); $backendOptions = array( 'cache_dir' => 'cache' ); $cache = Zend_Cache::factory('File', 'File', $frontendOptions, $backendOptions); Zend_Translate::setCache($cache); // locale指定するとキャッシュから得る localeがおかしくなるので自動にする $translate = new Zend_Translate('ini', $file); // Zend_Formで自動翻訳するために登録 Zend_Registry::set('Zend_Translate', $translate); ?>
ja.language.iniにはこういうの↓を書いておきます。
※以下はini形式です。ini形式は1.6から対応してます。1.5系ではcsv形式(セミコロン区切り)にして下さい。
stringLengthTooShort = "%min%文字以上入力して下さい" stringLengthTooLong = "%max%文字以下で入力して下さい" isEmpty = "入力して下さい" notSame = "もう一度送信して下さい" notInt = "数字を入力して下さい" missingToken = "もう一度送信して下さい" emailAddressInvalid = "正しいメールアドレスを入力して下さい" emailAddressInvalid = "正しいメールアドレスを入力して下さい" emailAddressInvalidHostname = "正しいメールアドレスを入力して下さい" emailAddressInvalidMxRecord = "正しいメールアドレスを入力して下さい" emailAddressDotAtom = "正しいメールアドレスを入力して下さい" emailAddressQuotedString = "正しいメールアドレスを入力して下さい" emailAddressInvalidLocalPart = "正しいメールアドレスを入力して下さい"
ちなみに設定するためのキーをどっから見つけるのかというと、Zend_ValidateにあるZend_Validate_Interfaceを実装した各クラスの定数です。メッセージ内に変数を使う場合は %hoge% という書式が利用できます。$_messageTemplatesを参考にしてください。