Search code examples
zend-frameworkzend-formzend-file

Zend File Upload and Element Decorators


I have the problem, that the following Zend Form throws an error. The problem is the "file"-element and using setElementDecorators.

    class Products_AddForm extends Zend_Form
{
    function init() {

       // other form elements...

       $uploadElement = new Zend_Form_Element_File('Excel');
       $uploadElement->setLabel('Excel');
       $this->addElement($uploadElement);

       $this->setElementDecorators(array(
            'ViewHelper', 
            'Errors',
            array(array('data' => 'HtmlTag'), array('tag' => 'td')),
            array('Label', array('tag' => 'th')),
            array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
        ));



    }
}

This throws an error.

(Warning: Exception caught by form: No file decorator found... unable to render file element Stack Trace: #0 ) 

Adding $uploadElement->addDecorator('File'); at the end after the SetElementDecorators will work, but this will give me the file element twice!

Can anybody help, please?

TIA Matt


Solution

  • The File element requires it's own decorator - Zend_Form_Decorator_File.

    $this->setElementDecorators(array(
          'File',
          'Errors',
          array(array('data' => 'HtmlTag'), array('tag' => 'td')),
          array('Label', array('tag' => 'th')),
          array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
    ));
    

    [edit]

    Have just noticed that you are also using other form elements.

    After your original code, add:

    $this->getElement('Excel')->setDecorators(
        array(
            'File',
            'Errors',
            array(array('data' => 'HtmlTag'), array('tag' => 'td')),
            array('Label', array('tag' => 'th')),
            array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
        )
    );
    

    That way, ViewHelper is added to all other elements, and for your File element File is used instead.