Динамическое добавление элементов формы с помощью jQuery и Zend_Form - PullRequest
2 голосов
/ 06 января 2012

У меня есть форма, в которой люди смогут добавлять одну и ту же часть элементов с помощью кнопки плюс, чтобы получилось нечто подобное:

<div id="person-1" class="person">
    <input type="text" name="name-1" id="name-1" />
    <input type="text" name="age-1" id="age-1" />
</div>
<!-- as of here, it's JS created -->
<div id="person-2" class="person">
    <input type="text" name="name-2" id="name-2" />
    <input type="text" name="age-2" id="age-2" />
</div>
<div id="person-3" class="person">
    <input type="text" name="name-3" id="name-3" />
    <input type="text" name="age-3" id="age-3" />
</div>

Мне уже удалось написать jquery-код, который позволяет мне снова добавлять те же элементы с новым идентификатором (имя-1, возраст-1, имя-2, возраст-2, имя-3, возраст-3, ...).

Конечно, Zend_Form не знает о name-2 и name-3 , поэтому он просто удаляет их, когда форма содержит ошибку и отображается снова. Я также не могу получить доступ к значению name-2 с помощью $form->getValue('name-2'). Я должен идти по сырому $this->getRequest()->getPost().

Есть ли лучший способ, который я могу использовать для объединения Zend_Form и элементов формы на основе javascript (того же типа, что и элемент с жестким кодом).

Предостережение : В реальной проблеме это select, а не input. Выяснилось, что это может иметь значение (с ->setIsArray(true)), но использование select взорвет код примера.

1 Ответ

2 голосов
/ 06 января 2012

Что вы можете сделать, это создать контейнер подчиненной формы внутри вашей главной формы и добавить количество X подчиненных форм в этот контейнер. Например:

class My_Form extends Zend_Form
{
    private $_numPersons = 1;

    public function setNumPersons($numPersons)
    {
        $this->_numPersons = (int) $numPersons;
    }


    public function init()
    {
        $container = new Zend_Form_SubForm();
        $this->addSubForm($container, 'persons');

        for($index = 0; $index < $this->_numPersons; $index++) {
            $personForm = new My_PersonForm();
            $container->addSubForm($personForm, $index+1);
        }
    }
}

При отображении поля ввода будут иметь имена, такие как persons[1][name]. Обратите внимание, что $index+1, Zend_Form не позволяет форме называться «0».

Конечно, вы должны использовать этот метод, только если количество подчиненных лиц ограничено.

Другая стратегия заключается в переопределении метода isValid и использовании единственной формы My_PersonForm для проверки всех данных о персонале.

Sidenote; приведенный выше код будет работать только в том случае, если вы определяете numPersons как часть набора параметров при создании экземпляра формы. Например,.

$form = new My_Form(array('numPersons' => 10));

...