2012-06-14 10 views
11

Ho avuto a che fare con un problema per un po '. Come posso impostare gli errori di convalida utilizzando il reindirizzamento in una funzione? Questo è il codice che ho nel mio controller:Come mostrare gli errori di convalida utilizzando il reindirizzamento in codeigniter?

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>'; 
    } 
} 

E questo è il codice che uso nel mio file di vista:

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

C'è qualche ragione particolare per cui si desidera reindirizzare?Di solito quando mostri errori, vengono mostrati nella pagina in cui vengono inseriti in modo che possano essere corretti. È possibile "utilizzare" flashdata per archiviare il risultato di 'validation_errors()' a cui si può accedere sulla pagina reindirizzata? – Gavin

+0

Sì, certo che lo so. Ma la ragione che mi ha spinto a reindirizzare è che il modulo si trova nella pagina principale del sito e dovrebbe inviare tutti i dati a un metodo chiamato "invia". Dopo aver ricevuto qualsiasi tipo di errore, dovrebbe tornare al precedente metodo "indice". – Afshin

+0

Il metodo 'send' è usato da qualcos'altro, tranne che per la pagina 'index'? – Gavin

risposta

16

Ho trovato il modo di farlo. Il reindirizzamento non mantiene i dati da mostrare. Ho usato il codice qui sotto per risolvere il problema:

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

Elaborato per favore. Ricevo un metodo indefinito "index()" sul mio Controller se lo uso. Qualche link alla documentazione? –

+0

@AbhishekSaini devi prima creare un metodo index() nel tuo controller. allora puoi includere il metodo in un altro – Afshin

2

Come per il mio commento:

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

In primo luogo, è necessario modificare il modulo in modo che punti alla pagina corrente, ovvero current_url() o site_url('controller/index').

Quando si passa a index senza pubblicare, si salterà semplicemente la convalida. Al momento dell'invio del modulo, verrà eseguita la convalida.

È quindi possibile utilizzare i metodi integrati form_error o validation_errors per visualizzare gli errori nella vista index.

+0

Sapevo di questo. Ma volevo solo sapere se c'è un modo per farlo usando il redirect – Afshin

+0

Sì, tuttavia è più complicato. Dovresti memorizzare entrambi i valori '$ _POST' e' validation_errors' nei FlashData e quindi visualizzare l'errore ecc. Al reso. Ciò significa che non è possibile utilizzare le funzioni integrate e si sta effettivamente riscrivendo il codice senza motivo. – Gavin

0

finalmente ho ottenuto una soluzione per il reindirizzamento con validation_errors

Questo sta usando per passare i validation_errors nei dati di sessione, lo faccio come questo

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

e nella pagina che ho usato

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

Vorrei che ti piacesse questa soluzione veloce

7

So che è un po 'tardi ma questo metodo fa miracoli per me.

Se state convalidando il modulo in una funzione diversa da quella il form viene caricato in, è possibile inviare la validation_errors() a qualsiasi pagina che si redirect() passando il metodo validation_errors()-$this->session->set_flashdata() in questo modo:

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

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

    redirect('/'); 
} 

Nelle tue funzioni di regolazione in cui si desidera i vostri errori o messaggi da ricevere È quindi possibile impostare alla matrice $data in questo modo:

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

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

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

a t egli parte superiore del mio punto di vista io di solito includono:

<?php if (isset($message)) { 

    echo '<p class="alert alert-info">'.$message.'</p>'; 
} elseif (isset($error)) { 

    echo '<p class="alert alert-danger"><strong>Error: </strong>'.$error.'</p>'; 
}?> 

Uso delle classi Twitter bootstrap per formattare i messaggi aiuta a differenziarli.

Ho incluso il flashdata message in modo da poter vedere come qualsiasi tipo di messaggio o errore si desidera inviare, è possibile formattare in modo diverso per tutte le informazioni, avvisi, messaggi di errore e di successo.

Problemi correlati