使用jQuery和Zend_Form动态添加表单元素

时间:2012-01-06 13:50:10

标签: zend-framework zend-form

我有一个表单,人们可以使用加号按钮添加相同部分的元素,以便生成类似的内容:

<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会破坏示例代码。

1 个答案:

答案 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));