web-dev-qa-db-ja.com

codeigniter:ログイン後に現在のコントローラーにリダイレクトする方法(通常のphpではphp_self)

それは実際には問題ではありませんが、ユーザーが存在するかどうかを確認してログインし、site/members_areaにリダイレクトしますが、ユーザーを特定のページに送りたくないのですが、現在のコントローラーをリロードしたいと思います。インデックス/ホームにログインした場合、インデックス/ホームにリダイレクトしたいのですが、どうすればよいですか?

通常の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();
        }
    }
9
Christophe

ヘッダーにログインフォームを常に1つのログインコントローラーに送信することでこの問題を自分で解決しましたが、ヘッダーログインフォーム(すべてのページに表示されます)には、実際のログインコントローラーがキャプチャするリダイレクトと呼ばれる非表示の入力が常にあります。 .。。

基本的な設定は次のとおりです(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. ログインに失敗すると、リダイレクトは再び設定され続けるため、ユーザーは何があっても元のページに戻ります。

これは基本的な例です。必要に応じて、明らかに微調整することができます。

15
bschaeffer

あなたはこのようにそれを行うことができます。セッションライブラリとURLヘルパーをロードすることを忘れないでください。

$this->session->set_flashdata('redirectToCurrent', current_url());

上記のflashdataをログインと一緒に渡し、以下を使用してリダイレクトします。

redirect($this->session->flashdata('redirectToCurrent'));
10
rkj

もっと良い方法があると思いますが、ユーザーがログインしているかどうかの確認に失敗した場合は、$this->session->set_flashdata('redirect_url', current_url());を使用して、ログインフォームと一緒に渡すので、どこにいるかがわかります。ユーザーをにリダイレクトします。

私が言うように、これを行うためのよりクリーンな方法があると確信していますが、実際には信頼できないため、$_SERVER['HTTP_REFERER'];は絶対に好きではありません。

2
vernonk