Raccourcis : Contenu - rubriques - sous rubriques
FR

Piste : enchainement_actions

Enchainement des actions pour mettre en place un formulaire jForms

FIXME à 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.

FIXME 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

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

<?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.

fr/tutoriel/jforms/enchainement_actions.txt · Dernière modification : 2012/04/14 20:57 de laurent

Fils rss des changements récents dans le wiki Creative Commons License