Table des matières

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 :

FIXME Dans cet enchainement, je ne suis pas content :

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