Les formulaires CVT de SPIP Formulaires de SPIP par l’exemple

, par Matthieu Marcillaud

Introduction

Les formulaires de SPIP 2.0 sont maintenant découpés en 4 parties :

  • le HTML qui gère l’affichage graphique du formulaire,
  • la fonction charger() insère les valeurs préremplies,
  • la fonction verifier() contrôle les données soumises,
  • la fonction traiter() exécute les actions.

La partie HTML du formulaire est écrite dans le fichier formulaires/{nom}.html. Les 3 fonctions PHP dans le fichier formulaires/{nom}.php et s’appellent précisément :

  • formulaires_{nom}_charger_dist(),
  • formulaires_{nom}_verifier_dist(),
  • formulaires_{nom}_traiter_dist().

Le formulaire s’appelle dans un squelette SPIP par la balise #FORMULAIRE_{NOM}, par exemple #FORMULAIRE_PIPOTIN

Projet exemple : traduire via google

Nous avons besoin d’un formulaire disposant d’un champ texte, dont le contenu sera traduit en anglais en utilisant l’API de Google Translate au moment de la soumission.

HTML

La partie HTML ressemble à çà :

  1. <div class="formulaire_spip formulaire_pipotin">
  2.  
  3. [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
  4. [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
  5.  
  6. <form action="#ENV{action}" method="post"><div>
  7. #ACTION_FORMULAIRE{#ENV{action}}
  8. <ul>
  9. #SET{erreurs,#ENV**{erreurs}|table_valeur{traduire}}
  10. <li class="editer_traduire obligatoire[ (#GET{erreurs}|oui)erreur]">
  11. <label for="traduire">Traduire</label>
  12. [<span class='erreur_message'>(#GET{erreurs})</span>]
  13. <textarea name='traduire' id='champ_traduire'>#ENV{traduire}</textarea>
  14. </li>
  15. [
  16. #SET{erreurs,#ENV**{erreurs}|table_valeur{traduction}}
  17. <li class="editer_traduction[ (#GET{erreurs}|oui)erreur]">
  18. <label for="traduction">Traduction</label>
  19. [<span class='erreur_message'>(#GET{erreurs})</span>]
  20. <textarea name='traduction' id='champ_traduction'>(#ENV{traduction})</textarea>
  21. </li>
  22. ]
  23. </ul>
  24. <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p>
  25. </div></form>
  26. </div>

Télécharger

Analysons le code pour comprendre. Il y a plusieurs éléments. D’une part le code est encadré dans une balise <div> ayant une classe CSS générale « formulaire_spip » et une spécifique « formulaire_XX » :

  1. <div class="formulaire_spip formulaire_pipotin">
  2. </div>

Télécharger

Dedans, deux lignes servent à afficher les messages de réussite ou d’erreur :

  1. [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
  2. [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]

Télécharger

Les variables d’environnement « message_erreur » et « message_ok » sont envoyées au squelette via les retour des fonctions PHP…

Ensuite, la description du formulaire ajoute grâce à la balise #ACTION_FORMULAIRE des informations utiles à SPIP pour le traitement du formulaire.

  1. <form action="#ENV{action}" method="post"><div>
  2. #ACTION_FORMULAIRE{#ENV{action}}
  3. </div></form>

Télécharger

L’URL de soumission est calculée par SPIP et envoyée par la variable « action » à l’environnement du squelette.

Se trouve ensuite les champs du formulaire, structurés dans un chainage UL / LI. Ils affichent éventuellement des messages d’erreurs.

Les champs sont insérés avec des classes CSS particulières si le champ est obligatoire ou en erreur.

  1. #SET{erreurs,#ENV**{erreurs}|table_valeur{traduire}}
  2. <li class="editer_traduire obligatoire[ (#GET{erreurs}|oui)erreur]">
  3. <label for="traduire">Traduire</label>
  4. [<span class='erreur_message'>(#GET{erreurs})</span>]
  5. <textarea name='traduire' id='champ_traduire'>#ENV{traduire}</textarea>
  6. </li>

Télécharger

Pour terminer sur la partie HTML, signalons que la version 1.12 de CFG, à titre expérimental, propose une balise #SAISIE simplifiant l’écriture d’appel des champs de formulaire. Avec, cela donne l’écriture suivante :

  1. [(#SAISIE{textarea,traduire,oui}{label=Traduire})]

Soit au complet, le formulaire HTML donnerait :

  1. <div class="formulaire_spip formulaire_pipotin">
  2.  
  3. [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
  4. [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
  5.  
  6. <form action="#ENV{action}" method="post"><div>
  7. #ACTION_FORMULAIRE{#ENV{action}}
  8. <ul>
  9. [(#SAISIE{textarea,traduire,oui}{label=Traduire})]
  10.  
  11. [(#ENV{traduction}|oui)
  12. [(#SAISIE{textarea,traduction}{label=Traduction})]
  13. ]
  14. </ul>
  15. <p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p>
  16. </div></form>
  17. </div>

Télécharger

Charger

La fonction PHP charger() permet d’envoyer à l’environnement du squelette de formulaire des valeurs par défaut. La fonction retourne un tableau PHP correspondant au contexte de compilation. Mais, si les nom des clés du tableau correspondent à des variables qui ont déjà été soumises (par soumission du formulaire ou via l’URL), alors ce sont ces valeurs que le squelette utilisera pour son contexte.

Pour notre formulaire, nous allons avoir besoin de 2 paramètres, l’un pour recevoir le texte à traduire, l’autre pour retourner le contenu de la traduction.

  1. function formulaires_pipotin_charger_dist() {
  2. $contexte = array(
  3. 'traduire' => '',
  4. 'traduction' => '',
  5. );
  6. return $contexte;
  7. }

Télécharger

Ici, par défaut les deux paramètres sont laissés vides. Lorsque l’on soumet le formulaire (si l’on a rempli le champ "traduire" dans celui-ci) - et que la fonction vérifier ou traiter indique qu’il faut réafficher la saisie, la gestion de CVT fait que le texte soumis dans le champ "traduire" sera réintroduit automatiquement dans le contexte au chargement du formulaire. On ne perd donc pas les données saisies si une erreur apparaît.

Paramètres d’un formulaire

Il est possible d’envoyer des paramètres lors de l’appel du formulaire dans les squelettes, par exemple :

  1. [(#FORMULAIRE_NOM{parametreA, parametreB})]

Ces deux paramètres sont alors récupérables en tant que paramètres des fonctions Charger, Vérifier et Traiter :

  1. formulaires_nom_charger_dist($parametreA, $parametreB) {
  2. ...
  3. }

Télécharger

Vérifier

Elle sert à tester les saisies des utilisateurs et à retourner éventuellement des messages d’erreur en cas de problèmes, qui peuvent être spécifiques à un champ de saisie. Pour notre exemple, on peut proposer :

  1. function formulaires_pipotine_verifier_dist() {
  2. $erreurs = array();
  3. if (!_request('traduire')) {
  4. $erreurs['message_erreur'] = "Vous avez oublié d'écrire ! Votre clavier est cassé ?";
  5. $erreurs['traduire'] = "C'est là dedans qu'on écrit son texte !";
  6. }
  7. return $erreurs;
  8. }

Télécharger

La fonction vérifier est assez simple : elle retourne un tableau PHP vide s’il n’y a pas d’erreur, un tableau non vide s’il y a une erreur quelconque.

Traiter

C’est la fonction qui s’occupe de tout les traitements que doit exécuter le formulaire lorsque les vérifications sont valides.

Cette fonction retourne un tableau PHP qui peut contenir entre autre les clés "message_ok", "message_erreur", "editable" (si le formulaire doit ou non être réaffiché après le traitement).

Ici, nous devons interroger une page distante de Google et récupérer son résultat. On utilise l’API de SPIP pour cela (recuperer_page) et la fonction de PHP 5.2 pour analyser le JSON (tableau javascript) récupéré.

En cas d’erreur, on le signale ; en cas de réussite, on force l’insertion du texte récupéré dans le prochain chargement du formulaire, avec la fonction de SPIP « set_request() »

  1. // http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello%20world&langpair=en%7Cit
  2. define('URL_GOOGLE_TRANSLATE', "http://ajax.googleapis.com/ajax/services/language/translate");
  3.  
  4. function formulaires_pipotin_traiter_dist() {
  5.  
  6. // creer l'url selon l'api google
  7. $texte = _request('traduire');
  8. $url = parametre_url(URL_GOOGLE_TRANSLATE,'v',"1.0",'&');
  9. $url = parametre_url($url,'langpair','fr|en','&');
  10. $url = parametre_url($url,'q',$texte,'&');
  11.  
  12. // chargement du texte traduit par google (retour : json)
  13. include_spip('inc/distant');
  14. $trad = recuperer_page($url);
  15.  
  16. // attention : php 5.2
  17. $trad = json_decode($trad, true); // true = retour array et non classe
  18.  
  19. // recuperation du resultat si OK
  20. if ($trad['responseStatus'] != 200) {
  21. return array(
  22. "editable" => true,
  23. "message_erreur" => "Pas de chance, faux retour de l'ami Google !"
  24. );
  25. }
  26.  
  27. // envoi au charger
  28. set_request('traduction', $trad['responseData']['translatedText']);
  29.  
  30. // message
  31. return array(
  32. "editable" => true,
  33. "message_ok" => "Et voilà la traduction !",
  34. );
  35. }

Télécharger

Coup de pouce

Pour me maintenir en éveil et en pleine forme physique et mentale, vous pouvez me faire le cadeau d'un jus de fruit pressé.

En plus de m'hydrater, de m'offrir une alimentation saine crudivore et frugivore, cela peut aussi me motiver à produire d'autres documentations ou peut-être à prendre des vacances ! :)

Vous pouvez également me « Flattrer » si vous utilisez le service en ligne très malin Flattr de microdonations qui permet d'allouer un budget mensuel à des créateurs de contenu. Votre budget est partagé chaque mois entre toutes les personnes que vous avez flattées ce mois là.