#kohana-3
#kohana-3
Вопрос:
В моем контроллере у меня есть функция before (), которая вызывает parent::before()
, а затем выполняет некоторую дополнительную обработку после возврата родительского элемента. основываясь на определенном условии, я хочу «сохранить» исходный запрос и передать выполнение определенному действию. Вот моя функция before ().
public function before() {
parent::before();
$this->uri = Request::Instance()->uri;
$match = ORM::factory('survey_tester')
->where('eid','=',$this->template->user->samaccountname)
->find();
if (!$match->loaded()) {
self::action_tester("add",$this->template->user);
}
}
И действие, которое вызывается..
public function action_tester($op=null,$user=null) {
$testers = ORM::factory('survey_tester')->find_all();
$tester = array();
$this->template->title = 'Some new title';
$this->template->styles = array('assets/css/survey/survey.css' => 'screen');
$this->template->scripts = array('assets/js/survey/tester.js');
$tester['title'] = $this->template->title;
$tester['user'] = $this->template->user;
switch ($op) {
case "add":
$tester = ORM::factory('survey_tester');
$tester->name = $user->displayname;
$tester->email = $user->mail;
$tester->division = $user->division;
$tester->eid = $user->samaccountname;
if ($tester->save()) {
$this->template->content = new View('pages/survey/tester_add', $admin);
} else {
$this->template->content = new View('pages/survey/tester_error', $admin);
}
break;
default:
break;
}
}
Кажется, все это работает нормально. Это предназначено для запроса у пользователя определенной части информации, которая не предоставляется $ user (заполняется LDAP), если это первый раз, когда они по какой-либо причине обращаются к контроллеру.
Проблема в том, что представления не отображаются. Вместо этого управление возвращается к тому действию, которое было запрошено изначально. Этот контроллер называется survey. Если я перейду к http://my.site.com/survey при входе в систему с новой информацией о пользователе запись записывается, и я получаю представления action_index вместо моих представлений action_tester.
Я не могу понять, что я здесь делаю не так. Любые идеи будут оценены. Спасибо.
РЕДАКТИРОВАТЬ: мне удалось заставить это работать (вроде как) с помощью $this->request->action = 'tester';
, но я пока не уверен, как добавить / задать новые параметры для запроса.
Комментарии:
1. Почему
self::action_tester()
и нет$this->action_tester()
?2. Это просто способ, которым это делал человек, у которого я начал учиться. Хотя это не имеет значения,
$this->action_tester()
делает то же самое. У меня все та же проблема.3. О частичном решении. Вы можете сохранить дополнительные параметры в сеансе, свойствах контроллера или объекте просмотра ($this-> template-> set(…)). Эти данные будут доступны в выполняемом действии
Ответ №1:
Проблема в том, что вы вызываете свой метод (action_tester), но затем Kohana все равно собирается вызвать исходное действие после вызова метода before, который изменит содержимое ответа, перезаписав изменения, сделанные в action_tester().
Вы можете изменить вызываемое действие (после вызова before) внутри вашего метода before():
$this->request->action('action_tester');
После вызова метода before он должен вызвать новое действие (action_tester) вместо старого, но затем вам нужно что-то сделать с тем, как вы затем передаете свои параметры.
Или вы могли бы просто перенаправить запрос при некоторых условиях:
if($something) {
$this->request->redirect('controller/tester');
}
В любом случае, это не кажется хорошим способом сделать это.