Zend_Form

0pt

PEAR::HTML_QuickFormっぽい。DecoratorとかView_Helperとかあってますます複雑に…。結局柔軟なデザインしようと思ったらテンプレートにべた書きするのが一番。

Element生成が設定ファイルからできるのは楽だなぁ。

Smartyを使いたい

Zend_View_Abstractの代わりにSmartyを使うのはなか面倒くさそうだ…。(http://codeutopia.net/blog/2007/11/03/the-best-smarty-zend-v...

というわけで、こういう方法を考えました→Zend_Form+Smarty

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を参考にしてください。

「Zend_Form」について友人に書いてもらう。

あなたにとって「Zend_Form」とは?

ログインするとワンクリックでキーワードを投稿できます

ログインする 新規登録する

関連したキーワードを持つお気に入り

他の人の「Zend_Form」を見る