вход массива как name = "person []" в форме Zend - PullRequest
8 голосов
/ 07 февраля 2011

В обычном 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;

Это выглядит как хорошее начало, но мне интересно, достаточно ли использовать декоратор. Возвращаемые значения должны быть правильно прочитаны и доставлены на сервер, а затем проверены на стороне сервера. Так что декоратор это неправильная идея? Будет ли пользовательский элемент иметь больше смысла здесь? Я не видел хорошего примера, который показывает, как это можно сделать.

1 Ответ

13 голосов
/ 07 февраля 2011

Я думаю, что 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]');

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

...