Как работать с субформами Zend, когда количество каждой из них неизвестно

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

<input type="text" name="contacts[0][fname]" />
<input type="text" name="contacts[0][sname]" />

Но пользователь может захотеть добавить еще один контакт, который будет дублировать элементы с помощью javascript, чтобы получить следующее:

<input type="text" name="contacts[0][fname]" />
<input type="text" name="contacts[0][sname]" />
<br />
<input type="text" name="contacts[1][fname]" />
<input type="text" name="contacts[1][sname]" />

Я знаю, как создать первый набор элементов, однако, если форма отправлена ​​и есть ошибки, как я могу обеспечить отображение правильного количества элементов «контактов»?


person spooky    schedule 15.02.2012    source источник
comment
Здесь есть аналогичный вопрос: stackoverflow.com/questions/6831145 /, это может быть полезно.   -  person dinopmi    schedule 15.02.2012
comment
Оказывается, это ошибка в ZF, которая не исправлена ​​до версии 2.0 - stackoverflow.com/questions/2849884/   -  person spooky    schedule 17.02.2012


Ответы (1)


Мне никогда не приходилось делать это с Zend_Form, но я делал это с помощью sfForm Symfony 1.4, который имеет аналогичный API и теорию работы. Исходя из этого, основной процесс:

  1. В конструкторе родительских форм инициализируйте некоторое количество подчиненных форм по умолчанию. Вы захотите разделить логику для фактического создания и встраивания n подчиненных форм в отдельные методы. Я буду называть это методом emebedContacts($count = 1)

  2. Переопределите методы isValid и setDefaults в родительской форме, чтобы они определяли количество подчиненных форм в переданных им $data аргументах, а затем вызывали embedContacts перед вызовом parent::isValid() или parent::setDefaults().

Надеюсь, это поможет.

person prodigitalson    schedule 15.02.2012
comment
Привет, спасибо, это помогло. Однако я был смущен тем, как сгруппировать их в элементе «контакты», но в итоге я создал одну пустую подчиненную форму, назначив ее как «контакты», которая, в свою очередь, содержала проиндексированные подчиненные формы, а затем, в свою очередь, содержала элементы fname, sname и т. д. - person spooky; 16.02.2012
comment
Извините, проблемы все еще возникают - то, что я сделал выше, правильно настроило форму, однако, когда я пытаюсь визуализировать элементы подчиненной формы напрямую, их имена не отображаются в формате массива, т.е. они отображаются как name = fname, а не name = contacts [ 0] [имя] - person spooky; 16.02.2012
comment
Есть метод, который вам может потребоваться вызвать вручную или передать параметр ... я думаю, что это что-то вроде Zend_Form::setIsArray, но я не уверен, что вам нужно будет проверить документы. Также убедитесь, что вы передаете второй аргумент addSubform, который является именем / ключом, с которым вы позже получите к нему доступ, и что будет закодировано в атрибуте name элементов. - person prodigitalson; 16.02.2012
comment
Привет, спасибо, но я сделал все это - элементы отображаются нормально, если я повторяю форму $, но когда я повторяю элементы подчиненной формы напрямую, имена не форматируются правильно - person spooky; 16.02.2012