Kohana: un exemple de contrôleur pour un formulaire (validation, ORM)
mar
31
0
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
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(); } } } } |
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> |