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を作ってみた。

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にはこういうの↓を書いておきます。

stringLengthTooShort = "%min%文字以上入力して下さい"
stringLengthTooLong = "%max%文字以下で入力して下さい"
isEmpty = "入力して下さい"
notSame = "もう一度送信して下さい"
notInt = "数字を入力して下さい"
missingToken = "もう一度送信して下さい"
emailAddressInvalid = "正しいメールアドレスを入力して下さい"
emailAddressInvalid = "正しいメールアドレスを入力して下さい"
emailAddressInvalidHostname = "正しいメールアドレスを入力して下さい"
emailAddressInvalidMxRecord = "正しいメールアドレスを入力して下さい"
emailAddressDotAtom = "正しいメールアドレスを入力して下さい"
emailAddressQuotedString = "正しいメールアドレスを入力して下さい"
emailAddressInvalidLocalPart = "正しいメールアドレスを入力して下さい"

ちなみに設定するためのキーをどっから見つけるのかというと、Zend_ValidateにあるZend_Validate_Interfaceを実装した各クラスの定数です。メッセージ内に変数を使う場合は %hoge% という書式が利用できます。$_messageTemplatesを参考にしてください。