Programmation PHP/Les cadriciels/CakePHP/Formulaire

Un livre de Wikilivres.



Notre première application sera un simple formulaire d'enregistrement d'un nouvel utilisateur. Les données sont stockées dans une table SQL. Elle contiendra le nom, le prénom, l'identifiant, l'adresse email.

La table utilisateurs[modifier | modifier le wikicode]

Le numéro 'id' sera la clé primaire et l'identifiant ainsi que l'email seront uniques.

Pour MySQL :

CREATE TABLE 'utilisateurs' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'identifiant' VARCHAR( 40 ) NOT NULL ,
'motdepasse' VARCHAR( 40 ) NOT NULL ,
'email' VARCHAR( 255 ) NOT NULL ,
'prenom' VARCHAR( 40 ) NOT NULL ,
'nom' VARCHAR( 40 ) NOT NULL ,
'derniere_connexion' VARCHAR( 24 ) NOT NULL ,
PRIMARY KEY ('id'),
UNIQUE KEY 'identifiant' ('identifiant'),
UNIQUE KEY 'email' ('email')
)

Pour PostgreSQL :

CREATE TABLE utilisateurs
(
  id serial NOT NULL,
  identifiant character varying(40) NOT NULL,
  motdepasse character varying(40) NOT NULL,
  email character varying(255) NOT NULL,
  prenom character varying(40) NOT NULL,
  nom character varying(40) NOT NULL,
  derniere_connexion character varying(24),
  CONSTRAINT utilisateurs_pkey PRIMARY KEY (id),
  CONSTRAINT utilisateurs_email_key UNIQUE (email),
  CONSTRAINT utilisateurs_identifiant_key UNIQUE (identifiant)
)

Le modèle[modifier | modifier le wikicode]

La table créée, nous devons créer un modèle pour interagir avec. Notre modèle utilisateur lira, insèrera et validera les données de la table mais pour l'instant c'est une ébauche.

<?php
class Utilisateur extends AppModel {
	var $name = 'Utilisateur';
}
?>

Enregistrez ce listing dans app/models/utilisateur.php

La vue[modifier | modifier le wikicode]

La vue enregistrer est notre formulaire d'enregistrement de nouveau compte utilisateur.

<?php echo $html->formTag('/utilisateurs/enregistrer') ?>
<p>Complétez le formulaire pour enregistrer votre compte.</p>
<label>Identifiant :</label><input name="identifiant" size="40" />

<label>Mot de passe :</label><input type="password" name="motdepasse" size="40" />

<label>Adresse email :</label><input name="email" size="40" maxlength="255" />

<label>Prénom :</label><input name="prenom" size="40" />

<label>Nom :</label><input name="nom" size="40" />

<input type="submit" value="enregistrer" />
</form>

Enregistrez ce listing dans app/views/users/enregistrer.thtml

Le contrôleur[modifier | modifier le wikicode]

Notre contrôleur va contenir les actions associées à notre modèle Utilisateur. Une action correspond à une fonction, notre première action sera d'enregistrer les données.

Un contrôleur CakePHP hérite d'AppController.

<?php
class UtilisateursController extends AppController
{
	function enregistrer()
	{
         //....
	}
}
?>

L'action enregistrer va devoir vérifier si le formulaire a bien été soumis. Ensuite notre action va sauvegarder ($this->Utilisateur->save($this->params['form']) les données du formulaire (le tableau $this->params['form']) dans la table en utilisant les clés du tableau comme nom de colonne et les valeurs comme une requête SQL d'insertion.

La table SQL doit se nommer d'après le nom de notre modèle (Utilisateur) au pluriel (table utilisateurs).

class UtilisateursController extends AppController
{
	function enregistrer()
	{
		if (!empty($this->params['form']))
		{
			if ($this->Utilisateur->save($this->params['form']))
			{
				$this->flash('Enregistrement accepté.', '/utilisateur/enregistrer');
				
			} else {
				$this->flash('Problème avec votre enregistrement', '/utilisateur/enregistrer');
			}
		}
	}
}

Enregistrez ce listing dans app/controllers/utilisateurs_controller.php.

La methode Flash permet d'alerter l'utilisateur avec un message puis de renvoyer (2e paramètre) ici vers la vue du formulaire d'enregistrement.

Essais[modifier | modifier le wikicode]

Le formulaire

Il est temps d'observer le résultat, téléchargez les fichiers sur votre serveur puis allez à l'adresse :

http://votre_serveur/utilisateurs/enregistrer

Normalement, votre enregistrement doit être accepté.

Votre table utilisateurs doit contenir :

cake_monapp=# select * from utilisateurs;
 id | identifiant | motdepasse |          email          | prenom |    nom    | derniere_connexion
----+-------------+------------+-------------------------+--------+-----------+--------------------
  1 | Trygver     | mvc        | trygver@serveur.no      | Trygve | Reenskaug |

Réessayer d'enregistrer les mêmes informations, vous obtiendrez un message d'erreur :

SQL Error: ERROR: duplicate key violates unique constraint "utilisateurs_identifiant_key"

Ceci est dû au fait que la colonne identifiant a été définie avec comme contrainte d'être unique en langage SQL. Avec des données différentes l'enregistrement est accepté.

Conclusion[modifier | modifier le wikicode]

Dans ce premier exemple, nous avons juste défini une page formulaire simple (notre vue) et sa représentation dans la base de données. Notre traitement (le contrôleur) se limitant juste à vérifier que le formulaire a bien été saisi, tout le reste a été géré automatiquement. L’utilisation d’un cadriciel permet de ne pas avoir à tout réinventer afin d’éviter les erreurs et bugs courants de conception.