Zend: redirigir a la acción con parámetros

4 minutos de lectura

avatar de usuario
naveed

Estoy usando zend framework. Estoy usando la siguiente declaración para redirigir a otra acción.

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

La declaración anterior funciona perfectamente y se llama a ‘some_action’. Ahora quiero pasar algunos parámetros a ‘some_action’ como este.

some_action?uname=username&umail=username@example.com

Y cómo obtener parámetros en la acción llamada. Normalmente lo hacemos así:

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

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

puedes probar con el redirector:

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

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

    – Andrei Cristián Prodan

    17 de agosto de 2012 a las 12:23

avatar de usuario
Robin M. Canadá

Utilizar el Zend_Controller_Action::redirect() método (que simplemente pasa al método auxiliar de Sarfraz)

$this->redirect('/module/controller/action/username/robin/email/robin@example.com');

Nota: _redirect() El método está en desuso a partir de Zend Framework 1.7. Usar redirect() en cambio.

Y luego en la acción llamada:

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

_getParam() toma un segundo argumento opcional que se establece en la variable como valor predeterminado si no se encuentra el parámetro.

Es posible que desee probar esto:

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

avatar de usuario
jsmith

También puede agregar $params decir como para 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');
    }
}

Olvidé mencionar que, por supuesto, esto supone que tiene la configuración de enrutamiento para aceptar un $param. Como ejemplo, el enrutamiento se vería así para la página a la que se está redirigiendo en el ejemplo anterior:

/aplicación/configs/aplicación.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

avatar de usuario
jsmith

Cómo obtienes el param sorta depende de dónde estés,

No tiene que capturar una solicitud $param para lograr lo que quiere hacer aquí. Solo está utilizando el ayudante de FlashMessenger para agregar un mensaje a la pila. Luego recupera el mensaje dentro de la acción donde desea mostrar el mensaje, luego lo asigna a la vista como lo hago en la acción de éxito. 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 a la que luego se accederá como $this->var.

Ya que preguntaste sobre el inicio de sesión, te mostraré cómo lo hago normalmente. No es que sea la mejor manera.

La vista de índice de My LoginController contiene el formulario:

    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 de é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 lo hago de esta manera es que a veces paso solo un mensaje en un controlador, en este caso simplemente uso:

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

Luego atrápelos a ambos si están configurados 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 
?>

¿Ha sido útil esta solución?