web-dev-qa-db-fra.com

Codeigniter passant 2 arguments au rappel

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

23
pigfox

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;
}
42
Thorpe Obazee

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
}
30
Philipp

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;
    }
}
8
Ash

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

2
Mike

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

1
Matt G

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.

0
Beto Aveiga