La colonne **id_u** est la clé primaire de la table **personne**
FIXME lien vers manuel dao
=== Fichier XMl du formulaire ===
Pour pouvoir utiliser jForms, il faut créer un fichier XMl contenant la description des champs du formulaire
FIXME lien vers manuel
Dans notre exemple, nous avons créé automatiquement le formulaire via le script jelix, puis ajouté un champ supplémentaire appelé id_form. Ce champ est ici un input classique, mais il faudra le transformer en champ hidden une fois les tests effectués et avant de mettre en production.
Voici le fichier XML
=== Contrôleur qui contiendra les actions ===
Nous pouvons maintenant créer un contrôleur dans notre module, qui contiendra l'ensemble des actions décrites en introduction et détaillées ci-dessous.
Nous pouvons nommer ce contrôleur **formulaire** . Le fichier correspondant s'appellera par exemple **formulaire.classic.php**
=== Template d'affichage du formulaire ===
Le formulaire sera affiché par l'action "editer" via le template suivant
{formfull $form, 'formulaire:sauver'}
===== Actions =====
==== Création d'un formulaire vierge : action "creer" ====
/**
* Création d'un nouvel item.
* @return Redirection vers la page d'affichage du formulaire.
*/
public function creer(){
// création et remplissage du formulaire.
$form = jForms::create('personne');
// redirection vers l'action d'affichage du formulaire
$rep= $this->getResponse("redirect");
$rep->action="formulaire:editer";
return $rep;
}
==== Création d'un formulaire de modification de données : action "modifier" ====
/**
* Modification d'un nouvel item.
* @return Redirection vers la page d'affichage du formulaire.
*/
public function modifier(){
$id_u = $this->param('id_u');
$dao_personne = jDao::get('personne');
$personne = $dao_personne->get($id_u);
if(!$personne){
// redirection vers la page d'erreur
jMessage::add("from modifier - Identifiant non valide." );
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
// création et remplissage du formulaire.
$form = jForms::create('personne', $id_u);
$form->initFromDao('personne');
$form->setData('id_form', $id_u);
// redirection vers l'action d'affichage du formulaire
$rep= $this->getResponse("redirect");
$rep->params['id_u']= $id_u;
$rep->action="formulaire:editer";
return $rep;
}
==== Affichage du formulaire : action "editer" ====
/**
* Affichage du formulaire de création/modification.
* @param integer $id_u (optionnel) Identifiant de la ligne à modifier.
* @return Affichage du formulaire.
*/
public function editer(){
$rep = $this->getResponse('html');
$rep->title = 'Formulaire personne';
// recupère les données du formulaire dont l'id est dans le paramètre id_u
$id_u = $this->param('id_u');
if(!ctype_digit($id_u)){
// on récupère le formulaire vide
$form = jForms::get('personne');
}else{
// Si la ligne existe, on doit éditer les données (si identifiant valide)
$dao_personne = jDao::get('personne');
$personne = $dao_personne->get($id_u);
if(!$personne){
// redirection vers une page d'erreur
jMessage::add("from modifier - Identifiant non valide. " );
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
$form = jForms::get('personne', $id_u);
}
if ($form) {
$form->setData('id_form', $id_u);
$tpl = new jTpl();
$tpl->assign('form', $form);
$rep->body->assign('CENTER', $tpl->fetch('form_personne'));
return $rep;
}else{
// redirection vers une page d'erreur
jMessage::add('from modifier - Formulaire non valide');
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
}
==== Contrôle et sauvegarde des données : action "sauver ====
/**
* Sauvegarde des données du formulaire.
* @return Redirection vers la page de rappel des données enregistrées ou vers l'action editer si erreurs.
*/
function sauver(){
$id_form = $this->param('id_form');
// Récupération du formulaire
if(!ctype_digit($id_form)){
$form = jForms::get('personne');
}else{
// Si la ligne existe, on doit éditer les données (si identifiant valide)
$dao_personne = jDao::get('personne');
$personne = $dao_personne->get($id_form);
if(!$personne){
// redirection vers la page d'erreur
jMessage::add("from sauver - Identifiant non valide." );
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
$form = jForms::get('personne', $id_form);
}
// token
$token = $this->param('__JFORMS_TOKEN__');
if(!$token){
// redirection vers la page d'erreur
jMessage::add('from sauver - Token du formulaire non valide');
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
//echo 'token';
}
// Si le formulaire n'est pas défini, on redirige
if(!$form){
// redirection vers la page d'accueil
jMessage::add('from sauver - Formulaire non valide');
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
// On remplit le formulaire avec les paramètres passés dans la requête
$form->initFromRequest();
// VERIFICATIONS
$ok = true;
if (!$form->check()) {
$ok = false;
}
// Vérifications personnelles
$tel2 = $this->param('p_tel2');
if($tel2 != '' and substr($tel2, 0, 2) != '06'){
$form->setErrorOn('p_tel2', "Le téléphone 2 commencer par un 06");
$ok = false;
}
if(!$ok){
// invalide : on redirige vers l'action d'affichage du formulaire
jMessage::add('from sauver - Erreurs détectées par le check et controles personnels');
$rep = $this->getResponse('redirect');
$rep->action='formulaire:editer';
$rep->params['id_u']= $id_form;
return $rep;
}
// Enregistrement des données
$primaryKey = $form->saveToDao('personne');
// Redirection vers la page de bilan
jMessage::add("Sauvegarde effectuée");
$rep= $this->getResponse("redirect");
$rep->params['id_u']= $primaryKey;
$rep->action="formulaire:valider";
return $rep;
}
==== Bilan des données enregistrées : action "valider" ====
/**
* Bilan des données si valides.
* @param integer $id_u Identifiant de la ligne créée ou modifiée.
* @return Contenu du formulaire non éditable
*/
function valider(){
$rep = $this->getResponse('html');
$rep->title = "Données enregistrées";
$id_u = $this->param('id_u');
$dao_personne = jDao::get('personne');
$personne = $dao_personne->get($id_u);
if(!$personne){
// redirection vers la page d'erreur
jMessage::add("from valider - Identifiant non valide." );
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
// Destruction du formulaire
if($form = jForms::get('personne')){
jMessage::add("from valider - formulaire de création" );
jForms::destroy('personne');
}elseif($form = jForms::get('personne', $id_u)){
jMessage::add("from valider - formulaire de modification" );
jForms::destroy('personne', $id_u);
}else{
// pas de formulaire défini : on redirige vers une page d'erreur
jMessage::add("from valider - le formulaire n'est pas défini" );
$rep= $this->getResponse("redirect");
$rep->action="default:index";
return $rep;
}
$content = "Vous avez bien enregistré le formulaire pour ".$personne->u_nom."
";
$content.= "Retour au formulaire";
$rep->body->assign('CENTER', $content);
return $rep;
}
===== Remarques =====
* Dans cet exemple, des messages sont écrits via jMessage pour tester l'enchainement. Ces messages sont bien sûr à supprimer/adapter en fonction des besoins, et une fois les tests effectués avant la mise en production.
* Lorsque des erreurs sont détectées, les actions de ce tutoriel redirigent vers l'action default:index. Bien sûr, il est possible en fonction des erreurs de rediriger vers une page d'erreur dédiée, ou bien vers l'action "creer" ou "modifier" selon les besoins.