Accueil > Programmation > PHP > CodeIgniter > Gestion des formulaire avec CodeIgniter (2.*)
Gestion des formulaire avec CodeIgniter (2.*)
mercredi 16 novembre 2011, par
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 :
- --
- -- Structure de la table `cds`
- --
- CREATE TABLE `cds` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `cd_titre` VARCHAR(100) COLLATE latin1_general_ci DEFAULT NULL,
- `cds_artiste_id` BIGINT(20) NOT NULL,
- `cds_style_id` BIGINT(20) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
- -- --------------------------------------------------------
- --
- -- Structure de la table `cds_artistes`
- --
- CREATE TABLE `cds_artistes` (
- `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
- `art_nom` VARCHAR(100) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- -- --------------------------------------------------------
- --
- -- Structure de la table `cds_commentaires`
- --
- CREATE TABLE `cds_commentaires` (
- `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
- `cds_id` BIGINT(20) NOT NULL,
- `com_email` VARCHAR(50) NOT NULL,
- `com_texte` VARCHAR(500) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Commentaires sur les albums';
- -- --------------------------------------------------------
- --
- -- Structure de la table `cds_styles`
- --
- CREATE TABLE `cds_styles` (
- `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
- `stl_libelle` VARCHAR(50) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Voici les modèles qui vont avec :
cd.php :
cds_style.php
- <?php
- class cds_style extends DataMapper{
- }
cds_artiste.php
- <?php
- class cds_artiste extends DataMapper{
- }
cds_commentaire.php
- <?php
- class cds_commentaire extends DataMapper{
- }
Créons un formulaire dans une vue toute bête :
- <form name='formCommentaire' id='formCommentaire'>
- <table>
- <tr>
- <td>Album
- </td>
- <td>
- <select name='album' id='album'>
- <?php foreach($listeAlbums as $album): ?>
- <option value="<?php echo $album->id ?>"><?php echo $album->cd_titre; ?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr><tr>
- <td>Votre email</td>
- <td><input type="text" id="email" name="email" value="<?php echo $_POST['email']; ?>" />
- </tr><tr>
- <td>Commentaire</td>
- <td><textarea id="commentaire" name="commentaire"><?php echo $_POST['commentaire']; ?></textarea>
- </tr>
- </table>
- </form>
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 :
- <?php
- class Commentaires extends MY_Controller{
- function __construct(){
- parent::__construct();
- }
- function index(){
- $this->formulaire();
- }
- function formulaire(){
- $this->load->database('pangolin');
- $this->load->spark('DataMapper-ORM/1.8.1');
- $cd = new cd;
- $cd->get();
- $tDonnees['listeAlbums'] = $cd;
- $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
- }
- }
Résultat affiché :
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 :
- function formulaire(){
- $this->load->database('pangolin');
- $this->load->spark('DataMapper-ORM/1.8.1');
- $cd = new cd;
- $cd->get();
- $tDonnees['listeAlbums'] = $cd;
- $this->load->helper('form');
- $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
- }
Formulaire :
- <form name='formCommentaire' id='formCommentaire'>
- <table>
- <tr>
- <td>Album
- </td>
- <td>
- <select name='album' id='album'>
- <?php foreach($listeAlbums as $album): ?>
- <option value="<?php echo $album->id ?>"><?php echo $album->cd_titre; ?></option>
- <?php endforeach; ?>
- </select>
- </td>
- </tr><tr>
- <td>Votre email</td>
- <td><input type="text" id="email" name="email" value="<?php echo set_value('email'); ?>" />
- </tr><tr>
- <td>Commentaire</td>
- <td><textarea id="commentaire" name="commentaire"><?php echo set_value('commentaire'); ?> </textarea>
- </tr>
- </table>
- </form>
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 :
- function formulaire(){
- $this->load->database('pangolin');
- $this->load->spark('DataMapper-ORM/1.8.1');
- $cd = new cd;
- $cd->get();
- foreach($cd as $monCD){
- $tDonnees['albums'][$monCD->id] = $monCD->cd_titre;
- }
- $this->load->helper('form');
- 'name' => 'formCommentaire'),
- 'name' => 'email',
- 'value' => set_value('email'),
- 'label' => 'Entrez votre email :'),
- 'name' => 'commentaire',
- 'value' => set_value('commentaire'),
- 'label' => 'Saisissez votre commentaire :'),
- 'name' => 'album',
- 'value' => set_value('album'),
- 'label' => 'Choisissez un album :'),
- 'name' => 'valider',
- 'value' => 'Enregistrer le commentaire',),
- );
- $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
- }
Et dans la vue, nous allons générer les composants du formulaire :
- <?php echo form_open('', $formulaire['form']);?>
- <table>
- <tr>
- <td><?php echo form_label($formulaire['listeAlbums']['label'], $formulaire['listeAlbums']['id']); ?></td>
- <td><?php echo form_dropdown($formulaire['listeAlbums']['name'], $albums, $formulaire['listeAlbums']['value']); ?></td>
- </tr>
- <tr>
- <td><?php echo form_label($formulaire['email']['label'], $formulaire['email']['id']); ?></td>
- <td><?php echo form_input($formulaire['email']); ?></td>
- </tr>
- <tr>
- <td><?php echo form_label($formulaire['commentaire']['label'], $formulaire['commentaire']['id']); ?></td>
- <td><?php echo form_textarea($formulaire['commentaire']); ?></td>
- </tr>
- <tr>
- <td></td>
- <td>
- <?php echo form_submit($formulaire['valider']); ?>
- </td>
- </tr>
- </table>
- <?php echo form_close(); ?>
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 :
- $this->load->helper('form_validation');
- $this->form_validation->set_rules('email', 'Email', 'required');
- $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required');
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 :
- $this->form_validation->run()
Le code complet donne :
- $this->load->library('form_validation');
- $this->form_validation->set_rules('email', 'Email', 'required');
- $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required');
- if($this->form_validation->run() === false){
- echo validation_errors();
- }else{
- echo "Données OK";
- }
- $this->load->view('gestionCD/formulaireCommentaire', $tDonnees);
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 :
- $this->form_validation->set_rules('email', 'Email', 'required|max_length[50]|valid_email');
- $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'required|max_length[500]');
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 :
- $this->form_validation->set_rules('email', 'Email', 'trim|required|max_length[50]|valid_email');
- $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'trim|required|max_length[500]');
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 :
- 'name' => 'formCommentaire'),
- 'name' => 'email',
- 'value' => set_value('email'),
- 'label' => 'Entrez votre email :',
- 'maxlength'=> MAX_LENGTH_EMAIL),
- 'name' => 'commentaire',
- 'value' => set_value('commentaire'),
- 'label' => 'Saisissez votre commentaire :'),
- 'name' => 'album',
- 'value' => set_value('album'),
- 'label' => 'Choisissez un album :'),
- 'name' => 'valider',
- 'value' => 'Enregistrer le commentaire',),
- );
- $this->load->library('form_validation');
- $this->form_validation->set_rules('email', 'Email', 'trim|required|max_length['.MAX_LENGTH_EMAIL.']|valid_email');
- $this->form_validation->set_rules('commentaire', 'Votre commentaire', 'trim|required|max_length['.MAX_LENGTH_COMMENTAIRE.']');
Il ne vous reste plus qu’à insérer vos données en base.
Messages
1. Gestion des formulaire avec CodeIgniter (2.*), 9 mai 2012, 18:03, par Jules
bonne idée, la réalisation est moins clair.
il y a des erreurs , présentation fouillie.
mérite d’être retravaillé..
1. Gestion des formulaire avec CodeIgniter (2.*), 27 octobre 2012, 08:19, par cenajti
même avis !mais merci pour l’idée !
2. Gestion des formulaire avec CodeIgniter (2.*), 28 août 2018, 09:06, par STAMPER
je suis entrain de chercher à comprendre le code igniter