Zend重定向

时间:2010-09-08 15:57:30

标签: php zend-framework

由于某些原因,我的zend应用程序在不应该重定向时。

索引视图只显示表单。下一个视图根据表单提供的信息显示数据库中的一些信息。然后,用户单击确认按钮,将确认按钮发送给构建并发送电子邮件的anotherAction。我有一个try / catch块,试图发送电子邮件。如果成功,请设置一个变量,否则设置另一个变量。

Psudo代码:

public function indexAction()
{
 $form = new Form();
 if(!empty($_POST))
 {
  if($form->isValid($_POST))
  {
   $this->_helper->FlashMessenger($_POST); //store $_POST in temporary session
   //show a different view
   //do something else
  }
 }
$this->view->form = $form;
}

因此,如果用户发布表单然后验证它并将会话变量存储在flash会话中并显示不同的视图,那么我就会对表单进行实例化。在所有情况下都会显示表单(如果已经发送,那么它将自动填充)。

public function anotherAction()
{
 $messages = $this->_helper->FlashMessenger->getMessages();
 if (!empty($messages[0]))
 {
  $post = $messages[0];
  $mail = new My_Mail();
  //set up email
  try
  {
   $mail->send();
   $success = true;
  }
  catch (Zend_Exception $e)
  {
   $success=false;
   //save $e to log
  }
  $this->view->success = $success;
 }
 else
 {
  //if not sent here by /page, then redirect to it.
  $this->_helper->redirector->goToRouteAndExit(array(), 'page', true);
 }
}

在这个动作中,我正在检查会话。如果它有表格数据,那么尝试发送电子邮件并设置变量;否则重定向回到表单。视图变量用于显示一条消息或另一条消息(发送的电子邮件/电子邮件无法发送)。

问题在于:它无论如何都会重定向回到表单。表单已提交并确认,我们转到下一页,然后将其重定向回页面并显示表单。为什么要这样做?如何阻止它呢?

[编辑] 图表变厚:如果我在新标签页中打开确认链接,它将运行并正确停止。如果我在相同的选项卡/窗口中执行它,它会运行两次并重定向。

[另一个编辑] 我删除了第二个操作中的所有代码。 代码现在是:

public function anotherAction()
{
 $messages = $this->_helper->FlashMessenger->getMessages();
 if (!empty($messages[0]))
 {
  ;
 }
 else
 {
  $this->_helper->redirector->goToRouteAndExit(array(), 'page', true);
 }
}

它仍在重定向。

对于我有确认按钮

<a href="next-page"><button>Confirm</button></a>

锚点和按钮都可以调用下一页吗?

[最终编辑] 好的,这是问题所在。看起来按钮和锚点都在调用页面!所以第一次运行它就可以了,然后再次运行并重定向我:(

好吧,我们走了。每天学习新东西。

感谢所有人的帮助。

4 个答案:

答案 0 :(得分:0)

我假设您的表单提交到/ controller / another / ...

//在该操作中执行某些代码块会发生什么?既然我们知道在同一个传递中并没有真正同时执行“if”和“else”......它必须在“if”中做一些你没有在这里显示的东西要么触发它来调用函数,_forward(),或者以某种方式第二次到达这一点,然后评估逻辑的else部分。

您可以发布更完整的样本进行审核吗?

答案 1 :(得分:0)

尝试使用die()或$ this-&gt; _forward('page')替换重定向,以查看重定向是否隐藏了任何php警告消息。

答案 2 :(得分:0)

按钮和锚点都在调用页面!所以第一次运行它就可以了,然后再次运行并重定向我。

删除了按钮。

答案 3 :(得分:0)

尝试以下方法:

  $this->redirect()->toRoute('routeName',array('controller'=>'controllerName','action'=>'actionName'));
  $this->redirect()->toUrl('UrlLink')