Рендеринг массива ввода с использованием Zend_Form - PullRequest
2 голосов
/ 18 июня 2011

Как создать Zend-форму, которая будет отображаться следующим образом

Обратите внимание child_name[] как имя на последних 3 входных тегах.

(я намеренно опустил теги декораторов)

<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 Ответ

4 голосов
/ 18 июня 2011

Вот код вида

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');
    }
}

Тогда в вашем шаблоне просто отобразите форму.

...