Le blog du pangolin

Accueil > Programmation > PHP > CodeIgniter > Gestion des formulaire avec CodeIgniter (2.*)

Gestion des formulaire avec CodeIgniter (2.*)

mercredi 16 novembre 2011, par Super Pangolin

A partir d’un exemple simple, nous allons voir comment afficher un formulaire et valider les données renvoyées par l’utilisateur avant de les enregistrer.

Reprenons (pour gagner du temps) l’exemple de l’article sur datamapper. Il s’agissait de l’exemple on ne peut plus bidon d’une liste de CD avec artiste et genre musical. Donnons la possibilité à nos utilisateurs de laisser un commentaire sur un album.

Pour rappel, on avait trois tables : cds, cds_artistes, cds_styles. Nous allons rajouter cds_commentaires. Ce qui donne :

  1. --
  2. -- Structure de la table `cds`
  3. --
  4.  
  5. CREATE TABLE `cds` (
  6.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  7.   `cd_titre` VARCHAR(100) COLLATE latin1_general_ci DEFAULT NULL,
  8.   `cds_artiste_id` BIGINT(20) NOT NULL,
  9.   `cds_style_id` BIGINT(20) DEFAULT NULL,
  10.   PRIMARY KEY (`id`)
  11. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
  12.  
  13. -- --------------------------------------------------------
  14.  
  15. --
  16. -- Structure de la table `cds_artistes`
  17. --
  18.  
  19. CREATE TABLE `cds_artistes` (
  20.   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  21.   `art_nom` VARCHAR(100) NOT NULL,
  22.   PRIMARY KEY (`id`)
  23. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  24.  
  25. -- --------------------------------------------------------
  26.  
  27. --
  28. -- Structure de la table `cds_commentaires`
  29. --
  30.  
  31. CREATE TABLE `cds_commentaires` (
  32.   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  33.   `cds_id` BIGINT(20) NOT NULL,
  34.   `com_email` VARCHAR(50) NOT NULL,
  35.   `com_texte` VARCHAR(500) NOT NULL,
  36.   PRIMARY KEY (`id`)
  37. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Commentaires sur les albums';
  38.  
  39. -- --------------------------------------------------------
  40.  
  41. --
  42. -- Structure de la table `cds_styles`
  43. --
  44.  
  45. CREATE TABLE `cds_styles` (
  46.   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  47.   `stl_libelle` VARCHAR(50) NOT NULL,
  48.   PRIMARY KEY (`id`)
  49. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Télécharger

Voici les modèles qui vont avec :
cd.php :

  1. <?php
  2. class cd extends DataMapper{
  3.         var $has_one = array('cds_style', 'cds_artiste');
  4.         var $has_many = array('cds_commentaire');
  5. }

Télécharger

cds_style.php

  1. <?php
  2. class cds_style extends DataMapper{
  3.         var $has_many = array("cd");
  4. }

Télécharger

cds_artiste.php

  1. <?php
  2. class cds_artiste extends DataMapper{
  3.         var $has_many = array("cd");
  4. }

Télécharger

cds_commentaire.php

  1. <?php
  2. class cds_commentaire extends DataMapper{
  3.         var $has_one = array("cd");
  4. }

Télécharger

Créons un formulaire dans une vue toute bête :

  1. <form name='formCommentaire' id='formCommentaire'>
  2. <table>
  3.         <tr>
  4.                 <td>Album
  5.                 </td>
  6.                 <td>
  7.                         <select name='album' id='album'>
  8.                                 <?php foreach($listeAlbums as $album): ?>
  9.                                         <option value="<?php echo $album->id ?>"><?php echo $album->cd_titre; ?></option>
  10.                                 <?php endforeach; ?>
  11.                         </select>
  12.                 </td>
  13.         </tr><tr>
  14.                 <td>Votre email</td>
  15.                 <td><input type="text" id="email" name="email" value="<?php echo $_POST['email']; ?>" />
  16.         </tr><tr>
  17.                 <td>Commentaire</td>
  18.                 <td><textarea id="commentaire" name="commentaire"><?php echo $_POST['commentaire']; ?></textarea>
  19.         </tr>
  20. </table>
  21. </form>

Télécharger

Nous avons accumulé des erreurs sur cette page :
Pas de vérification des valeurs de $_POST.

Créons notre contrôleur et voyons ce qui se passe :

  1. <?php
  2. class Commentaires extends MY_Controller{
  3.         function __construct(){
  4.                 parent::__construct();
  5.         }
  6.        
  7.         function index(){
  8.                 $this->formulaire();
  9.         }
  10.        
  11.         function formulaire(){
  12.                 $this->load->database('pangolin');
  13.                 $this->load->spark('DataMapper-ORM/1.8.1');
  14.                 $cd = new cd;
  15.                 $cd->get();
  16.                 $tDonnees['listeAlbums'] = $cd;
  17.                 $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
  18.         }
  19. }

Télécharger

Résultat affiché :

Album

Votre email

A PHP Error was encountered

Severity : Notice

Message : Undefined index : email

Filename : gestionCD/formulaireCommentaire.php

Line Number : 15

" />

Commentaire

C’est vraiment pas beau...

Déjà, nous allons supprimer les erreurs dues aux posts inexistant en chargeant le helper « form » pour utiliser la méthode « set value » :
Contrôleur :

  1.         function formulaire(){
  2.                 $this->load->database('pangolin');
  3.                 $this->load->spark('DataMapper-ORM/1.8.1');
  4.                 $cd = new cd;
  5.                 $cd->get();
  6.                 $tDonnees['listeAlbums'] = $cd;
  7.                
  8.                 $this->load->helper('form');
  9.                 $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
  10.         }

Télécharger

Formulaire :

  1. <form name='formCommentaire' id='formCommentaire'>
  2. <table>
  3.         <tr>
  4.                 <td>Album
  5.                 </td>
  6.                 <td>
  7.                         <select name='album' id='album'>
  8.                                 <?php foreach($listeAlbums as $album): ?>
  9.                                         <option value="<?php echo $album->id ?>"><?php echo $album->cd_titre; ?></option>
  10.                                 <?php endforeach; ?>
  11.                         </select>
  12.                 </td>
  13.         </tr><tr>
  14.                 <td>Votre email</td>
  15.                 <td><input type="text" id="email" name="email" value="<?php echo set_value('email'); ?>" />
  16.         </tr><tr>
  17.                 <td>Commentaire</td>
  18.                 <td><textarea id="commentaire" name="commentaire"><?php echo set_value('commentaire'); ?> </textarea>
  19.         </tr>
  20. </table>
  21. </form>

Télécharger

Pendant que nous sommes dans le helper form, générons notre formulaire grâce à lui.
Dans le contrôleur, nous allons définir les propriétés des composants du formulaire :

  1.         function formulaire(){
  2.                 $this->load->database('pangolin');
  3.                 $this->load->spark('DataMapper-ORM/1.8.1');
  4.                 $cd = new cd;
  5.                 $cd->get();
  6.                 $tDonnees['listeAlbums'] = array();
  7.                 foreach($cd as $monCD){
  8.                         $tDonnees['albums'][$monCD->id] = $monCD->cd_titre;
  9.                 }
  10.                
  11.                 $this->load->helper('form');
  12.                 $tDonnees['formulaire'] = array('form' => array('id' => 'formCommentaire',
  13.                                                                                                                 'name' => 'formCommentaire'),
  14.                                                                                 'email' => array('id' => "email",
  15.                                                                                                                  'name' => 'email',
  16.                                                                                                                  'value' => set_value('email'),
  17.                                                                                                                  'label' => 'Entrez votre email :'),
  18.                                                                                 'commentaire' => array('id' => "commentaire",
  19.                                                                                                                  'name' => 'commentaire',
  20.                                                                                                                  'value' => set_value('commentaire'),
  21.                                                                                                                  'label' => 'Saisissez votre commentaire :'),
  22.                                                                                 'listeAlbums' => array('id' => "album",
  23.                                                                                                                  'name' => 'album',
  24.                                                                                                                  'value' => set_value('album'),
  25.                                                                                                                  'label' => 'Choisissez un album :'),
  26.                                                                                 'valider' => array('id' => "valider",
  27.                                                                                                                  'name' => 'valider',
  28.                                                                                                                  'value' => 'Enregistrer le commentaire',),
  29.                 );
  30.                
  31.                 $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
  32.         }

Télécharger

Et dans la vue, nous allons générer les composants du formulaire :

  1. <?php echo form_open('', $formulaire['form']);?>
  2. <table>
  3.         <tr>
  4.                 <td><?php echo form_label($formulaire['listeAlbums']['label'], $formulaire['listeAlbums']['id']); ?></td>
  5.                 <td><?php echo form_dropdown($formulaire['listeAlbums']['name'], $albums, $formulaire['listeAlbums']['value']); ?></td>
  6.         </tr>
  7.         <tr>
  8.                 <td><?php echo form_label($formulaire['email']['label'], $formulaire['email']['id']); ?></td>
  9.                 <td><?php echo form_input($formulaire['email']); ?></td>
  10.         </tr>
  11.         <tr>
  12.                 <td><?php echo form_label($formulaire['commentaire']['label'], $formulaire['commentaire']['id']); ?></td>
  13.                 <td><?php echo form_textarea($formulaire['commentaire']); ?></td>
  14.         </tr>
  15.         <tr>
  16.                 <td></td>
  17.                 <td>
  18.                         <?php echo form_submit($formulaire['valider']); ?>
  19.                 </td>
  20.         </tr>
  21. </table>
  22. <?php echo form_close(); ?>

Télécharger

Ca ne change pas grand chose si ce n’est que tous les paramètres sont dans le contrôleur, ce qui facilite la maintenance et l’évolution de l’appli.

Passons maintenant à la validation du formulaire avec la librairie « form_validation ».
Tout d’abord, il faut définir les règles de validation :

  1.                 $this->load->helper('form_validation');
  2.                 $this->form_validation->set_rules('email', 'Email', 'required');
  3.                 $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required');

Télécharger

Avec ces simples règles, nous avons rendu nos champs email et commentaire obligatoires.
Il faut maintenant appliquer ces règles aux données postées :

  1. $this->form_validation->run()

Le code complet donne :

  1.                 $this->load->library('form_validation');
  2.                 $this->form_validation->set_rules('email', 'Email', 'required');
  3.                 $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required');
  4.                
  5.                 if($this->form_validation->run() === false){
  6.                         echo validation_errors();
  7.                 }else{
  8.                         echo "Données OK";
  9.                 }
  10.                 $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);

Télécharger

Vous verrez s’afficher de pas très beaux messages d’erreur si vous postez des données erronées.
Pour la liste des règles possibles, je vous laisse consulter la documentation très bien faite de codeIgniter.
Pour appliquer plusieurs règles à un élément, il suffit de les séparer par des « pipes » (|). Si nous voulons limiter la longueur des données et vérifier la validité du mail, il suffit de modifier le code de la façon suivante :

  1.                 $this->form_validation->set_rules('email', 'Email', 'required|max_length[50]|valid_email');
  2.                 $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required|max_length[500]');

Télécharger

Il est également possible de traiter les données avant validation. Il suffit, comme pour choisir les règles de validation, de passer le nom du traitement à effectuer à la méthode « set_rules ». Si nous voulons supprimer les blanc en dbut et en fin de chaîne avec la méthode trim, le code devient :

  1.                 $this->form_validation->set_rules('email', 'Email', 'trim|required|max_length[50]|valid_email');
  2.                 $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'trim|required|max_length[500]');

Télécharger

Ici, on voit mieux l’intérêt de superposer la définition des composants du formulaire et les règles de validation : il sera facile de définir la même longueur pour un champ dans son contrôle et sa validation :

  1.                 define('MAX_LENGTH_EMAIL', 50);
  2.                 define('MAX_LENGTH_COMMENTAIRE', 500);
  3.                 $tDonnees['formulaire'] = array('form' => array('id' => 'formCommentaire',
  4.                                                                                                                 'name' => 'formCommentaire'),
  5.                                                                                 'email' => array('id' => "email",
  6.                                                                                                                  'name' => 'email',
  7.                                                                                                                  'value' => set_value('email'),
  8.                                                                                                                  'label' => 'Entrez votre email :',
  9.                                                                                                                  'maxlength'=> MAX_LENGTH_EMAIL),
  10.                                                                                 'commentaire' => array('id' => "commentaire",
  11.                                                                                                                  'name' => 'commentaire',
  12.                                                                                                                  'value' => set_value('commentaire'),
  13.                                                                                                                  'label' => 'Saisissez votre commentaire :'),
  14.                                                                                 'listeAlbums' => array('id' => "album",
  15.                                                                                                                  'name' => 'album',
  16.                                                                                                                  'value' => set_value('album'),
  17.                                                                                                                  'label' => 'Choisissez un album :'),
  18.                                                                                 'valider' => array('id' => "valider",
  19.                                                                                                                  'name' => 'valider',
  20.                                                                                                                  'value' => 'Enregistrer le commentaire',),
  21.                 );
  22.                
  23.                 $this->load->library('form_validation');
  24.                 $this->form_validation->set_rules('email', 'Email', 'trim|required|max_length['.MAX_LENGTH_EMAIL.']|valid_email');
  25.                 $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'trim|required|max_length['.MAX_LENGTH_COMMENTAIRE.']');

Télécharger

Il ne vous reste plus qu’à insérer vos données en base.

Messages

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.