使用AjaxContext后,重定向不起作用

时间:2009-07-19 19:07:30

标签: php ajax zend-framework header

在我的控制器init()方法中,我调用AjaxContext-Helper并为该控制器中的某些方法/操作设置它。像这样:

public function init()
{
    $ajaxContext = $this->_helper->getHelper('AjaxContext');
    $ajaxContext->addActionContext('setlabel', 'html');
    $ajaxContext->initContext();
}

现在,当我想使用从 ajax-request 重定向到非ajax方法 ...

$this->redirector->gotoSimple('manage', 'team', null, array('id' => $teamID));

我遇到了页面无法加载的问题。我认为这是因为AjaxContext弄乱了标题。

我在重定向之前尝试过clearHeaders和clearContexts,但没有任何作用。

[edit] 在相应的ajaxed方法(AjaxContent)中,我通常使用对myviewscript.ajax.phtml的ajax响应进行响应。但在某种情况下,我现在想在另一个控制器中重定向到正常的非ajax动作。[/ edit]

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

确定。希望我理解你的目标。

首先,redirector的实例上没有Zend_Controller_Action方法。

所以,这个:

$this->redirector->gotoSimple('manage', 'team', null, array('id' => $teamID));

应该是这样的:

$this->_helper->redirector->gotoSimple('manage', 'team', null, array('id' => $teamID));

当然,除非您已将重定向器分配给控制器的属性。在这种情况下,你应该是对的,但我会仔细检查。

此外,在XHR请求期间调用_redirect方法或重定向器操作助手将仅重定向XHR请求本身。您是否尝试重定向XHR请求?或者实际上将用户的浏览器重定向到另一个页面?

修改

好的。那么,w / r / t你的评论: 如果满足某些条件,您的目标是将用户的浏览器会话重定向到与XHR请求不同的页面。重定向器操作助手在此处不会使用。 XHR / Ajax请求没有什么特别之处......如果它看到了301/302重定向,它就会自愿遵循它,就像常规的浏览器请求一样。它没有做任何有趣的事情。

所以,要解决你的问题,你必须做一些自定义的事情。这是可行的:

  1. 在Ajax请求期间,如果满足用户重定向的条件,则将某种特殊响应发送回客户端;它可能是你想要的......一个特定的字符串,一个JSON响应......你可以轻松检查的任何内容。
  2. 当您在客户端收到回复时,请检查它是否是您在步骤1中发送的特殊消息。
  3. 如果是,您将必须使用Javascript预先形成重定向。 window.location = whatever可以正常使用。

答案 1 :(得分:2)

jason方法的基础上,我通过使用javascript重定向进行响应来解决问题。因此,我将javascript重定向发送到myview.ajax.phtml:

,而不是我通常的消息
$url = $this->view->url(array('controller' => 'team', 
                              'action' => 'manage', 
                              'id' => $teamID), null, null);

$this->view->response = '<script type="text/javascript">
                           window.location = "'.$url.'"
                        </script>';