一千萬個為什麽

搜索

codeigniter:如何在登錄到當前控制器後重定向(常規php中的php_self)

好吧,這不是一個真正的問題,但我檢查用戶是否存在並登錄並重定向到site/members_area,但我不想將用戶發送到特定頁面,但我想重新加載當前控制器。 所以如果我登錄index/home我想重定向到index/home,我該怎麽辦?

在常規的PHP我會把動作重定向到當前頁面

<?php echo $_SERVER['PHP_SELF']; ?>

這是框架中的代碼

function validate_credentials()
    {       
        $this->load->model('membership_model');
        $query = $this->membership_model->validate();

        if($query)//if the user's credentials validated...
        {
            $data = array(
                'username' => $this->input->post('username'),
                'is_logged_in' => true
            );
            $this->session->set_userdata($data);
            redirect('site/members_area'); //<-- this line here should be dynamic
        }
        else//incorrect username or password
        {
            $this->index();
        }
    }

最佳答案

我通過在標題中總是提交給一個登錄控制器的登錄表單來解決這個問題,但問題是標題登錄表單(出現在每個頁面上)總是有一個名為redirect的隱藏輸入,實際登錄控制器捕獲...

這是基本設置(確保加載了url助手):

標題登錄表單

<form action="/login" method="post">
    <input type="hidden" name="redirect" value="<?php echo current_url(); ?>" />
    <input type="text" name="username" value=""  />
    <input type="password" name="password" value=""  />
    <input type="submit" name="login" value="Login" id="submit">
</form>

登錄控制器表單

<form id="login" action="" method="post">
    <input type="text" name="username" id="username" value="" />
    <input type="password" name="password" id="password" value=""/>

    <?php if(isset($_POST['redirect'])) : ?>
    <input type="hidden" name="redirect" value="<?php echo $_POST['redirect']; ?>" />
    <?php endif; ?>

    <input type="submit" name="login" id="submit" value="Login" />  
</form>

最好的部分是您繼續將重定向設置為失敗,並且只有在您從其他位置登錄時才會設置重定向輸入。

控制器

function index()
{
    if( ! $this->form_validation->run())
    {
       //do your error handling thing
    }
    else
    {
       //log the user in, then redirect accordingly
        $this->_redirect();
    }   
}

function _redirect()
{
   //Is there a redirect to handle?
    if( ! isset($_POST['redirect']))
    {
        redirect("site/members_area", "location");
        return;
    }

   //Basic check to make sure we aren't redirecting to the login page
   //current_url would be your login controller
    if($_POST['redirect'] === current_url())
    {
        redirect("site/members_area", "location");
        return;
    }

    redirect($_POST['redirect'], "location");
}

這裏發生的是這樣的:

  1. 用戶登錄其他頁面。
  2. 登錄表單提交給一個登錄控制器,其中包含一個隱藏的輸入元素,說明他們從哪裏登錄。
  3. 登錄控制器處理登錄,然後根據輸入重定向。
  4. 登錄失敗後,重定向會再次設置,所以無論如何,用戶都會返回原始頁面。

這只是一個基本的例子。你可以根據需要調整它。

轉載註明原文: codeigniter:如何在登錄到當前控制器後重定向(常規php中的php_self)