【问题标题】:Create Zend form element dynamically动态创建 Zend 表单元素
【发布时间】:2013-08-27 12:49:24
【问题描述】:

我在一个项目中使用 Zend Framework 1.12。我对Zend_Form 有一些问题。有些字段是在执行时动态生成的,但Zend_Form 是静态的,是在创建时预定义的元素。

因此,发送表单时,验证不起作用,因为添加了新字段并且发送的表单与创建的表单不匹配。

如何适应?

【问题讨论】:

  • 您能解释一下“某些字段是在执行时动态生成的”是什么意思吗?从我的角度来看,这些表单元素是在控制器中创建的,并在验证发生之前添加到表单中。所以,这应该有效。您能否在验证之前检查您是否正在创建和添加元素?
  • 表单元素在控制器上实例化,然后添加到视图中。我在表单上有一个 Zend_Form_Element_Select,最初是空的。数据由用户在同一表单上创建。因此,每次用户创建新注册表时,都会完成 Ajax 调用并将新注册表附加到此选择输入上。 Zend_Form_Element_Select,最初是空的,发送的属性比创建时更多。因此,验证方法不起作用,因为表单不匹配。
  • 好吧,您不应该将它们发送到视图。您应该将它们添加到表单中。然后将表单发送到视图。这就是它应该如何工作的方式。
  • 我遇到了同样的问题,即在运行时动态添加到表单的字段在表单本身中找不到(例如调用 $form get Values() 函数)。但是,我没有看到 Zend_Form 像您上面所说的那样定义为静态的。那为什么会这样呢?

标签: zend-framework zend-form-element


【解决方案1】:

您应该尝试以下解决方案:发送表单后,获取$_POST 数组,然后检查您有哪些字段/值并使用此字段/验证创建/修改表单对象。

【讨论】:

  • 我尝试了您的建议,但我遇到了一些其他错误,例如“大海捞针中找不到'元素'”。我找到了一个停用元素验证的解决方案。不漂亮,但工作正常。谢谢。
【解决方案2】:

我会这样做:

class MyForm extends Zend_Form
{
    public function init()
    {
        //... Create here the basic elements

    }

    public function initFromPostValue( $post )
    {
        if( array_key_exists( 'dynamicsField', $post ) ) {
            $el = $this->createElement( 'select', 'dynamicsField' )
                ->setValidators( array( ... PUT your validators here ) );

            $this->addElement( $el );
        }

    }
}

在验证动作中:

public function validationAction()
{
    $form = new MyForm();
    $form->initFromPostValue( $_POST );

    if( $form->isValid( $_POST ) ) {
        // Form is valid
    } else {
        // Form is invalid
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2011-01-25
    相关资源
    最近更新 更多