2012-05-16 54 views
1

我一直在搜索大部分时间试图找到这个答案,但我终于承认失败。初始化一个可变数据长度的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); 
    } 
} 

回答

1

可以使数据avaialbe形成像

My_Form extends Zend_Form 
{ 

protected $_myCustomData; 

public function __construct($options = null,$myCustomData) 
{ 
    $this->_myCustomData = $myCustomData; 
    parent::__construct($options); //Its important you call parent after above line or init will get call before initilizing customData 
} 

public function init() 
{ 
    $this->_myCustomData ; //here you are free to use your custom data 

} 

} 
+0

这是一个可怕的哈克解决方案,但它看起来也是唯一可行的解​​决方案。我无法相信zend表单如此无能为力,无法将这种用户情况考虑在内。我之前在POPHP中做过类似的很多次,而不必跳过这些类型的篮球。 – GordonM

相关问题