我有一个表单,人们可以使用加号按钮添加相同部分的元素,以便生成类似的内容:
<div id="person-1" class="person">
<input type="text" name="name-1" id="name-1" />
<input type="text" name="age-1" id="age-1" />
</div>
<!-- as of here, it's JS created -->
<div id="person-2" class="person">
<input type="text" name="name-2" id="name-2" />
<input type="text" name="age-2" id="age-2" />
</div>
<div id="person-3" class="person">
<input type="text" name="name-3" id="name-3" />
<input type="text" name="age-3" id="age-3" />
</div>
我已经设法写了jquery-code,允许我再次使用新的id添加相同的元素(name-1,age-1,name-2,age-2,name-3,age-3, ...)。
当然,Zend_Form不知道 name-2 和 name-3 ,因此当表单包含错误并再次显示时,它会删除它们。我也无法使用$form->getValue('name-2')
访问 name-2 的值。我必须重新审视$this->getRequest()->getPost()
。
有没有更好的方法可以用来组合Zend_Form和基于javascript的添加表单元素(类似硬编码元素的相同类型)。
警告:在真正的问题中,它是select
而不是input
。发现这可能会有所不同(使用->setIsArray(true)
),但使用select
会破坏示例代码。
答案 0 :(得分:2)
您可以做的是在主窗体中创建一个子窗体容器,并向该容器添加X个子窗体。 例如:
class My_Form extends Zend_Form
{
private $_numPersons = 1;
public function setNumPersons($numPersons)
{
$this->_numPersons = (int) $numPersons;
}
public function init()
{
$container = new Zend_Form_SubForm();
$this->addSubForm($container, 'persons');
for($index = 0; $index < $this->_numPersons; $index++) {
$personForm = new My_PersonForm();
$container->addSubForm($personForm, $index+1);
}
}
}
渲染时,输入字段的名称将为persons[1][name]
。请注意$index+1
,Zend_Form不允许将表单命名为“0”。
当然,如果人员子表单的数量有限,你应该只使用这种方法。
另一种策略是覆盖isValid
方法,并使用单个My_PersonForm
表单验证所有人员数据。
旁注;只有在创建表单实例时将numPersons定义为选项集的一部分时,上述代码才有效。 E.g;
$form = new My_Form(array('numPersons' => 10));