2010-08-31 36 views
1

这是一个非常基本的东西,但我无法弄清楚如何解决这个“正常”与Zend框架:

场景:

  1. 页面显示形式1,
  2. 页面显示形式2

这是一个非常基本的东西,但我无法弄清楚如何解决这个“正常”与Zend框架:

小号cenario:

  1. 页面显示形式1,
  2. 页面显示形式2
 
class FooController extends Zend_Controller_Action { 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
} 

当用户帖子form1中,首先执行在form1Action如果 - 条件(这是我想要的),还有form2Action中的if条件。

什么是正确的方法来“unset $ this-> getRequest() - > isPost()”?

注:表格构建 “手动”(不使用Zend表格)

+0

你不应该在某个时候使用'isValid()'吗?这应该会阻止您在form1被POST时处理form2中的数据,除非它们完全相同。或者使用Zend的内置多页面表单http://framework.zend.com/manual/en/zend.form.advanced.html – 2010-08-31 14:26:36

+0

完全有道理,但在这种情况下,表单是“手工”构建的,即不使用Zend_Form ... – jamie0725 2010-08-31 15:22:40

回答

4

你有三个选择:

  1. 使用_redirect而不是_forward。在相同请求下转发重定向。重定向会创建一个新的请求。'
  2. 设置在_forward通话设置了一个param,你可以在你的第二个形式检查:如'form' => 2.More information.
  3. 使用包含在Zend_Form的开箱即用的built in multipage forms
+0

这就是我暂时解决这个问题的方法,但是我对这个解决方案并不满意,因为创建新的请求意味着服务器会承受更多压力。我想避免这种情况.. :-) – jamie0725 2010-08-31 15:24:34

+0

我已经更新了我的答案,以提供一个新选项。如果您仍想使用_forward,选项2将为您提供解决方案。 – balupton 2010-09-01 07:36:16

0

您可以随时在一个动作中设置一个类变量,如果它为true,则不要在动作二中运行代码。

喜欢的东西:

class FooController extends Zend_Controller_Action { 
private $_fromAction1 = false; 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
$this->_fromAction1 = true; 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost() && !$this->_formAction1) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
} 
0

最后一个选项并没有为我工作。

$ this - > _ forward()创建控制器的新实例,因此在第一个实例中设置变量不会影响新实例中的变量。

我的解决方案是使$ _fromAction1静态共享2个实例之间的变量。

class FooController extends Zend_Controller_Action { 
private static $_fromAction1 = false; 
    ... 
    public function form1Action(){ 
     if ($this->getRequest()->isPost()) { 
      // save data from form1 in database 
FooController::_fromAction1 = true; 
      $this->_forward('form2'); 
     } 
     // display form1 
    } 
    public function form2Action(){ 
     if ($this->getRequest()->isPost() && !FooController::_formAction1) { 
      // save data from form2 in database 
      $this->_forward('somewherelese'); 
     } 
     // display form2 
    } 
}