由于某些原因,我的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>
锚点和按钮都可以调用下一页吗?
[最终编辑] 好的,这是问题所在。看起来按钮和锚点都在调用页面!所以第一次运行它就可以了,然后再次运行并重定向我:(
好吧,我们走了。每天学习新东西。
感谢所有人的帮助。
答案 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')