Добавить префикс подчиненной формы к элементам подчиненной формы. Я использовал префикс «child» для представления подчиненных форм. Каждая подчиненная форма будет создана как child1, child2 и т. Д.
public function clonerecursivegroupAction()
{
//.. Other code
$subform = new Zend_Form_SubForm();
$subform->setIsArray(true);
$subform->setName("child$id");
$Element1 = $subform->createElement('text', "newfield$id");
$Element1->setLabel("newfield$id")
->setRequired(true);
$subform->addElement($Element1);
$Element1 = $subform->createElement('text', "nextfield$id");
$Element1->setLabel("nextfield$id")
->setRequired(true);
$subform->addElement($Element1);
$this->view->field = $subform;
// Rest of your statements
}
Затем в функции preValidation отфильтруйте подчиненные формы, используя префикс подчиненной формы вместо имени поля:
public function preValidation(array $data) {
// array_filter callback
function findForms($field) {
// return field names that include 'child'
if (strpos($field, 'child') !== false) {
return $field;
}
}
$subForms = array_filter(array_keys($data), 'findForms'); //filter the subform elements
$children = array();
foreach ($subForms as $subform) {
if (is_array($data[$subform])) {
$children[$subform] = $data[$subform];
}
}
//Iterate the children
foreach ($children as $key => $fields) { //$key = subformname, $field=array containing fiend names and values
// strip the id number off of the field name and use it to set new order
$order = ltrim($key, 'child') + 2;
$this->addNewForm($key, $fields, $order);
}
}
Функция добавления новой формы создает каждую из вложенных форм и присоединяет к основной форме:
public function addNewForm($form, $elements, $order) {
$subform = new Zend_Form_SubForm();
$subform->setIsArray(true);
foreach ($elements as $key => $el) {
$Element1 = $subform->createElement('text', $key);
$Element1->setLabel($form.$key)
->setValue($el)
->setRequired(true);
$subform->addElement($Element1);
}
$this->addSubForm($subform, $form, $order);
}
[EDIT] Использование setIsArray для подчиненной формы создает каждый элемент подчиненной формы как элемент массива. Это упрощает функцию preValidate. Отредактировал код, чтобы использовать эту функцию.
См. Полный код в pastebin
Вот еще одно решение, использующее ownTo, обеспечивающее запись массива для элементов подформы: http://www.stephenrhoades.com/?p=364