Après avoir posté un formulaire avec deux champs nommés 'id' et 'url', j'ai le code suivant:
$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');
Une requête de base de données nécessite les deux champs.
La fonction url_check ($ str, $ id) est appelée mais dans ce cas, 'id' a toujours la valeur 0.
Si je fais juste:
$this->form_validation->set_rules('url', 'url', 'trim|xss_clean|callback_url_check');
Et appelez url_check($str)
tout fonctionne comme il se doit.
La question est de savoir comment puis-je passer deux valeurs à la url_check($str, $id)
?
Vous pouvez utiliser $ this-> input-> post directement:
function check_url() {
$url = $this->input->post('url');
$id = $this->input->post('id');
// do some database things you need to do e.g.
if ($url_check = $this->user_model->check_url($url, $id) {
return TRUE;
}
$this->form_validation->set_message('Url check is invalid');
return FALSE;
}
Faites juste la bonne manière (au moins pour CI 2.1+) comme décrit dans la documentation :
$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']');
// Later:
function check_uri($field, $id){
// your callback code here
}
Cela semble fonctionner aussi.
$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;
}
}
Si je comprends bien formulaire_validation, chaque règle (set_rules) concerne un champ du formulaire et votre rappel ne vérifiera que le champ. Dans votre cas, il semblerait que "id" soit hors de portée. Au lieu de cela, on peut passer un tableau à la fonction set_rules et faire le rappel. Je n'ai pas encore essayé. http://codeigniter.com/user_guide/libraries/form_validation.html#validationrulesasarray
Juste une note sur l'utilisation des paramètres de rappel comme suggéré dans les autres réponses. Si vous utilisez app/config/form_validation.php
pour créer vos règles de validation, la syntaxe $this->input->post('parameter')
ne fonctionnera pas car cet objet n'est pas disponible dans CI Loader au moment de l'exécution où il lit le contenu de ce fichier. Vous devez faire l'appel dans votre routine de rappel, par exemple. :
public function _validate_user_signup($username, $password) {
$var = $this->input->post('password');
Dans ce cas, le deuxième paramètre transmis à la méthode ne contiendrait pas le mot de passe, mais $ var après l'appel.
J'espère que c'est clair . Matt
Il est préférable d'utiliser la bibliothèque de validation de formulaire pour obtenir les données en cours de validation.
Vos données ne seront pas toujours dans $ _GET ou $ _POST (voir https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post )
La meilleure façon d’accéder à vos données dans un rappel de validation est la suivante:
$this->form_validation->validation_data
"validation_data" est une propriété publique de la classe CI_Form_validation.