2011-03-16 1 views
4

CI 1.7.3 응용 프로그램에서 사용자 관리를 위해 Tank Auth을 사용하고 있습니다. 모든 것이 잘 작동하지만 사용자가 로그 아웃 할 때 flash_message을 표시하려고합니다. 문제는 $this->tank_auth->logout(); 함수가 세션을 파괴한다는 것입니다. 그것은 내 컨트롤러에서 이전세션을 파괴하지만 플래시 데이터를 유지하십시오.

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() { 
     $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(){ 
    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(); 함수를 제거합니다. 나는

당신이이를 표시하고 어디든지

, 나는 당신이 확인하고 가정 할 것이다 ... 그것은이 해결 방법이지만

답변

1

, 그것은 당신을 위해 트릭을 할 수있는 간단한 세션 문제가 확실 해요 당신이 그에게 ELSEIF을 추가하고 로그 아웃 기능되는 리퍼러를 확인할 수

<? if ($this->session->flashdata('status_messege'): ?> 

    <p><?= $this->session->flashdata('status_message') ?></p> 

<? endif; ?> 

보기 때문에 ...

<? 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; ?> 

이 문제를 극복하기위한 약간의 해킹 방법이지만, 그래도 역시 그렇습니다.

2

sess_destroy() 함수는 메시지를 전달하는 데 사용 된 세션 플래시 변수도 파괴합니다.

U는 이미 라이브러리 logout() 기능, 당신은 완전히 세션을 파괴하지 않습니다

$this->ci->session->sess_destroy(); 

$this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => '')); 

이로 교체하는 로그인에 사용 된 사용자 만이 데이터를 필요, 당신의 질문에 대답 컨트롤러 대신 logout() 함수를 수정하고 뷰에 전달하여 수동으로 메시지를 표시하는 것이 좋습니다.

6

sess_destroy()을 호출 한 후 동일한 요청으로 데이터베이스를 사용하는 동안 flashdata를 설정하려고하면 (플래시 데이터를 추가 할 세션이 없기 때문에) 작동하지 않습니다.

이 문제를 해결하려면 sess_destroy() 호출 후 $this->ci->session->sess_create();을 추가하십시오. 이는 세션에 데이터를 추가하기 전에 세션을 다시 만들고 있기 때문에 가능합니다. 이것은 데이터베이스에서 세션을 사용하는 경우 sess_destroy() 뒤에 플래시 데이터를 사용하는 유일한 방법입니다.

+0

팁 주셔서 감사합니다! – dennisbot