Zend_Form 值在同一页面中使用多个表单时丢失

Posted

技术标签:

【中文标题】Zend_Form 值在同一页面中使用多个表单时丢失【英文标题】:Zend_Form values are lost when using multiple forms in same page 【发布时间】:2012-11-07 14:54:17 【问题描述】:

我在我的一个项目中使用 Zend Framework 1.12。我需要在一页中使用多个表单,并在“渲染”功能的帮助下成功放置它们。

    $this->oneAction();
    $this->render('one');

    $this->anotherAction();
    $this->render('another');

两种形式有两种不同的动作,在我的 indexAction() 中,我像上面一样调用它们。两个动作有自己的脚本,这段代码非常适合在一个页面中放置 2 个表单。

问题是; 2个不同的表单,有自己的提交按钮(不同的名称),当提交第二个表单时,页面重新加载(自然),但是第一个表单的字段中的值丢失了..我写了一个函数来加载一些默认值(对于第一种形式的某些字段,取自 db),然后它获取值,但给出错误(值是必需的并且不能为空),即使它们由我的函数填充。我必须创建一个包含许多表单的复杂页面,并且无法解决这个问题。 我想得到这个问题的解决方案,或者只是对 Zend Form 对这些多个表单提交的行为知之甚少。

(关于这些问题的页面很多,但大多数只是考虑在同一页面中放置多个表单,仅此而已..)

提前谢谢..

【问题讨论】:

【参考方案1】:

您需要利用 Zend 的子表单。表单和子表单在 ZF 中实际上是相同的,主要区别在于表单装饰器的使用。将所有表单视为可以组合成单个表单的子表单会更强大。以下代码提供了一个示例:

class My_Master_Form extends ZendX_JQuery_Form
   

    /**
     * combine sub forms into composite
     */
    public function  __construct($options = null)    
           
        parent::__construct($options);        

        // Add a sub form...
        $subform = new My_Foo_Form();       
        $subform->setElementsBelongTo('mySubForm');
        $subform->removeDecorator('Form');
        $subform->setOrder(-2);
        $this->addSubform($subform, 'mySubForm');

        ...

然后您将呈现单个主表单。处理验证很简单。执行验证时,现有代码应遍历每个子表单。如果需要,您可以覆盖并在初始验证后查看每个子表单中的故障,如果验证逻辑跨越子表单,则根据需要进行汇总。

【讨论】:

谢谢。我现在有子表单和一个包含子表单的表单。但仍然无法进行验证。我在一个操作中创建“主”表单和子表单,并在同一操作中将子表单添加到主表单。同样在同一操作中,还有表单验证码。查看正常,第一种形式正常工作(验证有效),但第二种形式无法验证。他们的验证工作方式相同。 if ($request->isPost()) if ($infoform->isValid($request->getPost())) .. if ($anotherform->isValid($request->getPost())) .. 这里应该是什么问题? 创建复合“主”Zend_Form 后,您应该继续将其视为单个实体。例如,您渲染“主”表单,您不会在每个子表单上调用渲染。您应该以相同的方式填充和验证表单。请注意Zend_Form 上的public function isValid 代码,并且验证会遍历所有子表单。

以上是关于Zend_Form 值在同一页面中使用多个表单时丢失的主要内容,如果未能解决你的问题,请参考以下文章

Zend_Form 创建校验和解析表单的基础--(手冊)

如何将 Zend_Dojo 表单元素动态添加到 zend_form?

当同一页面上有多个使用同一个类时,如何验证电子邮件提交表单?

使用flask和WTForms在一个页面中的多个表单

如何使用装饰器将多个 div 或字段集添加到 zend_form?

Laravel 4 - 同一页面上有多个表单?