2012-06-14 24 views
11

Ich habe seit einiger Zeit mit einem Problem zu tun. Wie kann ich die Validierungsfehler mit Redirect in einer Funktion einstellen? Dies ist der Code, den ich in meinem Controller haben:Wie Validierungsfehler mit Redirect in Codeigniter zeigen?

function send() 
{ 
    $this->form_validation->set_rules('e-mail', 'Email', 'trim|required|valid_email'); 
    $this->form_validation->set_rules('cellphone', 'Cellphone Number', 'trim|required|is_natural'); 
    $this->form_validation->set_message('required', '%s is required.'); 
    $this->form_validation->set_message('valid_email', '%s is not a valid Email Address'); 
    $this->form_validation->set_message('is_natural', '%s can only contain numbers.'); 
    $this->form_validation->set_error_delimiters('<li>', '</li>'); 

    if($this->form_validation->run() == FALSE) 
    { 
     redirect ('/'); 
    } 
    else 
    { 
     echo '<pre>'; 
     print_r($_POST); 
     echo '<pre>'; 
    } 
} 

Und das ist der Code, den ich in meiner Ansicht Datei:

<? if (validation_errors()) 
{ 
echo '<div id="validation_errors" title="Error:">'; 
echo '<div class="response-msgs errors ui-corner-all"><span>Errors:</span><br /><ul>'; 
echo validation_errors(); 
echo '</ul></div>'; 
echo '</div>'; 
} 
?> 
+0

Gibt es einen bestimmten Grund, warum Sie umleiten möchten?Wenn Fehler angezeigt werden, werden sie normalerweise auf der Seite angezeigt, in der sie eingegeben wurden, damit sie korrigiert werden können. Sie könnten "flashdata" verwenden, um das Ergebnis von 'validation_errors()' zu speichern, auf das dann auf der umgeleiteten Seite zugegriffen werden kann? – Gavin

+0

Ja, natürlich weiß ich das. Aber der Grund, warum ich umgeleitet wurde, ist, dass das Formular auf der Hauptseite der Website ist und alle Daten an eine Methode namens "send" senden soll. Nachdem irgendwelche Arten von Fehlern erhalten wurden, sollte es zu der vorherigen Methode "Index" zurückkehren. – Afshin

+0

Wird die Methode 'send' von etwas anderem als der' index'-Seite verwendet? – Gavin

Antwort

16

Ich habe den Weg gefunden, es zu tun. Durch Umleiten werden die Daten nicht angezeigt. Ich habe unter dem Code, das Problem zu lösen:

if($this->form_validation->run() == FALSE) 
{ 
    $this->index(); 
} 
+0

Aufwendig bitte. Ich bekomme undefinierte Methode "index()" auf meinem Controller, wenn ich dies verwende. Irgendein Link zur Dokumentation? –

+0

@AbhishekSaini Sie müssen zuerst eine index() -Methode in Ihrem Controller erstellen. dann können Sie die Methode in eine andere einschließen – Afshin

2

Per mein Kommentar:

function index() 
{ 
    $this->load->library('form_validation'); 
    $data = array 
    (
     'Param' => 'Value' 
    ); 
    if($this->input->post('cellphone', true) !== false) 
    { 
     if($this->form_validation->run() != FALSE) 
     { 
      echo '<pre>' . print_r($_POST, true) . '</pre>'; 
     } 
    } 
    $this->load->view('index', $data); 
} 

Erstens Sie müssen Ihr Formular ändern, sodass es auf die aktuelle Seite zeigt, z. B. current_url() oder site_url('controller/index').

Wenn Sie ohne Buchung auf die index gehen, wird die Validierung einfach übersprungen. Nach dem Absenden des Formulars wird die Validierung ausgeführt.

Sie können dann die integrierten Methoden form_error oder validation_errors verwenden, um die Fehler in Ihrer index Ansicht anzuzeigen.

+0

Ich wusste davon. Aber ich wollte nur wissen, ob es eine Möglichkeit gibt, es mit Redirect – Afshin

+0

Ja zu machen, aber es ist komplizierter. Sie müssten sowohl die '$ _POST'- als auch die' validation_errors'-Werte in den FlashData speichern und dann den Fehler usw. bei der Rückgabe anzeigen. Das bedeutet, dass Sie die integrierten Funktionen nicht verwenden können und Code ohne Grund neu schreiben. – Gavin

0

schließlich bekam ich eine Lösung für die Umleitung mit validation_errors

Dies wird mit Hilfe des validation_errors in den Session-Daten zu übergeben, ich tue es so

if ($this->form_validation->run()) { 
     $data = array(
      'email' => $this->input->post('email'), 
      'is_login' => true 
     ); 
     $this->session->set_userdata($data); 
     redirect($this->input->post('redirect')); 
    } 
    else 
    { 
     $data = array (
      'errors' => validation_errors(), 
      'is_login' => false 
     ); 
     $this->session->set_userdata($data); 
     redirect($this->input->post('redirect')); 
    } 

und in der Seite verwendet i

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

    if ($this->session->userdata('is_login')) 
    { 
     echo "You are using this as : </br>" . $this->session->userdata('email'); 
     echo "</br><a href='/logout'>Logout</a>"; 
    } 
    else 
    { 
     echo form_open('login'); 
     echo "" . $this->session->userdata('errors'); 
     echo "email : " . form_input('email'); 
     echo "Password : " . form_password('password'); 
     echo form_submit('submit', 'Login'); 
     echo form_hidden('redirect',$this->uri->uri_string()); 
     echo form_close(); 
    } 

Ich wünsche Ihnen gerne diese schnelle Lösung

7

Ich weiß, es ist ein bisschen spät, aber diese Methode funktioniert Wunder für mich.

Wenn Sie Ihre Form in eine andere Funktion als die, die Form, in geladen wird Validieren, können Sie Ihre validation_errors() auf jede Seite senden, dass Sie redirect(), indem man die validation_errors() Methode $this->session->set_flashdata() wie so:

if ($this->form_validation->run() == FALSE) { 

    $this->session->set_flashdata('error', validation_errors()); 

    redirect('/'); 
} 

In Ihrem Controller-Funktionen, wo Sie Ihre Fehler oder Meldungen möchten Sie sie dann auf die $data Array eingestellt werden empfangen kann etwa so:

if (!empty($this->session->flashdata('message'))) { 

    $data['message'] = $this->session->flashdata('message'); 
} elseif (!empty($this->session->flashdata('error'))) { 

    $data['error'] = $this->session->flashdata('error'); 
} 

Bei t er top meiner Ansichten, die ich normalerweise schließe:

Verwenden von twitter Bootstrap-Klassen zum Formatieren der Nachrichten hilft, sie zu unterscheiden.

Ich habe die message flashdata enthalten, so dass Sie sehen können, welche Art von Nachricht oder Fehler Sie senden möchten, können Sie sie für alle Informationen, Warnungen, Erfolg und Fehlermeldungen unterschiedlich formatieren.