В обычном html мы могли бы иметь поле массива типа person[]
<input name="person[]" type="text" /> <input name="person[]" type="text" /> <input name="person[]" type="text" />
Насколько мне известно, у Zend_Form этого нет. Я прочитал еще один ответ, который предположил, что это можно сделать с помощью декоратора, который добавит []
в нужное место. Это код для этого конкретного вопроса
$html = ''; // some code html $i = 0; foreach ($element->getMultiOptions() as $value => $label){ $html .= '<input type="checkbox" ' . 'name="'.$element->getName().'[]" ' . 'id="'$element->getName()'-'.$i.'" ' . 'value="'.$value.'" />'; $i++; } return $html;
Это похоже на хорошее начало, но мне интересно, достаточно ли использовать декоратор. Значения, возвращаемые обратно, должны быть правильно прочитаны и доставлены на сервер, а затем проверены на стороне сервера. Так что же декоратор – неправильная идея? Будет ли здесь особый элемент? Я не видел хорошего примера, показывающего, как это можно сделать.
Я думаю, что ZF не позволяет создавать отдельные текстовые поля ввода с именем person[]
, хотя вы можете сделать это для всей формы или подформы. Однако это позволяет что-то подобное. В частности, вы можете создавать поля с именем person[0]
, person[1]
и т. Д.
Для этого вы можете сделать следующее:
$in1 = $this->createElement('text', '0'); $in2 = $this->createElement('text', '1'); $in1->setBelongsTo('person'); $in2->setBelongsTo('person');
Таким образом, вы обычно можете присоединить ваши валидаторы, фильтры и т. Д. До $ in1 или $ in2, и они будут работать, как ожидалось. В вашем действии после проверки формы вы можете получить массив входных текстовых полей лица как:
$values = $yourForm->getValues(); var_dump($values['person']);
Интересно, что следующее НЕ будет работать:
$in1 = $this->createElement('text', 'person[0]'); $in2 = $this->createElement('text', 'person[1]');
Надеюсь, что это поможет вам.