web-dev-qa-db-fra.com

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&[email protected]

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

32
Naveed

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/[email protected]');

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

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é.

29
Robin M. Canaday

vous pouvez essayer avec le redirecteur:

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

Vous voudrez peut-être essayer ceci:

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

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

4
Jsmith

Comment vous obtenez le param sorta dépend de l'endroit 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 l'affectez à la vue comme je le fais dans successAction. Gardez à l'esprit que vous pouvez transmettre n'importe quel $ var ou tableau de données en l'affectant dans le contrôleur comme: $ this-> view-> var = $ var; Dans la vue qui sera alors accessible en tant que $ this-> var.

Puisque vous avez posé une question sur la connexion, je vais vous montrer comment je le fais habituellement. Pas que ce soit la meilleure façon.

La vue d'index de mon LoginController contient le formulaire:

    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 réussite, nous faisons 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 fais de cette façon est que parfois je ne transmettrai qu'un seul message dans un contrôleur, dans ce cas j'utilise simplement:

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

Ensuite, attrapez-les tous les deux s'ils sont définis 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 
?>
1
Jsmith