我有一种形式,人们可以用加法按钮添加相同部分的元素,这样就产生了这样的东西:
<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-代码,允许我使用新id (名称-1、年龄-1、名称-2、年龄-2、名称-3、年龄-3、…)再次添加相同的元素。。
当然,Zend_Form不知道名称-2和name-3,所以当表单包含错误并再次显示时,它就会删除它们。我也不能用访问$form->getValue('name-2')名称-2的值。我要检查一下原始的$this->getRequest()->getPost()。
是否有更好的方法来组合Zend_Form和基于javascript的已添加表单元素(与硬编码元素的类型相同)。
警告:真正的问题是select而不是input。发现这可能会产生不同的效果(使用->setIsArray(true)),但是使用select会破坏示例代码。
发布于 2012-01-06 18:23:13
您可以做的是在主窗体中创建一个子表单容器,并向该容器中添加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表单来验证所有person数据。
Sidenote;上面的代码只有在创建表单实例时将numPersons定义为选项集的一部分时才有效。例如;
$form = new My_Form(array('numPersons' => 10));
https://stackoverflow.com/questions/8758819
复制相似问题