2009-12-16 20 views
31

Sto usando zend framework. Sto usando la seguente dichiarazione per reindirizzare a un'altra azione.Zend: reindirizzamento all'azione con i parametri

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

L'istruzione precedente funziona perfettamente e viene chiamato 'some_action'. Ora voglio passare alcuni parametri a 'some_action' come questo.

some_action?uname=username&[email protected] 

E come ottenere i parametri nell'azione chiamata. Di solito facciamo così:

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

Come eseguire questo? Esempio di codice per favore. Grazie

risposta

27

Utilizzare il metodo Zend_Controller_Action::redirect() (che passa solo attraverso il metodo aiutante di Sarfraz)

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

Nota: _redirect() metodo è deprecato come di Zend Framework 1.7. Utilizzare invece redirect().

E poi nell'azione chiamata:

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

_getParam() prende un secondo argomento opzionale che è impostato per la variabile come predefinito se il parametro non viene trovato.

6

Si consiglia di provare questo:

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

si può provare con redirector:

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

Come recuperi $ param quando arrivi? –

4

È inoltre possibile aggiungere $ params dicono come per l'utente id

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'); 
    } 
} 

Ho dimenticato di dire, naturalmente questo sta assumendo si ha la configurazione di routing accetta un $ param. A titolo di esempio il percorso potrebbe essere simile a questo per la pagina che si sta reindirizzato a nell'esempio di cui sopra:

/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

Come si ottiene il param dipende da dove ti trovi,

Non devi prendere una richiesta $ param per ottenere quello che vuoi fare qui. Stai semplicemente utilizzando l'helper FlashMessenger per aggiungere un messaggio allo stack. Quindi si recupera il messaggio all'interno dell'azione in cui si desidera visualizzare il messaggio, quindi assegnarlo alla vista come faccio in SuccessAction. Tieni presente che puoi trasferire qualsiasi $ var o matrice di dati assegnandoli nel controller come: $ this-> view-> var = $ var; All'interno della vista che sarà quindi accessibile come $ this-> var.

Poiché hai chiesto informazioni sul login, ti mostrerò come faccio di solito. Non è il modo migliore.

vista indice di mio LoginController detiene il modulo:

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.'; 
      } 
     } 
    } 
} 

Nell'azione successo facciamo questo:

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

Nello script vista possiamo fare qualcosa di simile a quello che ho qui di seguito. La ragione per cui lo faccio in questo modo è che a volte io passerò solo un singolo messaggio in un controllore, in questo caso ho semplicemente usare:

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

poi prendere tutti e due se sono impostati nella visualizzazione:

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

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

<?php 
endif 
?> 
Problemi correlati