2010-04-16 5 views
9

Nun, es ist nicht wirklich ein Problem, aber ich überprüfe, ob der Benutzer existiert und logge sie ein und umleitung zu site/members_area, aber ich will nicht Senden Sie den Benutzer an eine bestimmte Seite, aber ich möchte den aktuellen Controller neu laden. Wenn ich mich also in index/home anmelde, würde ich gerne zu index/home weitergeleitet werden, wie soll ich weitermachen?coderigniter: wie man nach dem Login zum aktuellen Controller umleiten kann (php_self in regulärem PHP)

in regelmäßiger PHP würde ich in der Tat umgesetzt zu aktueller Seite zu umleiten

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

Dies ist der Code im Rahmen

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

Antwort

13

ich dieses Problem selbst gelöst, aber der Haken ist, dass das Header-Login-Formular (das auf jeder Seite erscheint) immer einen versteckten Eingang namens redirect hat, den der eigentliche Login-Controller erfasst ...

Hier ist die grundlegende Einrichtung (stellen Sie sicher, dass der URL-Helper geladen ist):

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

Der Login-Controller-Formular

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

Der beste Teil ist, dass Sie halten die Umleitung bei Ausfall und die Umleitung Eingangseinstellung nur dann gesetzt wird, wenn Sie‘ Neu einloggen von woanders.

Der Regler

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

Was hier geschieht, ist dies:

  1. Benutzer-Logins auf einer anderen Seite.
  2. Das Anmeldeformular wird an einen einzelnen Login-Controller mit einem versteckten Eingabeelement gesendet, aus dem hervorgeht, von wo sie sich anmelden.
  3. Der Login-Controller verarbeitet die Anmeldung und leitet sie dann basierend auf der Eingabe weiter.
  4. Bei fehlgeschlagener Anmeldung wird die Weiterleitung immer wieder neu festgelegt. Der Benutzer kehrt also zur ursprünglichen Seite zurück.

Das ist nur ein einfaches Beispiel. Sie können es natürlich nach Bedarf optimieren.

+0

"durch ein Login-Formular in der Kopfzeile" .. Es tut mir leid, aber ich bin dort verloren. Was meinst du ? –

2

Ich bin sicher, es kann eine bessere Art und Weise sein, aber die Art, wie ich es tue ist, wenn die Überprüfung, ob der Benutzer angemeldet ist fehlschlägt Ich verwende $this->session->set_flashdata('redirect_url', current_url()); und gebe es dann zusammen mit dem Login-Formular, so dass ich weiß, wohin der Benutzer zurück zu.

Wie ich schon sagte, ich bin sicher, es gibt eine sauberere Möglichkeit, dies zu tun, aber ich mag definitiv nicht $_SERVER['HTTP_REFERER'];, da es nicht wirklich vertrauenswürdig ist.

+0

so redirect ('redirect_url', current_url()); ??? aber es gibt mir einen Fehler. – Christophe

+0

Sie müssen sicher sein, dass der URL-Helfer geladen ist. Entschuldigung, das hätte ich erwähnen sollen. Wenn das nicht ist, welche Art von Fehler bekommen Sie? – vernonk

+0

Sorry ... sah gerade wieder ... Es wäre ... redirect ($ this-> session-> flashdata ('redirect_url')); – vernonk

10

Sie können es so machen. Denken Sie daran, die Sitzungsbibliothek und den URL-Helper zu laden.

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

Führen Sie die oben flashdata zusammen mit der Anmeldung und umleiten mit: indem ein Anmeldeformular in der Kopfzeile, die immer unterwirft sich ein Login-Controller

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

die Session-Bibliothek und URL-Heper wurden geladen. Aber ich bin mir nicht sicher, wo ich den Code ablegen soll, die Umleitung wird natürlich im Login-Controller hinzugefügt, der den Benutzer anmeldet, aber ich bin mir nicht sicher, wo die $ this-> session-> set_flashdata ('redirectToCurrent', aktuelle_url()); Ich habe beide Zeilen in der gleichen Funktion hinzugefügt, aber es leitet mich zurück zum Hauptcontroller (Index) – Christophe

Verwandte Themen