初始化具有可变数据长度的zend表单

时间:2012-05-16 14:35:18

标签: php zend-framework zend-form

我一直在谷歌搜索大部分时间试图找到答案,但我终于承认了失败。

我正在研究Zend Framework中需要能够处理可变数据长度的表单。我有一个带有一些常规字段的表单,它们指定了一些易于处理的常规参数(项目名称,语言等),但我还有一个名为parameters的子表单,其中包含可变数量的键/值列表让您将通用参数添加到数据中。演示形式如下:

<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 个答案:

答案 0 :(得分:1)

您可以使数据可用,如

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 

}

}