2009-12-16 2 views
31

Я использую zend framework. Я использую следующее заявление для перенаправления на другое действие.Zend: перенаправление на действие с параметрами

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

Выше инструкция работает отлично и вызывается «some_action». Теперь я хочу передать некоторые параметры «some_action» следующим образом.

some_action?uname=username&[email protected] 

И как получить параметры в вызываемом действии. Обычно мы делаем так:

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

Как это сделать? Пример кода, пожалуйста. Благодаря

ответ

27

Используйте метод Zend_Controller_Action::redirect() (который как раз проходит на вспомогательный метод Сарфраза в)

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

Примечание: _redirect() метод устаревшим Zend Framework 1.7. Вместо этого используйте redirect().

А потом в вызываемых действиях:

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

_getParam() принимает второй необязательный аргумент, который установлен в переменную как значение по умолчанию, если параметр не найден.

6

Вы можете попробовать это:

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

вы можете попробовать с редиректорами:

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

Как вы получаете $ params, когда доберетесь туда? –

4

Вы также можете добавить $ PARAMS сказать, как для идентификатора пользователя

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

Я забыл упомянуть, конечно, это если у вас есть настройки маршрутизации в принять параметр $ param. В качестве примера маршрутизации будет выглядеть примерно так на страницу, перенаправляется в приведенном выше примере:

/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

Как получить из параметров sorta зависит от того, где вы находитесь,

Вам не нужно ловить запрос $ param для достижения того, что вы хотите сделать здесь. Вы просто используете помощник FlashMessenger для добавления сообщения в стек. Затем вы извлекаете сообщение внутри действия, в котором вы хотите показать сообщение, а затем назначаете его представлению, как я делаю в successAction. Имейте в виду, что вы можете передать любой $ var или массив данных, назначив его в контроллере, например: $ this-> view-> var = $ var; В представлении, которое затем будет доступно как $ this-> var.

Поскольку вы спросили о входе в систему, я покажу вам, как я обычно это делаю. Не то, чтобы это было наилучшим образом.

вид индекса Моего LoginController держит форму:

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

В действии успеха мы делаем это:

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

В скрипте вида мы можем сделать что-то вроде того, что у меня есть ниже. Поэтому я сделать это таким образом, что иногда я буду пропускать только одно сообщение в контроллере, в данном случае я просто использую:

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

Тогда поймать их обоих, если они установлены в представлении:

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

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

<?php 
endif 
?> 
Смежные вопросы