2010-04-16 6 views
9

Beh, non è davvero un problema, ma controllo se l'utente esiste e li accedo e reindirizza al sito/area membri, ma non voglio inviare l'utente a una pagina specifica ma voglio ricaricare il controller corrente. Quindi se accedo in index/home vorrei essere reindirizzato all'indice/home, come dovrei procedere?codeigniter: come reindirizzare dopo l'accesso al controller corrente (php_self in php regolare)

in php regolare avrei messo in azione per reindirizzare alla pagina corrente

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

Questo è il codice nel quadro

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

risposta

13

Ho risolto questo problema io stesso avendo un modulo di accesso nell'intestazione che presenta sempre un controller di accesso, ma la cattura è che il modulo di login dell'intestazione (che appare in ogni pagina) ha sempre un input nascosto chiamato reindirizzamento che il controller di login reale acquisisce ...

Ecco la configurazione di base (assicurarsi che l'url helper sia caricato):

L'intestazione 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> 

L'accesso controller Modulo

<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 parte migliore è di mantenere l'impostazione del reindirizzamento in caso di fallimento e l'ingresso redirect solo si impostare se si' rientrare da qualche altra parte.

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

Quello che sta succedendo qui è questo:

  1. accessi utente in una pagina diversa.
  2. Il modulo di accesso viene inviato a un singolo controller di accesso con un elemento di input nascosto che indica da dove si sta effettuando l'accesso.
  3. Il controller di accesso elabora l'accesso, quindi reindirizza in base all'input.
  4. In caso di accesso non riuscito, il reindirizzamento continua a essere impostato di nuovo, quindi non importa cosa, l'utente tornerà alla pagina originale.

Questo è solo un esempio di base. Puoi ovviamente modificarlo se necessario.

+0

"con un modulo di accesso nell'intestazione" .. Mi dispiace ma sono perso lì. Cosa vuoi dire ? –

2

Sono sicuro che ci può essere un modo migliore, ma il modo in cui lo faccio è quando il controllo se l'utente è loggato fallisce io uso $this->session->set_flashdata('redirect_url', current_url()); e poi lo passo insieme al modulo di login così so dove reindirizzare l'utente a.

Come ho detto, sono sicuro che c'è un modo più semplice per farlo, ma sicuramente non mi piace lo $_SERVER['HTTP_REFERER']; perché non ci si può fidare.

+0

quindi reindirizzare ('redirect_url', current_url()); ??? ma mi dà un errore. – Christophe

+0

Devi essere sicuro che l'helper dell'URL sia caricato. Scusa, avrei dovuto dirlo. Se non è così, che tipo di errore stai ottenendo? – vernonk

+0

Scusa ... ho guardato di nuovo ... Sarebbe ... reindirizzare ($ this-> session-> flashdata ('redirect_url')); – vernonk

10

Puoi farlo in questo modo. Ricorda di caricare la libreria di sessione e l'helper dell'URL.

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

Passare i flashdata sopra insieme con il login e reindirizzare utilizzando:

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

la libreria di sessione e l'url heper sono stati caricati. Ma non sono sicuro su dove inserire il codice, il reindirizzamento è ovviamente aggiunto nel controller di login che accede all'utente, ma non sono sicuro di dove mettere $ this-> session-> set_flashdata ('redirectToCurrent', current_url()); Ho aggiunto entrambe le linee nella stessa funzione ma mi reindirizza al controller principale (indice) – Christophe