2009-12-16 4 views
31

J'utilise zend framework. J'utilise l'instruction suivante pour rediriger vers une autre action.Zend: Rediriger vers Action avec les paramètres

$this->_helper->redirector('some_action'); 

L'instruction ci-dessus fonctionne parfaitement et 'some_action' est appelée. Maintenant, je veux passer quelques paramètres à 'some_action' comme ça.

some_action?uname=username&[email protected] 

Et comment obtenir des paramètres dans l'action appelée. Habituellement nous faisons comme ceci:

$userName = $_REQUEST['uname']; 
$usermail = $_REQUEST['umail']; 

Comment effectuer cela? Exemple de code s'il vous plaît. Merci

Répondre

27

Utilisez la méthode Zend_Controller_Action::redirect() (qui passe juste à travers à la méthode d'aide de Sarfraz)

$this->redirect('/module/controller/action/username/robin/email/[email protected]'); 

Note: _redirect() méthode est obsolète Zend Framework 1.7. Utilisez redirect() à la place.

Et puis dans l'action appelée:

$username = $this->_getParam('username'); 
$email = $this->_getParam('email'); 

_getParam() prend un second argument optionnel qui est fixé à la variable par défaut si le paramètre est introuvable.

6

Vous pouvez essayer ceci:

$this->_redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2'); 
50

vous pouvez essayer avec redirecteur:

$params = array('user' => $user, 'mail' => $mail); 
$this->_helper->redirector($action, $controller, $module, $params); 
+2

Comment récupérez-vous $ params quand vous y arrivez? –

4

Vous pouvez également ajouter $ params dire comme pour userid

public function indexAction() 
{ 
    $auth = Zend_Auth::getInstance(); 
    if ($auth->hasIdentity()) { 
     // Identity exists; get it 
     $identity = $auth->getIdentity(); 
     $this->_redirect('/user/profile/' . $identity->user_id); 
    } else { 
     $this->_redirect('/user'); 
    } 
} 

j'oublié de mentionner, bien sûr cela supposant que vous avez la configuration de routage accepte un $ param. À titre d'exemple, le routage ressemblerait à quelque chose comme ceci pour la page qui est redirigé vers dans l'exemple ci-dessus:

/application/configs/application.ini

resources.router.routes.user-profile.route = /user/profile/:id 
resources.router.routes.user-profile.defaults.module = default 
resources.router.routes.user-profile.defaults.controller = user 
resources.router.routes.user-profile.defaults.action = profile 

0

Comment vous obtenez le param sorta dépend où vous êtes,

Vous n'avez pas besoin d'attraper une requête $ param pour réaliser ce que vous voulez faire ici. Vous utilisez simplement l'assistant FlashMessenger pour ajouter un message à la pile. Vous récupérez ensuite le message dans l'action où vous souhaitez afficher le message, puis affectez-le à la vue comme je le fais dans le successAction. Gardez à l'esprit que vous pouvez passer n'importe quel $ var ou tableau de données en l'assignant dans le contrôleur comme: $ this-> view-> var = $ var; Dans la vue qui sera alors accessible comme $ this-> var.

Depuis que vous avez demandé à propos de la connexion, je vais vous montrer comment je le fais habituellement. Pas que ce soit le meilleur moyen.

point de vue de l'index de mon LoginController tient la forme:

public function indexAction() { 
    $form = new Zfcms_Form_Login; 
    $this->view->form = $form; 
    /*check for valid input 
     authenticate using adapter 
     persist user record to session 
     redirect to original request URL if present*/ 
    if ($this->getRequest()->isPost()) { 
     if ($form->isValid($this->getRequest()->getPost())) { 
      $values = $form->getValues(); 

      $authAdapter = $this->getAuthAdapter(); 

      # get the username and password from the form 
      $username = $values['username']; 
      $password = $values['password']; 

      # pass to the adapter the submitted username and password 
      $authAdapter->setIdentity($username) 
        ->setCredential($password); 

      $auth = Zend_Auth::getInstance(); 
      $result = $auth->authenticate($authAdapter); 

      if ($result->isValid()) { 

       # all info about this user from the login table 
       # ommit only the password, we don't need that 
       $userInfo = $authAdapter->getResultRowObject(null, 'password'); 

       # the default storage is a session with namespace Zend_Auth 
       $authStorage = $auth->getStorage(); 
       $authStorage->write($userInfo); 


       $session = new Zend_Session_Namespace('zfcms.auth'); 
       if (isset($session->requestURL)) { 
        $url = $session->requestURL; 
        unset($session->requestURL); 
        $this->_redirect($url); 
       } else { 
        $this->_helper->getHelper('FlashMessenger') 
          ->addMessage('You were successfully logged in as ' . $userInfo->username); 
        $this->_redirect('/login/success'); 
       } 
      } else { 
       $this->view->message = 'You could not be logged in. Please try again.'; 
      } 
     } 
    } 
} 

Dans l'action de succès que nous faisons:

public function successAction() { 
    if ($this->_helper->getHelper('FlashMessenger')->getMessages()) { 
     $this->view->messages = $this->_helper 
         ->getHelper('FlashMessenger') 
         ->getMessages(); 
    } else { 
     $this->_redirect('/login/success'); 
    } 
} 

Dans le script de vue, nous pouvons faire quelque chose comme ce que j'ai ci-dessous. La raison pour laquelle je le fais de cette façon est que, parfois, je passerai un seul message dans un contrôleur, dans ce cas, j'utilise simplement:

$this->view->message = 'message goes here'; 

les attraper ensuite les deux si elles sont définies dans la vue:

<?php 
    if(isset($this->message) || isset($this->messages)): 
?> 

<?php 
if(is_array($this->messages)) 
{ 
    echo implode($this->messages); 
} else { 
    echo $this->message; 
}?> 

<?php 
endif 
?> 
Questions connexes