2010-04-16 68 views
9

Bueno, no es realmente un problema, pero verifico si el usuario existe y lo conecto y redirecciona al sitio/members_area, pero no quiero enviar al usuario a una página específica, pero quiero volver a cargar el controlador actual. Entonces, si inicio sesión en index/home Me gustaría ser redirigido a index/home, ¿cómo debo proceder?codeigniter: cómo redirigir después de iniciar sesión en el controlador actual (php_self en php normal)

en php regla Yo pondría en la acción para redirigir a la página actual

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

Este es el código en el marco

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

Respuesta

13

He resuelto este problema a mí mismo por tener un formulario de acceso en la cabecera que se somete siempre a un controlador de acceso, pero la captura es que la forma de la conexión de cabecera (que aparece en cada página) siempre tiene un campo oculto llamado redirección que captura el controlador de acceso real ...

Aquí está la configuración básica (asegúrese de que el asistente de url se carga):

La cabecera Formulario de acceso Formulario

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

El controlador de sesión

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

la mejor parte es que conserva el ajuste de la redirección en caso de fallo y la entrada de redirección sólo se pone establecer si' vuelve a iniciar sesión desde otro lugar.

El controlador

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

¿Qué está pasando aquí es la siguiente:

  1. inicios de sesión de usuario en una página diferente.
  2. El formulario de inicio de sesión se envía a un único controlador de inicio de sesión con un elemento de entrada oculto que indica desde dónde están iniciando sesión.
  3. El controlador de inicio de sesión procesa el inicio de sesión, luego redirige en función de la entrada.
  4. En el inicio de sesión fallido, la redirección sigue configurándose nuevamente, por lo que pase lo que pase, el usuario volverá a la página original.

Eso es solo un ejemplo básico. Obviamente puedes modificarlo según sea necesario.

+0

"al tener un formulario de inicio de sesión en el encabezado" .. Lo siento pero estoy perdido allí. A qué te refieres ? –

2

Estoy seguro de que puede haber una mejor manera, pero la forma en que lo hago es cuando falla el control de si el usuario está conectado. Uso $this->session->set_flashdata('redirect_url', current_url()); y luego lo paso junto con el formulario de inicio de sesión para saber a dónde redireccionar al usuario de nuevo.

Como digo, estoy seguro de que hay una manera más clara de hacerlo, pero definitivamente no me gusta $_SERVER['HTTP_REFERER'];, ya que no se puede confiar.

+0

tan redirigir ('redirect_url', current_url()); ??? pero me da un error. – Christophe

+0

Debes estar seguro de que el URL helper está cargado. Lo siento, debería haber mencionado eso. Si eso no es así, ¿qué tipo de error estás recibiendo? – vernonk

+0

Lo siento ... solo miré de nuevo ... Sería ... redirigir ($ this-> session-> flashdata ('redirect_url')); – vernonk

10

Puede hacerlo así. Recuerde cargar la biblioteca de sesión y url helper.

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

pasar los flashdata anteriores, junto con el nombre de usuario y redirección usando:

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

se cargaron la biblioteca de sesión y url heper. Pero no estoy seguro de dónde colocar el código, la redirección se agrega en el controlador de inicio de sesión que inicia sesión en el usuario, pero no estoy seguro de dónde colocar $ this-> session-> set_flashdata ('redirectToCurrent', current_url()); Agregué ambas líneas en la misma función, pero me redirige al controlador principal (índice) – Christophe

Cuestiones relacionadas