我正在使用 Zend_Form 构建一个表单...我需要向表单动态添加一些字段(jquery/ajax)...我为需要在运行时创建的每组字段创建了一个子表单...以获取我的具有正确名称的数组中的元素,例如subform1[index][element]
,我添加了 2 个子表单: subform1:呈现为字段集的包装器 subform2:扮演index
名称元素部分的容器子表单:这是保存元素的主子表单
对于每组新元素,subform2 和 elements 部分都会重复...
现在在视图中创建和呈现表单时一切正常,我得到了正确的名称(subform1[index][element]
)...
但是当我使用 ajax 生成新元素时,我不知道如何呈现表单并获得具有正确名称的 subform2 部分......
这是创建子表单的函数:
private function makeSubForm($id, $legend)
{
$wrapper = new Zend_Form_SubForm();
$wrapper->setOptions(array('legend' => $legend, 'class' => 'ui-corner-all multi_value'))
->setIsArray(true);
$array = $this->_getArray($id);
//-------------------------LOOP--------------------------
$form_name = "Application_Form_Employ_$id";
// var_dump($array);
foreach ($array as $key => $value) {
$form = new $form_name();
$container = new Zend_Form_SubForm();
$container->setOptions(array('class' => 'subform'))
->setIsArray(true)
->addSubForm($form, 'xxxxx');
$wrapper->addSubForm($container, $key);
}
Zend_Registry::get('session')->{$id} = $array;
//----------------------------------------------------------
$this->addSubForm($wrapper, $id);
}
这是我的行动方法:
public function newElementAction()
{
$this->_disableView();
$id = $this->getRequest()->getParam('id');
$form = new Application_Form_Employment();
$params = array();
$keys = Zend_Registry::get('session')->{$id};
$lastKey = end(array_keys($keys));
$keys[++$lastKey] = array();
$params[$id] = $keys;
// var_dump($params);
$form->create($params);
// $form->render();
$this->_response->appendBody($form->getSubForm($id)->getSubForm($lastKey));
}
使用此代码,我得到subform2[element]
了我的名字......但如果我取消注释$form->render();
我得到subform1[subform2][subform1][subform2][element]
那么我怎样才能获得具有正确名称的第二个子表单的 HTML 呢?
好吧,我找到了一个黑客来获得我想要的东西,但我正在寻找更好的方法......
public function newElementAction()
{
$this->_disableView();
$id = $this->getRequest()->getParam('id');
$form = new Application_Form_Employment();
$params = array();
$keys = Zend_Registry::get('session')->{$id};
$lastKey = end(array_keys($keys));
$keys = array(++$lastKey => array());
$params[$id] = $keys;
$form->create($params, $id);
$this->_response->appendBody($form->{$id});
}
我只创建了最后一个孩子并输出了父母,并在客户端删除了父母标记,然后再插入页面......
必须有一种可靠的方法来渲染子表单,其父索引完好无损!!??