Pages

2010年3月19日金曜日

Zend_Form_Element_File を利用する際にハマった

Zend_Form_Element_File を利用する際にハマった事をメモ。

Zend_Form_Element_Text とかだと下記のようにDecoratorを指定する事が多いんだけど、その勢いで Zend_Form_Element_File もやったらハマってしまった。。。

->setDecorators(array(
    array('ViewHelper', array()),
    array('Description', array('tag'=>'div')),
    array('Errors', array('class'=>'Errors')),
));

どういう理由かまでは調べてないけど、Zend_Form_Element_File ではデコレータを取得してレンダリングするところで下記のような記述があった。

$marker = false;
foreach ($this->getDecorators() as $decorator) {
    if ($decorator instanceof Zend_Form_Decorator_Marker_File_Interface) {
        $marker = true;
    }
}

if (!$marker) {
    require_once 'Zend/Form/Element/Exception.php';
    throw new Zend_Form_Element_Exception('No file decorator found... unable to render file element');
}

つまりZend_Form_Decorator_Marker_File_Interfaceじゃないインスタンスのみの場合スローされてしまう。
ではZend_Form_Decorator_Marker_File_InterfaceのDecoratorって何なんだって事で調べてみると。

Zend_Form_Decorator_Form というのがそれにあたるようだと解った。

つまりZend_Form_Element_Fileを利用する時はZend_Form_Decorator_Formが必須となるという事。
となるとViewHelperは使わないという事を意味する。

という事で下記がサンプルとなります。

$element = new Zend_Form_Element_File('test');
$element
    ->setRequired(false)
    ->setValidators(array(
        array (
            'validator' => 'Count',
            'breakChainOnFailure' => true,
            'options' => array(1),
        ),
        array (
            'validator' => 'FilesSize',
            'breakChainOnFailure' => true,
            'options' => array(1 * 1024 * 1024),
        ),
        array (
            'validator' => 'Extension',
            'breakChainOnFailure' => true,
            'options' => array('jpg,jpeg,bmp'),
        ),
        array (
            'validator' => 'ImageSize',
            'breakChainOnFailure' => true,
            'options' => array(
                'minwidth'  => 200,
                'minheight' => 200,
                'maxwidth'  => 1000,
                'maxheight' => 1000
            ),
        )
    ))
    ->setDecorators(array(
        array('File', array()),
        array('Description', array('tag'=>'div')),
        array('Errors', array('class'=>'Errors')),
    ));
$this->addElement($element);

0 件のコメント:

コメントを投稿

Followers