Я использую zend framework. Я использую следующее заявление для перенаправления на другое действие.
$this->_helper->redirector('some_action');
Выше инструкция работает отлично, и вызывается «some_action». Теперь я хочу передать некоторые параметры «some_action» следующим образом.
some_action?uname=username&umail=username@example.com
И как получить параметры в вызываемом действии. Обычно мы делаем так:
$userName = $_REQUEST['uname']; $usermail = $_REQUEST['umail'];
Как это сделать? Пример кода, пожалуйста. благодаря
Используйте метод Zend_Controller_Action::redirect()
(который просто переходит к вспомогательному методу Sarfraz)
$this->redirect('/module/controller/action/username/robin/email/robin@example.com');
Примечание. _redirect()
устарел из Zend Framework 1.7. Вместо этого используйте redirect()
.
И затем в вызванном действии:
$username = $this->_getParam('username'); $email = $this->_getParam('email');
_getParam () принимает второй необязательный аргумент, который устанавливается в качестве значения по умолчанию, если параметр не найден.
вы можете попробовать с перенаправителем:
$params = array('user' => $user, 'mail' => $mail); $this->_helper->redirector($action, $controller, $module, $params);
Вы можете попробовать следующее:
$this->_redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
Вы также можете добавить $ params, например, для 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'); } }
Я забыл упомянуть, конечно, это предполагает, что у вас есть настройка маршрутизации, чтобы принять параметр $ 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
Как вы получаете сортировку параметров, зависит от того, где вы находитесь,
Вам не нужно ловить запрос $ 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 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 ?>