codeigniter: how to redirect after login to current controller (php_self in regular php)
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:
- User logins on a different page.
- The login form submits to a single login controller with a hidden input element stating where they are logging in from.
- The login controller processes the login, then redirects based on the input.
- 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.