Zend Framework, Zend_Form_Element как установить произвольное имя? - PullRequest
0 голосов
/ 02 апреля 2010

У меня есть форма, где некоторые поля выглядят как строки, поэтому я могу добавить / удалить их с помощью JS. Например:

Поле с ID = 1 (существующая строка)

<input id="id[1]" type="text" name="id[1]" value="1" />
<input id="name[1]" type="text" name="name[1]" value="100" />

Поле с ID = 2 (существующая строка)

<input id="name[2]" type="text" name="name[2]" value="200" />
<input id="name[2]" type="text" name="name[2]" value="200" />

новая строка, созданная по умолчанию (чтобы добавить еще одну строку к существующим строкам)

<input id="id[n0]" type="text" name="id[n0]" value="" />
<input id="name[n0]" type="text" name="name[n0]" value="" />

новая строка, созданная JS

<input id="id[n1]" type="text" name="id[n1]" value="" />
<input id="name[n1]" type="text" name="name[n1]" value="" />

Итак, чем мы продолжим форму, мы узнаем, какие строки нужно обновить и что добавить (если индекс начинается с «n» - новый, если индекс - номер - существующий элемент).

Я пробовал подчиненные формы ... но нужно ли создавать подчиненные формы для каждого поля? Если я использую следующий код:

$subForm = new Zend_Form_SubForm();
$subForm->addElement('Text', 'n0');
$this->addSubForm($subForm, 'pid');       
$subForm = new Zend_Form_SubForm();
$subForm->addElement('Text', 'n0');
$this->addSubForm($subForm, 'name');

Каков наилучший способ для этого?

1) Использовать подчиненные формы?

2) Расширьте Zend / Form / Decorator / ViewHelper.php, чтобы использовать такие имена, как name[nX]?

3) Другие решения?

Спасибо.

1 Ответ

2 голосов
/ 02 апреля 2010

Альтернатива состоит в том, чтобы создать одну подформу со всеми полями на месте и затем добавить массив этих подформ в основную форму. Вот код, который я использую для этого:

        foreach ($value as $id => $row) {

                $subForm = clone $origSubForm;

                $name = 'multi[' . $id . ']';
                $subForm->setElementsBelongTo($name);
                $subForm->setName($name);
                $subForm->populate($row);

                $subForms[$id] = $subForm;
        }

Поместите эти формы в элемент массива (в данном примере с именем multi). Вместо массивов, содержащих отдельные значения $id[], вы получаете один массив, содержащий [0 => ['id' => .., ], 'n0' => ['id' => ...]]

...