texai
texai

Reputation: 3736

Render an array of input using Zend_Form

How can build a zend form that renders like this

Notice child_name[] as name on last 3 input tags.

(I've ommited decorators tags intentionally)

<form method="post" action="" enctype="application/x-www-form-urlencoded">
    <input type="text" value="" id="my_name" name="my_name">
    <input type="text" value="" id="wife_name" name="wife_name">
    <input type="text" value="" id="child_name-1" name="child_name[]">
    <input type="text" value="" id="child_name-2" name="child_name[]">
    <input type="text" value="" id="child_name-3" name="child_name[]">
</form>

Upvotes: 2

Views: 1997

Answers (1)

miholeus
miholeus

Reputation: 1587

Here is a code of the form

class MyForm extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');
        $this->setEnctype('application/x-www-form-urlencoded');


        $my_name = $this->addElement('text', 'my_name');
        $wife_name = $this->addElement('text', 'wife_name');
        $child_name1 = $this->addElement('text', "child_name", array(
            'attribs' => array(
                'id' => 'child-name-1'
            ),
            'isArray' => true,
        ));

        $subForm = new Zend_Form(array('disableLoadDefaultDecorators' => true));

        $subForm->setDecorators(array(
            'FormElements',
        ));

        $subForm->addElement('text', 'child_name', array(
            'isArray' => true,
            'decorators' => Array(
                'ViewHelper',
            ),
            'attribs' => array(
                'id' => 'child-name-2'
            ),
        ));

        $subForm2 = new Zend_Form(array('disableLoadDefaultDecorators' => true));

        $subForm2->setDecorators(array(
            'FormElements',
        ));

        $subForm2->addElement('text', 'child_name', array(
            'isArray' => true,
            'decorators' => Array(
                'ViewHelper',
            ),
            'attribs' => array(
                'id' => 'child-name-3'
            ),
        ));

        $this->addSubForm($subForm, 'subform');
        $this->addSubForm($subForm2, 'subform2');

        $this->addDecorator('FormElements')
             ->addDecorator('Form');


    }

    /**
     * Add Element to form without default decorators
     *
     * @see Zend_Form::addElement()
     */
    public function addElement($element, $name = null, $options = null)
    {
        parent::addElement($element, $name, $options);

        if (isset($this->_elements[$name])) {
            $this->removeDecorators($this->_elements[$name]);
        }
    }

    /**
     * Create form element without default decorators
     *
     * @see Zend_Form::createElement()
     */
    public function createElement($type, $name, $options = null)
    {
        $element = parent::createElement($type, $name, $options);
        $this->removeDecorators($element);
        return $element;
    }
    /**
     * Remove default decorators for $element
     *
     * @param Zend_Form_Element $element
     */
    protected function removeDecorators($element)
    {
        $element->removeDecorator('Label');
        $element->removeDecorator('HtmlTag');
        $element->removeDecorator('DtDdWrapper');
        $element->removeDecorator('Description');
    }
}

Then in your template just echo the form.

Upvotes: 4

Related Questions