Piste : • enchainement_actions
Table des matières
Enchainement des actions pour mettre en place un formulaire jForms ¶
à valider par la communauté. Ne pas utiliser ces exemples en production tant que ce message est présent.
Introduction ¶
Ce tutoriel propose un exemple simple d'enchainements d'actions pour mettre en place un formulaire de création et d'édition de données liées à un dao, comme décrit dans la documentation : http://docs.jelix.org/fr/manuel-1.2/jforms/utilisation
Les actions suivantes sont mises en place :
- creer : Création d'un formulaire pour créer un nouvel item, redirection vers l'action d'affichage du formulaire
- modifier : Création d'un formulaire pour modifier un item existant. Si item non existant dans la base de données, redirection vers une page d'erreur, sinon redirection vers l'action d'affichage du formulaire
- editer : Affichage du formulaire de création ou de modification de l'item. Si c'est un formulaire de modification de données, et que l'identifiant n'est pas valide, on redirige vers une page d'erreur.
- sauver : Contrôle du token du formulaire. Contrôle des données. Si des erreurs sont détectées, redirection vers l'action “editer”, sinon redirection vers l'action “valider”.
- valider : Destruction du formulaire jForms, Bilan de l'enregistrement.
Dans cet enchainement, je ne suis pas content :
- de la vérification du token : à ajouter
- de la suppression du formulaire dans l'action valider : est-ce ok ?
- du contrôle des données du formulaire. J'ai montré un exemple très simple de validation d'un champ du formulaire, mais pas d'un contrôle via des filtres php ( http://www.php.net/manual/fr/filter.filters.php )
Pré-requis ¶
DAO ¶
Pour pouvoir récupérer et enregistrer les informations à partir d'un formulaire, nous allons ici utiliser une table “personne” qui contient quelques champs classiques
<?xml version="1.0" encoding="UTF-8"?> <dao xmlns="http://jelix.org/ns/dao/1.0"> <datasources> <primarytable name="personne" realname="personne" primarykey="id_u" /> </datasources> <record> <property name="id_u" fieldname="id_u" datatype="int" autoincrement="true" default=""/> <property name="u_nom" fieldname="u_nom" datatype="text"/> <property name="p_prenom" fieldname="p_prenom" datatype="text"/> <property name="p_tel1" fieldname="p_tel1" datatype="text"/> <property name="p_tel2" fieldname="p_tel2" datatype="text"/> <property name="p_email" fieldname="p_email" datatype="text"/> <!--<property name="" fieldname="" datatype="string/int/float/date" required="yes" maxlength="" minlength="" regexp="" sequence="" updatepattern="" insertpattern="" selectpattern=""/>--> </record> <factory> <!--<method name="findByStage" type="select/selectfirst/delete/update/php"> <parameter name="" /> <values> <value property="" value="" /> </values> <conditions logic="and/or"> <eq property="" value="" /> </conditions> <order> <orderitem property="" way="asc/desc" /> </order> <limit offset="" count=""/> <body><![CDATA[ ]]></body> </method>--> </factory> </dao>
La colonne id_u est la clé primaire de la table personne
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 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
<?xml version="1.0" encoding="utf-8"?> <form xmlns="http://jelix.org/ns/forms/1.1"> <input ref="id_form" type="integer"> <label>Id</label> </input> <input ref="u_nom" type="string"> <label>U Nom</label> </input> <input ref="p_prenom" type="string"> <label>P Prenom</label> </input> <input ref="p_tel1" type="string"> <label>P Tel1</label> </input> <input ref="p_tel2" type="string"> <label>P Tel2</label> </input> <input ref="p_email" type="email"> <label>P Email</label> </input> <submit ref="_submit"> <label>ok</label> </submit> </form>
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 = "<p>Vous avez bien enregistré le formulaire pour ".$personne->u_nom."</p>"; $content.= "<a href=".jUrl::get('formulaire:modifier', array('id_u'=>$id_u)).">Retour au formulaire</a>"; $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.