开发者

codeigniter: how to redirect after login to current controller (php_self in regular php)

Well it's not really a problem but I check if the user exist and log them in and redirect to site/me开发者_StackOverflow社区mbers_area, but I don't want to send the user to a specific page but i want to reload the current controller. So if I login in index/home I would like to be redirected at index/home, how should I proceed?

in regular php I would put in the action to redirect to current page

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

This is the code in the framework

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();
        }
    }


I solved this problem myself by having a login form in the header that always submits to one login controller, but the catch is that the header login form (which appears on every page) always has a hidden input called redirect which the actual login controller captures...

Here's the basic set up (make sure the url helper is loaded):

The Header Login Form

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

The Login Controller 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>

The best part is you keep setting the redirect on failure and the redirect input only gets set if you're logging in from somewhere else.

The Controller

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");
}

What's happening here is this:

  1. User logins on a different page.
  2. The login form submits to a single login controller with a hidden input element stating where they are logging in from.
  3. The login controller processes the login, then redirects based on the input.
  4. On failed login the redirect keeps getting set again, so no matter what, the user will return to the original page.

That's just a basic example. You can obviously tweak it as needed.


You can do it like this. Remember to load the session library and url helper.

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

Pass the above flashdata along with the login and redirect using:

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


I'm sure there may be a better way, but the way I do it is when the check if the user is logged in fails I use $this->session->set_flashdata('redirect_url', current_url()); and then pass it along with the login form so I know where to redirect the user back to.

Like I say, I'm sure there's a cleaner way to do this but I definitely don't like $_SERVER['HTTP_REFERER']; as it can't really be trusted.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜