2009-12-16 5 views
31

Ich verwende Zend Framework. Ich verwende die folgende Anweisung, um zu einer anderen Aktion umzuleiten.Zend: Redirect zu Aktion mit Parametern

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

Oben genannte Anweisung funktioniert einwandfrei und 'some_action' wird aufgerufen. Jetzt möchte ich einige Parameter an 'some_action' übergeben.

some_action?uname=username&[email protected] 

Und wie Parameter in genannt Aktion zu bekommen. Normalerweise mögen wir das:

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

Wie man das durchführt? Beispielcode bitte. Dank

Antwort

27

Verwenden Sie die Zend_Controller_Action::redirect() Methode (die nur durch die Hilfsmethode Sarfraz gibt)

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

Hinweis: _redirect() Methode zum Zend Framework ist veraltet 1.7. Verwenden Sie stattdessen redirect().

Und dann in der gerufenen Aktion:

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

_getParam() nimmt ein zweites optionales Argument, das auf die Variable als Standard gesetzt, wenn der Parameter nicht gefunden wird.

6

Vielleicht möchten Sie dies versuchen:

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

Sie mit Redirector versuchen:

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

Wie erhalten Sie $ params wenn Sie dort ankommen? –

4

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

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 vergessen zu erwähnen, natürlich hinzufügen, dies wird vorausgesetzt, Sie die Routing-Setup müssen Akzeptiere einen $ param. Als Beispiel wäre das Routing so etwas wie dies für die Seite suchen, die im obigen Beispiel zu umgeleitet wird:

/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

Wie Sie die param erhalten hängt davon ab, wo Sie sind,

Sie müssen keine Anfrage $ param zu erreichen, was Sie hier tun wollen. Sie verwenden nur den FlashMessenger-Helper, um dem Stapel eine Nachricht hinzuzufügen. Sie rufen dann die Nachricht in der Aktion ab, in der Sie die Nachricht anzeigen möchten, und weisen sie dann wie in der successAction der Ansicht zu. Beachten Sie, dass Sie ein beliebiges $ var- oder Datenfeld übergeben können, indem Sie es im Controller wie folgt zuweisen: $ this-> view-> var = $ var; In der Ansicht wird dann auf $ this-> var zugegriffen.

Da Sie nach dem Login gefragt haben, werde ich Ihnen zeigen, wie ich es normalerweise mache. Nicht dass es der beste Weg ist.

Mein LoginController Index Ansicht hält die Form:

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

Im Erfolg Aktion, die wir dies tun:

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

Im View Skript wir so etwas wie tun kann, was ich unten haben. Der Grund, warum ich es auf diese Weise zu tun ist, dass manchmal werde ich nur eine einzelne Nachricht in einer Steuerung übergeben, in diesem Fall habe ich einfach nutzen:

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

Dann fangen sie beide, 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 
?> 
Verwandte Themen