1

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

我正在处理 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);
    }
}
4

1 回答 1

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 

}

}
于 2012-05-16T15:07:00.590 回答