Я использую Tank Auth для управления пользователями в своем приложении CI 1.7.3. Все работает нормально, но я пытаюсь установить flash_message
для отображения, когда пользователь выходит из системы. Проблема заключается в $this->tank_auth->logout();
функция разрушает сеанс. Я изменил функцию выхода в библиотеке Tank Auth, чтобы выглядеть так:
function logout() { $this->delete_autologin(); // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line $user_session_data = array('user_id' => '', 'username' => '', 'status' => ''); $this->ci->session->set_userdata($user_session_data); $this->ci->session->unset_userdata($user_session_data); }
Это было ранее
function logout() { $this->delete_autologin(); // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => '')); $this->ci->session->sess_destroy(); }
В моем контроллере у меня есть
function logout(){ if ($this->tank_auth->is_logged_in()) { // logged in $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out')); $this->tank_auth->logout(); redirect(''); }
изfunction logout(){ if ($this->tank_auth->is_logged_in()) { // logged in $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out')); $this->tank_auth->logout(); redirect(''); }
}
Если я удалю $this->tank_auth->logout();
функция сообщение показывает штраф. Я уверен, что это простая проблема с сеансом
Если вы попытаетесь установить flashdata при использовании базы данных в том же запросе после вызова sess_destroy()
, это не сработает (потому что нет сеанса для добавления flashdata).
Чтобы устранить эту проблему, добавьте $this->ci->session->sess_create();
после вызова sess_destroy()
. Это работает, потому что вы воссоздаете сеанс перед попыткой добавить к нему данные. Это единственный способ использовать flashdata после sess_destroy()
если вы используете сеансы в базе данных.
Функция sess_destroy()
уничтожает также флэш-переменные сеанса, используемые для передачи сообщения.
U уже ответил на ваш вопрос, в функции logout()
библиотеки вам нужно заменить
$this->ci->session->sess_destroy();
с
$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => ''));
Это не полностью уничтожит сеанс, только пользовательские данные, используемые для входа в систему, поэтому я рекомендую вместо этого изменить функцию logout()
в контроллере и показать сообщение вручную, передав его в представление.
Хотя это обходной путь, это может сделать трюк для вас …
везде, где вы их показываете, я буду считать, что вы проверяете представление так …
<? if ($this->session->flashdata('status_messege'): ?> <p><?= $this->session->flashdata('status_message') ?></p> <? endif; ?>
вы МОЖЕТЕ добавить elseif к этому и проверить, что реферер является вашей функцией выхода …
<? if ($this->session->flashdata('status_messege'): ?> <p><?= $this->session->flashdata('status_message') ?></p> <? else if ($this->agent->referrer() == site_url('path/to/logout'): ?> <p><?= $this->lang->line('auth_message_logged_out') ?></p> <? endif; ?>
Немного хакерский способ преодолеть эту проблему, но, вероятно, тем не менее.