【问题标题】:Initializing a zend form with variable data length使用可变数据长度初始化 zend 表单
【发布时间】:2012-05-16 14:35:18
【问题描述】:

我大部分时间都在谷歌上搜索这个问题的答案,但我终于承认失败了。

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

【问题讨论】:

    标签: php zend-framework zend-form


    【解决方案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 
    
    }
    
    }
    

    【讨论】:

    • 这是一个非常骇人听闻的解决方案,但看起来它也是唯一可行的解​​决方案。我不敢相信 zend 表单写得如此无能,以至于它无法考虑这种用户案例。我以前在 POPHP 中做过很多次类似的事情,而不必跳过这些圈子。
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2016-11-26
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多