2009-01-22 5 views
14

J'écris ma classe de validation de formulaire en utilisant CodeIgniter. Y a-t-il un moyen pour que je puisse obtenir des messages d'erreur dans la paire de valeur de nom? Par exemple, dans un exemple de formulaire, il y a quatre champs: user_name, password, password_conf et timezone. Parmi les user_name et password la validation a échoué après l'exécution de ce qui suit:CodeIgniter Form Validation - Obtenir le résultat en tant que "tableau" Au lieu de "chaîne"

$result = $this->form_validation->run(); 

Si la fonction ci-dessus renvoie faux, je veux obtenir les erreurs de paires de valeurs de nom comme ce qui suit:

Array 
{ 
    'user_name' => 'user name is required', 
    'password' => 'passord is required' 
} 

Je vraiment vouloir former un JSON, que je peux renvoyer à l'appel AJAX. J'ai un (sale) solution: Je peux appeler des méthodes de validation, un par un comme ce qui suit:

$this->form_validation->required($user_name); 
$this->form_validation->required($password); 

est-il une autre façon, pour obtenir tous les messages d'erreur à la fois en paire de valeurs de nom?

EDIT: Je suggère de faire valider avec jQuery de l'une des réponses:

jQuery contribuera à la validation du côté client, mais qu'en est-côté serveur, là, je suis en utilisant la validation CodeIgniter.

Je l'ai conçu de telle sorte que:

  1. Je Référencer toutes les valeurs en utilisant AJAX.
  2. Validez du côté serveur (PHP).
  3. Effectuez l'opération souhaitée si les entrées sont valides; sinon, renvoie une erreur à l'utilisateur.

Répondre

16

J'ai trouvé une façon moi-même en regardant dans le code CodeIgniter: J'ai étendu la bibliothèque CI_Form_validation comme: -

class MY_Form_validation extends CI_Form_validation 
{ 
    public function getErrorsArray() 
    { 
     return $this->_error_array; 
    } 
} 

Je sais, c'est un hack, mais servir mon besoin pour le moment . J'espère que l'équipe de CodeIginter proposera bientôt une interface pour accéder à ce tableau.

+2

Ce n'est pas un hack du tout, c'est ça la POO. Je descends exactement la même route, et c'est mon jeu final puisque je ne vois pas d'autre alternative. – thenetimp

+4

C'est définitivement une bonne solution. Honte à codeigniter pour ne pas avoir cette fonctionnalité nativement! –

+0

Cela ne renvoie cependant pas de valeur. Une idée pourquoi? Quand je jette le $ ce pointeur, je vois que _error_array est protégé. Le tableau retourne toujours vide. –

1

Voyant que la validation de CodeIgniter vous donne les messages d'erreur sur une actualisation de la page normale ne serait-il préférable d'utiliser quelque chose comme le jquery validation plugin qui validera entièrement côté client avant d'envoyer le formulaire? Aucun AJAX nécessaire de cette façon. Je ne suggère pas NE PAS FAIRE la validation côté serveur, juste que la publication avec AJAX afin de valider n'est pas nécessaire et réduira les hits du serveur si vous le faites côté client. Il se dégradera avec la mise à jour régulière de la page avec des erreurs ou un message de réussite.

+3

La validation côté client ne devrait pas être votre seule préoccupation, la validation du backend est beaucoup plus importante. –

+0

Ce serait stupide. Je n'ai pas suggéré de NE PAS FAIRE la validation côté serveur - lire à nouveau mon édition et mon article original. – roborourke

+0

Aussi, parfois la validation DOIT être faite en backend, par exemple pour valider quelque chose par rapport à une table de base de données (unicité dans une table) – MaxiWheat

1

La solution que je préfère n'implique pas l'ajout d'une fonction partout ou l'extension de la bibliothèque de validation:

$validator =& _get_validation_object(); 
$error_messages = $validator->_error_array; 

Référence: http://thesimplesynthesis.com/post/how-to-get-form-validation-errors-as-an-array-in-codeigniter/

Vous devriez être en mesure d'appeler cela à tout moment dans votre code .En outre, il est à noter qu'il y a un newer thread qui parle de cela aussi bien.

+0

'$ this-> form_validation-> error_array();' est déjà dans la bibliothèque. Pourquoi ne pas l'utiliser? – masterFly

1

Vous pouvez créer une fonction privée dans votre contrôleur

private function return_form_validation_error($input) 
{ 
    $output = array(); 
    foreach ($input as $key => $value) 
    { 
     $output[$key] = form_error($key); 
    } 
    return $output; 
} 

puis dans votre méthode de validation, il suffit d'appeler cela, voici le mien est

public function add_cat_form() 
 
    { 
 
     $this->output->unset_template(); 
 
     $this->load->library('form_validation'); 
 
     $this->form_validation->set_rules('name', 'Name', 'required'); 
 
     if ($this->form_validation->run()) 
 
     { 
 
      if (IS_AJAX) 
 
      { 
 
       $dataForInsert = $this->input->post(); 
 
       if ($dataForInsert['parentid'] == -1) 
 
       { 
 
        unset($dataForInsert['parentid']); 
 
       } 
 
       $this->post_model->add_cat($dataForInsert); 
 
       echo json_encode('success'); 
 
      } else 
 
      { 
 
       #in case of not using AJAX, the AJAX const defined 
 
      } 
 
     } else 
 
     { 
 
      if (IS_AJAX) 
 
      { 
 
       #This will be return form_validation error in an array 
 
       $output = $this->return_form_validation_error($this->input->post()); 
 
       echo $output = json_encode($output); 
 
      } else 
 
      { 
 
       #in case of not using AJAX, the AJAX const defined 
 
      } 
 
     } 
 
    }

Questions connexes