Kohana: un exemple de contrôleur pour un formulaire (validation, ORM)

Geert, un membre très actif du projet Kohana a posté sur le forum un exemple de contrôleur et de vue permettant de créer un formulaire avec:

  • Pré remplissage des champs avec des valeurs
  • Validation des données
  • Ré-affichage du formulaire avec les données entrées si la validation échoue
  • Insertion en base en ORM si la validation est un succès

Le code du contrôleur peut être trouvé ici http://pastie.textmate.org/172793 ou ci-dessous avec les explication en francais:

Le contrôleur

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php defined('SYSPATH') or die('No direct script access.');
 
/*
 
Voici la structure de la base utilisée
 
CREATE TABLE `jobs` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `company` varchar(100) collate utf8_unicode_ci NOT NULL default '',
  `location` varchar(100) collate utf8_unicode_ci NOT NULL default '',
  `email` varchar(100) collate utf8_unicode_ci NOT NULL default '',
  `description` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
 
*/
 
class Post_Controller extends Website_Controller {
 
  // URL: /post[/index]
  public function index()
  {
    $this->template->pagetitle = 'Create a new job listing';
    $this->template->content = new View('content/post');
 
    // Initialisation des champs du formulaire aux valeurs par défaut
    $form = array
    (
      'company'  => '',
      'location'  => '',
      'email'    => '',
      'description'  => '',
    );
 
    // Le formulaire n'est pas envoyé alors on passe l'objet $form contenant les valeurs par défaut
    if ( ! $_POST)
    {
      // Intialize (empty) form fields in view
      $this->template->content->set('job', (object) $form);
    }
 
    // Le formulaire est envoyé
    else
    {
      // Les règles de validation
      // pre_filter('trim') permet d'enlever les espaces de toutes les données du formulaire avant de les valider
      // les autres lignes définissent les règles suivant les champs
      $post = Validation::factory($_POST)
        ->pre_filter('trim')
        ->add_rules('company', 'required', 'length[1,100]')
        ->add_rules('location', 'required', 'length[1,100]')
        ->add_rules('email', 'required', 'email', 'length[1,100]')
        ->add_rules('description', 'required', 'length[1,5000]');
 
      // Lance la validation (filtres et règles)
      $validate = $post->validate();
 
      // Ecrase les valeurs par défaut avec les valeurs envoyées dans le formulaire
      $form = arr::overwrite($form, $post->as_array());
 
      // Si il y a des erreurs
      if ( ! $validate)
      {
        // On passe à la vue le tableau des erreurs $post->errors()
        $this->template->content->formerrors = $post->errors();
 
        // On re remplit le formulaire
        $this->template->content->set('job', (object) $form);
      }
 
      // Aucune erreurs
      else
      {
        // On charge le modèle ORM job
        $this->job = new Job_Model;
 
        // On charge les valeurs du formulaire dans l'ORM
        foreach ($form as $field => $value)
        {
          $this->job->$field = $value;
        }
 
        // On sauvegarde l'entrée job
        $this->job->save();
 
        // On envoi un email de confirmation
        email::send(/*...*/);
 
        // Et enfin on redirige vers la page d'accueil et on met en session un message explicatif
        $this->session->set_flash('flash', 'Check mail for confirmation link.');
        url::redirect();
      }
    }
  }
}

Un exemple de vue

Le code de la vue peut être trouvé ici http://pastie.textmate.org/172829 ou ci-dessous:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<h1>Create a new job listing</h1>
 
<form id="jobform" action="<?php echo url::site(url::current()) ?>#formerrors" method="post">
 
  <?php include Kohana::find_file('views', 'elements/formerrors') ?>
 
  <p class="clearfix <?php if (isset($formerrors['company'])) echo 'error' ?>">
    <label for="company">Company name</label>
    <input id="company" name="company" type="text" value="<?php echo html::specialchars($job->company) ?>" maxlength="100" size="30" />
  </p>
 
  <p class="clearfix <?php if (isset($formerrors['location'])) echo 'error' ?>">
    <label for="location">Location</label>
    <input id="location" name="location" type="text" value="<?php echo html::specialchars($job->location) ?>" maxlength="100" size="30" />
  </p>
 
  <p class="clearfix <?php if (isset($formerrors['email'])) echo 'error' ?>">
    <label for="email">E-mail</label>
    <input id="email" name="email" type="text" value="<?php echo html::specialchars($job->email) ?>" maxlength="100" size="30" />
  </p>
 
  <p class="clearfix <?php if (isset($formerrors['description'])) echo 'error' ?>">
    <label for="description">Description</label>
    <textarea id="description" name="description" cols="50" rows="10"><?php echo html::specialchars($job->description) ?></textarea>
  </p>
 
  <p>
    <input class="main" type="submit" value="<?php echo ($new) ? 'Post' : 'Edit' ?>" />
    or <input name="preview" type="submit" value="Preview" />
  </p>
 
</form>

A lire également

Filed under: Kohana, PHP
Tags: , , , , ,

Leave a Reply