Влияние Zend setElementsBelongTo() на элементы подформы

У меня есть подформа ($ fileUploadSubform) внутри подформы ($ requestSubform). Я вызвал setElementsBelongTo ( "requestRow [$ rowNumber]" ) в родительской подчиненной форме ($ requestSubform).

    $requestSubform= new Zend_Form_Subform();
    $requestSubform->setElementsBelongTo("requestRow[$rowNumber]");

    // add elements to $requestSubform

    // now create the file upload subform
    $fileUploadSubform= new Zend_Form_SubForm();
    $fileUploadSubform->addElement('file', 'fileName')
            ->setLabel('File'); 

    $fileUploadSubform->addElement('text', 'fileDesc')
            ->setLabel('File Description'); 

    $requestSubform->addSubForm($fileUploadSubform, 'fileUpload');

    $this->view->field = $requestSubform->__toString();

    // pass it as json via ajax back to javascript

Когда форма отображается, $fileUploadSubform fileDesc имеет имя и идентификатор элемента

name="requestRow[1][requestRow][1][fileUpload][fileDesc]"
id="requestRow-1-fileUpload-fileDesc"

Почему значение, которое я установил в функции setElementsBelongTo(), повторяется дважды?

Заранее благодарю вас!

[Обновление 08/13/2015]

Как временное обходное решение, я просто вызвал setElementsBelongTo() из дочерней подформы ($ fileUploadSubform) вместо родительской подформы ($ requestSubform)

[Обновление 08/17/2015]

Я пробовал следующий код, который я получил из http://zend-framework-community.634137.n4.nabble.com/Improved-array-support-for-Zend-Form-td667215.html, так как в этом сообщении говорится, что элементы подчиненной формыTobelong to работают правильно.

    $form = new Zend_Form();
    $form->setElementsBelongTo('foobar');

    $form->addElement('text', 'firstName')
    ->getElement('firstName')
    ->setLabel('First Name')
    ->setRequired(true);

    $form->addElement('text', 'lastName')
    ->getElement('lastName')
    ->setLabel('Last Name')
    ->setRequired(true);

    $subForm = new Zend_Form_SubForm();
    $subForm->setElementsBelongTo('foobar[baz]');
    $subForm->addElement('text', 'email')
    ->getElement('email')
    ->setLabel('Email Address');

    $subSubForm = new Zend_Form_SubForm();
    $subSubForm->setElementsBelongTo('foobar[baz][bat]');
    $subSubForm->addElement('checkbox', 'home')
    ->getElement('home')
    ->setLabel('Home address?');
    $subForm->addSubForm($subSubForm, 'subSub');

    $form->addSubForm($subForm, 'sub')
    ->addElement('submit', 'save', array('value' => 'submit'));
    print_r($form->__toString());

Но вот что я получаю для элементов $subForm и $subFubForm.

<input id="foobar-foobar-baz-email" type="text" value="" name="foobar[foobar][foobar][baz][email]">

<input id="foobar-foobar-baz-foobar-baz-bat-home" type="checkbox" value="1" name="foobar[foobar][foobar][baz][foobar][foobar][baz][foobar][baz][bat][home]">

[Обновление 08/24/2015]

Я, наконец, понял проблему.

Это была строка

$this->view->field = $additionalInfoSubform->__toString();

Были некоторые элементы, которые не показывались до этого, поэтому я добавил эту строку. И только теперь я понимаю, что те элементы, которые не появлялись, это те, у которых нет декоратор-декодера ViewHelper. Поэтому, когда я устанавливаю ViewHelper в качестве декоратора и удаляю вышеуказанные поля и называю setElementsBelongTo() подформы без необходимости из корня иерархии только из этой подформы, тогда он работал.

Ответ 1

Я не знаком с но по внешнему виду иерархия форм неявно. Под этим я подразумеваю, что вам не нужно объявлять полный "путь" при использовании setElementsBelongTo(). Подумайте об этом как о структуре папок, вы бы назвали только подпапку в текущем рабочем каталоге.

Итак, когда вы заявляете:

$form = new Zend_Form();
$form->setElementsBelongTo('foo');

$subForm = new Zend_Form_SubForm();
$subForm->setElementsBelongTo('bar');
$subForm->addElement('text', 'email')

$form->addSubForm($subForm, 'sub');

Это интерпретируется как помещая email в bar и bar в foo, aka:

name="foo[bar][email]"

В документации написано:

setElementsBelongTo (строка 1367)
Установить имя элементов массива в доступ: общедоступный Zend_Form setElementsBelongTo (строка $array)
string $array

От http://framework.zend.com/apidoc/1.9/Zend_Form/Zend_Form.html#setElementsBelongTo

также:

Zend_Form:: setElementsBelongTo ($ массив)
Используя этот метод, вы можете указать имя массива, к которому принадлежат все элементы формы. Вы можете определить имя, используя getElementsBelongTo() accessor.

Из http://framework.zend.com/manual/1.12/en/zend.form.advanced.html

Формулировка может быть немного неясной, но она может поддержать мою теорию. Поэтому при использовании $form->setElementsBelongTo('foo') все, что добавлено в $form, будет неявно становиться элементом foo, и поэтому foo должно быть исключено из последующих вызовов setElementsBelongTo(), которые имеют дело с подэлементами.