我正在使用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步无法实现。
答案 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()来完成,它无论如何都属于表单启动的过程。