2009-12-16 29 views
31

Estoy usando zend framework. Estoy usando la siguiente declaración para redirigir a otra acción.Zend: redirigir a la acción con los parámetros

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

La sentencia anterior está funcionando perfectamente y se llama 'some_action'. Ahora quiero pasar algunos parámetros a 'some_action' como este.

some_action?uname=username&[email protected] 

Y cómo obtener los parámetros en acción llamada. Por lo general, nos gusta esto:

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

¿Cómo se realiza esto? Código de ejemplo por favor. Gracias

Respuesta

27

Utilice el método Zend_Controller_Action::redirect() (que simplemente pasa a través de método de ayuda de Sarfraz)

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

Nota: _redirect() método está obsoleta de Zend Framework 1.7. Use redirect() en su lugar.

Y luego, en la acción denominada:

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

_getParam() toma un segundo argumento opcional que se fija a la variable por defecto si no se encuentra el parámetro.

6

Es posible que desee probar esto:

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

se puede tratar con redirector:

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

¿Cómo recuperas $ params cuando llegas allí? –

4

También puede agregar $ params dicen como por ID de usuario

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

me olvidó mencionar, por supuesto, esto es suponiendo que tiene la configuración de enrutamiento para acepta un $ param. Como ejemplo, el enrutamiento se vería algo como esto para la página que está siendo redirigido en el ejemplo anterior:

/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

¿Cómo se obtiene el parámetro sorta depende de dónde se encuentre,

No necesita capturar una solicitud de $ param para lograr lo que quiere hacer aquí. Solo está usando el asistente de FlashMessenger para agregar un mensaje a la pila. A continuación, recupera el mensaje dentro de la acción en la que desea mostrar el mensaje, y luego lo asigna a la vista como lo hago en la acción successAction. Tenga en cuenta que puede pasar cualquier $ var o matriz de datos asignándolos en el controlador como: $ this-> view-> var = $ var; Dentro de la vista que se accederá como $ this-> var.

Como ha preguntado sobre el inicio de sesión, le mostraré cómo suelo hacerlo. No es la mejor manera.

vista del índice de mi LoginController mantiene la forma:

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

En la acción éxito hacemos esto:

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

En el script de vista podemos hacer algo como lo que tengo a continuación. La razón por la que hago de esta manera es que a veces voy a transmitir un solo mensaje en un controlador, en este caso, simplemente uso:

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

Entonces atraparlos tanto si se fijan en la vista:

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

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

<?php 
endif 
?> 
Cuestiones relacionadas