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-2和name-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子表单的实例。谢谢:)