32 votes

Zend: Rediriger vers l'action avec des paramètres

J'utilise le framework zend. J'utilise la déclaration suivante pour rediriger vers une autre action.

 $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 ceci.

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

Et comment obtenir des paramètres dans une action appelée. Habituellement, nous aimons cela:

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

Comment faire ça? Exemple de code s'il vous plaît. Merci

50voto

armandfp Points 700

vous pouvez essayer avec le redirecteur:

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

29voto

Robin M. Canaday Points 525

Utilisez la méthode Zend_Controller_Action::redirect() (qui passe simplement à la méthode d'assistance de Sarfraz)

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

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

Et puis dans l'action appelée:

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

_getParam () prend un deuxième argument facultatif qui est défini par défaut sur la variable si le paramètre n'est pas trouvé.

7voto

Sarfraz Points 168484

Vous voudrez peut-être essayer ceci:

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

4voto

Jsmith Points 51

Vous pouvez également ajouter $ params 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'ai oublié de mentionner, bien sûr, cela suppose que vous avez la configuration de routage pour accepter un $ param. Par exemple, le routage ressemblerait à ceci pour la page qui est redirigée 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
 

1voto

Jsmith Points 51

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

Vous n'avez pas à attraper une demande $param pour atteindre ce que vous voulez faire ici. Vous êtes simplement en utilisant l'aide FlashMessenger pour ajouter un message à la pile. Vous récupérez ensuite le message au sein de l'action là où vous souhaitez afficher le message, puis l'assigner à la vue comme je le fais dans la successAction. Gardez à l'esprit que vous pouvez passer n'importe quel $var ou d'une matrice de données en l'affectant dans le contrôleur comme: $this->view->var = $var; au Sein de la vue qui sera ensuite accessible dans $this->var.

Puisque vous m'avez demandé de connexion, je vais vous montrer comment j'ai l'habitude de le faire. Pas que c'est la meilleure façon.

Mon LoginController l'index de l'avis de 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 la réussite de l'action-nous faire ceci:

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 faire de cette façon est que, parfois, je vais passer un seul message dans un contrôleur, dans ce cas, j'utilise simplement:

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

Ensuite, prendre 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 
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X