我一直在搜索大部分时间试图找到这个答案,但我终于承认失败。初始化一个可变数据长度的zend表单
我正在处理Zend Framework中需要能够处理可变数据长度的表单。我有一个表单,其中包含一些通用字段,用于指定一些通用参数(项目名称,语言等),这些参数很容易处理,但我也有一个称为参数的子表单,其中包含可变数量的键/值键让您将通用参数添加到数据中。示范表格如下:
<form>
<input type="text" name="item_name" />
<input type="text" name="item_lang" />
<!-- etc -->
<input type="text" name="parameters[1][key]" />
<input type="text" name="parameters[1][value]" />
<input type="text" name="parameters[2][key]" />
<input type="text" name="parameters[2][value]" />
<input type="text" name="parameters[3][key]" />
<input type="text" name="parameters[3][value]" />
<input type="text" name="parameters[4][key]" />
<input type="text" name="parameters[4][value]" />
<!-- and so on -->
</form>
注:以上是对实际表格的大量简化。它也是手动构建的,而不是由zend_form生成。
参数的数量可以不同,并可以使用JavaScript处理客户端,但我真的很努力初始化表单时填充它从预先存在的数据更新。
我可能有2个参数存储每个项目,我可能有20个,我可能根本没有。所以我需要表单根据数据的初始状态有2或20个参数或者没有参数输入。不幸的是,这些数据在init()中不可用,因为它在调用setDefaults()之前不在表单中。
这意味着我不能对表单的初始状态执行一个foreach()来为已经存在的数据生成适当数量的输入框。
我相信我一定会错过一些明显的东西,但是Zend文档相当可怕,而且我找不到任何这种用例的例子。它肯定不会那么罕见,它在zend_form中不受支持。我如何在允许表单初始状态变化的状态下生成表单?
ETA:我的窗体上的init()方法看起来像这样(简化匹配为例):
public function init()
{
parent::init();
$this -> addElement ('text', 'item_name');
$this -> addElement ('text', 'item_lang');
$this -> addSubForm (new Zend_Form_SubForm(), 'parameters');
foreach ($phantom_data as $key => $val)
{
$params = new Zend_Form_SubForm();
$params -> addElement ('text', 'key');
$params -> addElement ('text', 'value');
$this -> parameters -> addSubForm ($params, $key);
}
}
这是一个可怕的哈克解决方案,但它看起来也是唯一可行的解决方案。我无法相信zend表单如此无能为力,无法将这种用户情况考虑在内。我之前在POPHP中做过类似的很多次,而不必跳过这些类型的篮球。 – GordonM