2009-07-19 7 views
3

Dans mes contrôleurs init() méthode que j'appelle le AjaxContext-aide et mis pour certaines méthodes/actions dans ce contrôleur. Comme si:Redirect ne fonctionne pas après avoir utilisé AjaxContext

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

Maintenant, quand je veux utiliser rediriger à partir d'un ajax-demande à une méthode non-ajax ...

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

J'ai le problème que la page doesn charge pas. Je suppose que c'est parce que le AjaxContext bousille les en-têtes.

J'ai essayé clearHeaders et clearContexts avant de rediriger, mais rien ne fonctionne.

[edit] dans la méthode ajaxée respective (AjaxContent) I normalement responde avec une réponse ajax à un myviewscript.ajax.phtml. Mais dans un certain cas, je veux maintenant rediriger vers une action non-ajax normale dans un autre contrôleur. [/ Edit]

Toutes les idées? Merci!

+1

Qu'est-ce que vous essayez exactement de faire? Voulez-vous rediriger la requête AJAX, rediriger l'utilisateur après une requête AJAX ou simplement rediriger un utilisateur sur une requête normale qui se trouve dans un contrôleur utilisant l'assistant AjaxContext? Si c'est le premier, vérifiez les questions connexes. – mercator

+0

Nous avons vraiment besoin de plus de _context_ (ha!) Avant de pouvoir nous aider. – jason

Répondre

2

Sur la base de jason approche j'ai résolu le problème en répondant avec une redirection javascript. Donc, au lieu de mon message habituel, j'envoie la redirection javascript au 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>'; 
3

Ok. J'espère que je comprends votre objectif. Tout d'abord, il n'y a pas de méthode redirector directement sur une instance de Zend_Controller_Action.

Alors, ceci:

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

Devrait être ceci:

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

À moins, bien sûr, vous avez attribué le redirecteur à une propriété du contrôleur. Dans ce cas, vous devriez avoir raison, mais je vérifierais cela.

En outre, l'appel de la méthode _redirect ou l'aide d'action Redirector lors d'une demande XHR redirigera uniquement la demande XHR elle-même. Essayez-vous de rediriger la requête XHR? Ou rediriger le navigateur de l'utilisateur vers une autre page?

Edit:

bien. Donc, w/r/t votre commentaire: Votre objectif est de rediriger la session du navigateur de l'utilisateur vers une page différente d'une demande XHR, si certaines conditions sont remplies. L'aide d'action du redirecteur ne sera pas utile ici. Il n'y a rien de spécial à propos d'une requête XHR/Ajax ... s'il voit une redirection 301/302, il la suit volontiers, comme une requête de navigateur normale. Ça ne fait pas de drôle de business. Donc, pour résoudre votre problème, vous devrez faire quelque chose d'un peu personnalisé. Voici quelque chose qui fonctionnerait:

  1. Lors de la requête Ajax, si les conditions d'une redirection d'utilisateur sont remplies, renvoyez une sorte de réponse spéciale au client; cela pourrait être ce que vous voulez .. une chaîne particulière, une réponse JSON ... tout ce que vous pouvez facilement vérifier.
  2. Lorsque vous recevez la réponse du côté client, vérifiez-la pour voir si c'est le message spécial que vous avez envoyé à l'étape 1.
  3. Si c'est le cas, vous devrez préformer la redirection en utilisant Javascript. window.location = whatever fonctionnera très bien.
+0

J'ai un redirecteur $ privé et dans le init() j'affecte $ this -> _ helper-> getHelper ('Redirector'); donc ça devrait aller. Mais si vous dites que je redirige juste la demande de XHR, alors cela doit être le problème. En effet je veux juste rediriger l'utilisateur. – markus

+0

Notez également que l'URL vers laquelle vous souhaitez rediriger pourrait faire partie de cette réponse. – mercator

+0

Merci, j'ai appris quelques choses à propos de XHR maintenant! Sur la base de votre approche, j'ai trouvé une solution encore plus simple. Voir ma réponse affichée. – markus

Questions connexes