Zend: Redirect to Action mit Parametern

Lesezeit: 4 Minuten

Benutzer-Avatar
Naveed

Ich verwende das Zend-Framework. Ich verwende die folgende Anweisung, um zu einer anderen Aktion umzuleiten.

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

Die obige Anweisung funktioniert perfekt und ‘some_action’ wird aufgerufen. Jetzt möchte ich einige Parameter wie folgt an ‘some_action’ übergeben.

some_action?uname=username&[email protected]

Und wie man Parameter in der aufgerufenen Aktion erhält. Normalerweise machen wir das so:

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

Wie wird dies durchgeführt? Beispielcode bitte. Vielen Dank

Sie können es mit dem Redirector versuchen:

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

  • Wie rufen Sie $params ab, wenn Sie dort ankommen?

    – Andrej Cristian Prodan

    17. August 2012 um 12:23 Uhr

Benutzer-Avatar
Robin M. Canaday

Verwenden Sie die Zend_Controller_Action::redirect() -Methode (die nur zur Hilfsmethode von Sarfraz durchgeht)

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

Notiz: _redirect() -Methode ist ab Zend Framework 1.7 veraltet. Verwenden redirect() stattdessen.

Und dann in der aufgerufenen Aktion:

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

_getParam() nimmt ein zweites optionales Argument, das standardmäßig auf die Variable gesetzt wird, wenn der Parameter nicht gefunden wird.

Vielleicht möchten Sie Folgendes versuchen:

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

Benutzer-Avatar
Schmied

Sie können auch $params sagen wie für Benutzer-ID hinzufügen

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

Ich habe vergessen zu erwähnen, dass dies natürlich davon ausgeht, dass Sie das Routing-Setup haben, um einen $param zu akzeptieren. Als Beispiel würde das Routing für die Seite, auf die im obigen Beispiel umgeleitet wird, in etwa so aussehen:

/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

Benutzer-Avatar
Schmied

Wie Sie die Param sorta erhalten, hängt davon ab, wo Sie sich befinden.

Sie müssen keine Anfrage $param abfangen, um das zu erreichen, was Sie hier tun möchten. Sie verwenden lediglich den FlashMessenger-Helfer, um dem Stack eine Nachricht hinzuzufügen. Sie rufen dann die Nachricht innerhalb der Aktion ab, in der Sie die Nachricht anzeigen möchten, und weisen sie dann der Ansicht zu, wie ich es in der successAction mache. Denken Sie daran, dass Sie jede $var oder jedes Array von Daten übergeben können, indem Sie es im Controller wie folgt zuweisen: $this->view->var = $var; Innerhalb der Ansicht, auf die dann als $this->var zugegriffen wird.

Da Sie nach dem Login gefragt haben, zeige ich Ihnen, wie ich es normalerweise mache. Nicht, dass es der beste Weg wäre.

Die Indexansicht von My LoginController enthält das Formular:

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

In der Erfolgsaktion machen wir das:

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

Im Ansichtsskript können wir so etwas wie das tun, was ich unten habe. Der Grund, warum ich das so mache, ist, dass ich manchmal nur eine einzige Nachricht in einem Controller übergebe, in diesem Fall verwende ich einfach:

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

Fangen Sie dann beide ab, wenn sie in der Ansicht festgelegt sind:

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

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

<?php 
endif 
?>

1180550cookie-checkZend: Redirect to Action mit Parametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy