à valider par la communauté. Ne pas utiliser ces exemples en production tant que ce message est présent.
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 :
Dans cet enchainement, je ne suis pas content :
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
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>
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
Le formulaire sera affiché par l'action “editer” via le template suivant
{formfull $form, 'formulaire:sauver'}
/** * 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; }
/** * 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 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; } }
/** * 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 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; }