Codeigniter che passa 2 argomenti a callback

Dopo aver pubblicato un modulo con due campi denominati “id” e “url”, ho il seguente codice:

$this->load->library('form_validation'); $this->form_validation->set_rules('id', 'id', 'trim|xss_clean'); $this->form_validation->set_rules('url', 'url|id', 'trim|xss_clean|callback_url_check'); 

Una query db richiede entrambi i campi.

La funzione url_check ($ str, $ id) viene chiamata ma in questo caso ‘id’ ha sempre il valore 0.

Se solo faccio:

 $this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check'); 

E chiama url_check($str) tutto funziona come dovrebbe.

La domanda è: come posso passare due valori a url_check($str, $id) ?

Puoi usare $ this-> input-> post direttamente:

 function check_url() { $url = $this->input->post('url'); $id = $this->input->post('id'); // do some database things you need to do eg if ($url_check = $this->user_model->check_url($url, $id) { return TRUE; } $this->form_validation->set_message('Url check is invalid'); return FALSE; } 

Fallo nel modo giusto (almeno per CI 2.1+) come descritto nei documenti :

 $this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']'); // Later: function check_uri($field, $id){ // your callback code here } 

Anche questo sembra funzionare.

 $id = 1; $this->form_validation->set_rules('username', 'Human Username', 'callback_username_check['.$id.']'); function username_check($str, $id) { echo $id; if ($str == 'test') { $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"'); return FALSE; } else { return TRUE; } } 

Se capisco form_validation correttamente, ogni regola (set_rules) è per un campo del modulo e la tua callback controllerà solo il campo. Nel tuo caso sembrerebbe che “id” sia fuori portata. Invece, si può passare un array alla funzione set_rules e fare il callback. Non ho ancora provato questo. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray

Solo una nota sull’utilizzo dei parametri di callback come suggerito nelle altre risposte. Se stai usando app/config/form_validation.php per creare le tue regole di validazione, la syntax $this->input->post('parameter') non funzionerà dato che quell’object non è disponibile nel Loader dell’IC al punto nel esecuzione in cui legge il contenuto di quel file. Dovresti effettuare la chiamata nella tua routine di callback, ad esempio:

 public function _validate_user_signup($username, $password) { $var = $this->input->post('password'); 

In questo caso il secondo parametro passato al metodo non conterrebbe la password, ma $ var sarebbe dopo la chiamata.

Spero sia chiaro. opaco

È meglio utilizzare la libreria di convalida del form per ottenere i dati che vengono convalidati.

Non sempre i tuoi dati saranno in $ _GET o $ _POST (vedi https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post ).

Il modo migliore per accedere ai tuoi dati all’interno di una callback di convalida è questo:

 $this->form_validation->validation_data 

“validation_data” è una proprietà pubblica nella class CI_Form_validation.