Zend framework 使用jQuery和Zend_表单动态添加表单元素

Zend framework 使用jQuery和Zend_表单动态添加表单元素,zend-framework,zend-form,Zend Framework,Zend Form,我有一种形式,人们可以用加号按钮添加相同部分的元素,这样就产生了这样的东西: 我已经成功地编写了jquery代码,允许我使用新id(name-1、age-1、name-2、age-2、name-3、age-3等)再次添加相同的元素 当然,Zend_表单不知道name-2和name-3,因此当表单包含错误并再次显示时,它会删除它们。我也不能使用$form->getValue('name-2')访问name-2的值。我必须检查原始$this->getRequest()->getPost() 有没

我有一种形式,人们可以用加号按钮添加相同部分的元素,这样就产生了这样的东西:


我已经成功地编写了jquery代码,允许我使用新id(name-1、age-1、name-2、age-2、name-3、age-3等)再次添加相同的元素

当然,Zend_表单不知道name-2name-3,因此当表单包含错误并再次显示时,它会删除它们。我也不能使用
$form->getValue('name-2')
访问name-2的值。我必须检查原始
$this->getRequest()->getPost()

有没有更好的方法可以用来组合Zend_表单和基于javascript的添加表单元素(与硬编码元素类型相同)


警告:实际问题是
选择
,而不是
输入
。发现这可能会有所不同(使用
->setIsArray(true)
),但使用
select
会破坏示例代码。

您可以做的是在主窗体内创建一个子窗体容器,并向该容器添加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);
        }
    }
}
class My_Form扩展了Zend_Form
{
私有$_numPersons=1;
公共函数setNumPersons($numPersons)
{
$this->_numPersons=(int)$numPersons;
}
公共函数init()
{
$container=new Zend_Form_SubForm();
$this->addSubForm($container,'persons');
对于($index=0;$index<$this->\u numPersons;$index++){
$personForm=new My_personForm();
$container->addSubForm($personForm,$index+1);
}
}
}
呈现时,输入字段的名称将类似于
persons[1][name]
。注意
$index+1
,Zend_表单不允许将表单命名为“0”

当然,仅当person子窗体的数量有限时,才应使用此方法

另一种策略是覆盖
isValid
方法,并使用单个
My_PersonForm
表单验证所有人员数据

旁注;只有在创建表单实例时,将numPersons定义为选项集的一部分时,上述代码才会起作用。例如:


$form=新的我的表单(数组('numPersons'=>10))

您是否考虑过使用符号
name=“names[]”
?这对您没有帮助吗?是的,Zend似乎不允许在属性名中使用
[]
。我可以在我的应用程序中调用元素
second[]
,但它仍然会在HTML中被赋予
name=“second”
:当我使用
setIsArray(true)
时,它将使我的
选择
-字段多选(我没有文本,但选择存在实际问题)。我似乎可以将其添加到我的表单中,该表单将检查新元素并将它们添加到Zend_表单层次结构中。请参阅:似乎不起作用:/Always缺少一个级别。现在是:
array(2){[“persons”]=>array(2){[“name”]=>string(2)“ab”[“age”]=>string(0)”}[“submit”]=>string(23)“Save”}
当我降低复杂性并只添加一个子表单时,该子表单直接复制到$\u POST数据的根中(子表单名称不作为数组索引),如下:
array(3){[“name”]=>string(2)“ab”[“age”]=>string(0)”“[“submit”]=>string(23)“Save”}
在看不到您编写的确切代码的情况下,很难帮助您,但至少要确保Person表单是
Zend\u form\u子表单的一个实例。如果使用
ViewScript
呈现器呈现表单,可能需要将
PrepareElements
decorator预先添加到表单decorator堆栈中。还请注意,您将
PersonForm
添加到
$container
子表单,而不是主表单。是的,它不是
Zend\u form\u子表单的实例。谢谢:)