Zend Form,如果元素中有默认值,则无法获取输入值

时间:2012-11-29 11:53:24

标签: php zend-framework zend-form zend-form-element zend-form-sub-form

我正在使用Zend Framework 1.12,制作一个包含多个表单的页面。我在其中使用单个主表单和子表单。因此,我只有一个验证码部分。 这些子表单指向数据库中的不同表。目的是,如果数据库中有关于该表单的行,则表单应该从数据库中取值作为默认值,以便用户有机会更改该数据。如果数据库中没有行,则将此表单的输入插入到db中。 首先,我可以从db获取值并将它们显示为表单元素的值。但是当我改变它并尝试用

取值时
$form->getValues();

我无法访问页面中输入(或编辑)的值,我只是重新访问数据库中默认放置的值。这个表单应该能够始终编辑,并且我有多种形式用于不同类型的数据,这也会做同样的事情。我该怎么做错?任何的想法?

(另外)这里是我的控制器代码的相关部分的摘要:

$masterform = new Application_Form_GeneralForm(); // a class which extends Zend_Form
$form1 = new Application_Form_SmallForm(); // a class which extends Zend_Form_Subform
$masterform->addSubform($form1, 'form1');
                         // so far, for form 1, no problem. My second form will be 
                         // added to the masterform after this first form is submitted,
                         // which works fine.

$form2 = new Application_Form_AnotherSmallForm(); // a class which extends Zend_Form_Subform

$request = $this->getRequest();
if ($request->isPost()){
    if ($generalform->isValid($request->getPost())) {
         $form2->loadValues(); // the part that form elements are filled with data 
                               // taken from db, a method defined in `AnotherSmallForm` 
                               // class. Just assigning values to elements with `setValue()`

         $form2->saveValues(); // Here is the problem, another method to save the 
// current values to db. (defined in form class). I have to do this in this fragment of code, so i don't know to 
// use which order ( saveValues() and loadValues() methods' order )` 

         $masterform->addSubform($form2, 'form2');
    }
}

所以,第一步:$ form1被添加到$ masterform。

第二步:提交$ masterform(现在只包含$ form1),然后将$ form2添加到$ masterform。在添加之前,$ form2的值被加载到表单元素中。

第3步:$ masterform提交,($ form1和$ form2也是如此)。如果$ form2中值的任何更改,则必须通过此提交在db中更新它们。

这是此代码的目标,由于第3步无法实现。

2 个答案:

答案 0 :(得分:0)

您遇到问题,在发送帖子后,您将使用默认的数据库值重写它。

if ($request->isPost()){
.........................
    $form2->loadValues(); // here you're rewriting it!
    $form2->saveValues(); 

简单更改顺序,首先是saveValues()然后是loadValues()。

答案 1 :(得分:0)

我终于明白了。即使子条件是在彼此相关的条件下创建的,也应该在if($request->isPost())条件块之外创建它们。所以,如果你必须添加步骤(比如我必须这样做,在提交$ form1之后创建$ form2,并且$ form1保留在页面中),你应该测试他们的需求是否直接和单独满足。我的这种方法不起作用。它应该是这样的:

$masterform = new Application_Form_GeneralForm(); 
$form1 = new Application_Form_SmallForm();
$masterform->addSubform($form1, 'form1');                          

$form2 = new Application_Form_AnotherSmallForm(); 

if (/* the requirement you want to check if $form2 should be added or not, 
    and this could easily be checking some value which is submitted with 
    $form1, so you have already checked if $form1 has been submitted */ ) 
    $masterform->addSubform($form2, 'form2'); // we add it if requirement is met

$request = $this->getRequest();
if ($request->isPost()){
    if ($generalform->isValid($request->getPost())) {
         $form2->saveValues(); // be sure it saves the final values added to form
         ////.......
    }
}

并且,我在这里停止了loadValues(),并且我在表单类的init()方法中调用了该方法。因此,正如konradwww所说,saveValues()应该首先发生,然后是loadValues()。这可以通过在表单类中使用loadValues()来完成,它无论如何都属于表单启动的过程。