2

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>

1 Answer 1

4

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Isn't it possible to just all the child_name elements to one subform?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.