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