SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 285 visiteurs en ce moment

Accueil > Outils pour plugins > Saisies > Un formulaire C.V.T avec Saisies par l’exemple

Un formulaire C.V.T avec Saisies par l’exemple

14 mars 2011 – par stefdn – 18 commentaires

14 votes

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Réalisation d’un formulaire SPIP type CVT avec le plugin Saisies

Pré-requis :

Réalisé avec SPIP 2.1.2 et les plugins suivants :

  • Saisies : Version : 1.8.12 [42956]
  • Bonux : Version : 2.2.14 [42736]
  • Verifier : Version : 0.1.6 [42959]
  • Yaml : Version : 1.4.1 [42112]

Avertissements

Cet article est

  • un « retour d’expérience » sur l’utilisation du plugin Saisies pour la mise en place d’un formulaire ;
  • un partage de réponses aux questions qui se sont posées à moi lors de ma découverte du plugin.

Cet article n’est pas

  • exhaustif : les descriptions qui suivent partent seulement d’un point de vue particulier (un des intérêts de Saisies étant sa pluralité d’approche en terme de développement) ;
  • une documentation développeur.

Le formulaire

Pour cet exemple, le formulaire à réaliser contient 4 champs et 1 fieldset :

  • Fieldset Le film :
    • titre,
    • année,
    • genre
  • Avis : c’est bien ?

Comme tous les formulaires C.V.T, créer un couple de fichiers HTML/PHP dans le dossier squelettes/formulaires :

  • film.html qui accueillera les balises gérées par SPIP et Saisies
  • film.php où sera paramétré le formulaire avec les fonctions C, V et T

Première étape : déclarer ces champs comme des saisies à l’aide d’un tableau PHP [1], dans film.php :

  1. $mes_saisies = array(
  2. array( // le fieldset
  3. 'saisie' => 'fieldset',
  4. 'options' => array(
  5. 'nom' => 'le_film',
  6. 'label' => 'Le film'
  7. ),
  8. 'saisies' => array( // les champs dans le fieldset
  9. array( // champ titre : ligne de texte
  10. 'saisie' => 'input',
  11. 'options' => array(
  12. 'nom' => 'titre',
  13. 'label' => 'Son titre',
  14. 'obligatoire' => 'oui'
  15. )
  16. ),
  17. array( // champ annee : 4 chiffres
  18. 'saisie' => 'input',
  19. 'options' => array(
  20. 'nom' => 'annee',
  21. 'label' => 'Année de réalisation',
  22. 'size' => 4,
  23. 'maxlength' => 4
  24. )
  25. ),
  26. array( // champ genre : liste déroulante
  27. 'saisie' => 'selection',
  28. 'options' => array(
  29. 'nom' => 'genre',
  30. 'label' => 'Son genre',
  31. 'datas' => array( // apparté : penser à ranger les choix par ordre alphabétique (ou numérique), c'est plus facile à trouver pour ceux qui utilisent le formulaire
  32. 'animation' => 'Animation',
  33. 'comedie' => 'Comédie',
  34. 'docu' => 'Documentaire',
  35. 'drame' => 'Drame',
  36. 'sf' => 'Science-fiction'
  37. )
  38. )
  39. ),
  40. )
  41. ),
  42. array( // hors fieldset : avis
  43. 'saisie' => 'oui_non',
  44. 'options' => array(
  45. 'nom' => 'c_bien',
  46. 'label' => 'C\'est bien ?'
  47. )
  48. ),
  49. )
  50. );

Télécharger

Tous les éléments de saisie du formulaire sont définis. Il reste cependant le bouton d’envoi du formulaire (submit) à créer.

Ici (et à l’heure actuelle), deux possibilités :

  1. écrire le bouton en HTML dans film.html :
    <input type="submit" value="envoyer" />
  2. créer son propre type de saisie pour cet élément

Créer son propre type de saisie

Créer un sous-répertoire saisies dans /squelettes, y placer un nouveau fichier qui prendra pour nom le type de la saisie : mon_submit.html et y écrire le code HTML/SPIP du bouton :

  1. [(#REM)
  2. Parametres :
  3. -* nom (obligatoire) : attributs name et id du bouton
  4. -* texte (optionnel) : attribut value, par défaut Envoyer
  5. -* class (optionnel) : attribut class, par défaut submit
  6.  
  7. Exemple d'appel :
  8. [(#SAISIE{mon_submit, envoyer,
  9. texte=Ok
  10. })]
  11. ][
  12. <input type="submit" name="(#ENV{nom})" class="#ENV{class, submit}" id="bouton_#ENV{nom}" value="#ENV{texte,Envoyer}" />]

Télécharger

(prendre pour exemple un des fichiers de saisie du plugin dans /plugins/saisies/saisies/)

Ajouter la déclaration du bouton à la fin du tableau $mes_saisies (l’ordre de déclaration définit l’ordre d’affichage) :

  1. 'saisie' => 'mon_submit',
  2. 'options' => array (
  3. 'nom' => 'envoyer',
  4. 'texte' => 'Ok'
  5. )
  6. )

Télécharger

Générer et Charger le formulaire

Les saisies sont prêtes, on peut les appeler avec #GENERER_SAISIES{#ENV{mes_saisies}} dans film.html

Cette balise ne produit que les éléments contenus dans le formulaire. Il reste donc un peu de travail pour terminer ce formulaire :

  1. [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
  2. [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
  3.  
  4. [(#EDITABLE|oui)
  5. <form id="film_form" name="film_form" action="#ENV{action}" method="post">
  6. #ACTION_FORMULAIRE{#ENV{action}}
  7. <ul>
  8. #GENERER_SAISIES{#ENV{mes_saisies}}
  9. </ul>
  10. </form>]

Télécharger

Maintenant, le formulaire peut être appelé avec la balise #FORMULAIRE_FILM dans un squelette ou avec le raccourci typographique <formulaire|film> à l’intérieur d’un article par exemple.

En prenant ce dernier exemple et en affichant l’article dans la partie publique, rien ne se passe ...c’est normal.

#ENV{mes_saisies} « n’existe pas » encore dans le contexte de la page affichée. Pour ce faire, il faut d’abord mettre en œuvre les fonctions C, V et T qui vont gérer toutes les variables :

  1. Charger les données de Saisies et les champs à manipuler par ces fonctions
  2. Vérifier les valeurs envoyées par le formulaire
  3. Traiter ces données vérifiées
  4. Ainsi qu’une fonction qui permettra d’envoyer à ce trio la structure des saisies (tableau $mes_saisies). Appelons-la mes_saisies_film().
  1. function mes_saisies_film() {
  2. $mes_saisies = array (
  3. ...
  4. );
  5. return $mes_saisies;
  6. }
  7.  
  8. function formulaires_film_charger_dist() {
  9. // on charge les saisies et les champs qui nécessitent un accès par les fonctions
  10. $valeurs = array(
  11. 'titre' => '',
  12. 'genre' => '',
  13. 'annee' => '',
  14. 'c_bien' => '',
  15. 'mes_saisies' => mes_saisies_film()
  16. );
  17. return $valeurs;
  18. }

Télécharger

En recalculant l’article contenant le formulaire, il doit maintenant s’afficher.

Vérifier les saisies

Le plugin Verifier entre en scène. Saisies utilise un pipeline pour s’y « brancher ». Il est toutefois nécessaire de déclarer dans la structure des saisies les vérifications souhaitées : ajouter un tableau verifier dans le tableau de la saisie à... vérifier.

Ici, le champ annee doit être un nombre (type entier) compris entre 1895 et l’année en cours + 1 (on pourrait anticiper une sortie) :

  1. $mes_saisies = array(
  2. ...
  3. 'saisie' => 'input',
  4. 'options' => array(
  5. 'nom' => 'annee',
  6. 'label' => 'Année de réalisation',
  7. 'size' => 4,
  8. 'maxlength' => 4
  9. ),
  10. 'verifier' => array(
  11. 'type' => 'entier',
  12. 'options' => array (min => 1895, max => (date('Y')+1))
  13. )
  14. ),
  15. ...
  16. );

Télécharger

Le tableau verifier peut prendre plusieurs options, selon son type
 [2]. Se reporter aux fichiers de vérification du plugin dans /plugins/verifier/verifier/.

Il suffit ensuite de compléter la fonction formulaires_film_verifier dans film.php :

  1. function formulaires_film_verifier_dist() {
  2.  
  3. // on va chercher le pipeline saisies_verifier() dans son fichier
  4. include_spip('inc/saisies');
  5.  
  6. // on charge les saisies
  7. $mes_saisies = mes_saisies_film();
  8.  
  9. // saisies_verifier retourne un tableau des erreurs s'il y en a, sinon traiter() prend le relais
  10. return saisies_verifier($mes_saisies);
  11. }

Télécharger

Traiter le formulaire

La fonction « T » dans film.php est appelée après la fonction « V », si celle-ci ne retourne pas d’erreurs.

  1. function formulaires_film_traiter_dist() {
  2. // on charge les saisies, si besoin
  3. $mes_saisies = mes_saisies_film();
  4.  
  5. // Traitement des données reçues du formulaire,
  6. // par mail par ex ou insertion dans une base
  7. ...
  8.  
  9. // S'il y a des erreurs, elles sont retournées au formulaire
  10. return array('message_erreur'=>'Le film n\'a pas été enregistré');
  11.  
  12. // Sinon, le message de confirmation est envoyé
  13. return array('message_ok'=>'Le film a été enregistré');
  14. }

Télécharger

Notes

[1Voir la documentation de Saisies

[2Les types de vérification fournies par le plugin Verifier :

  • code_postal : code postal français, composé de 5 chiffres
  • date  : date au format JJ/MM/AAAA (avec séparateurs souples : espace / - .)
  • decimal  : un entier cohérent peut être extrait de la valeur
  • email  : validité d’une adresse de courriel
  • entier  : un entier cohérent peut être extrait de la valeur
  • id_document : la valeur correspond à un id_document valide
  • regex  : une valeur suivant une expression régulière.
  • siren_siret : SIREN (9 caractères) ou SIRET (14 caractères)
  • taille  : taille minimale/maximale, pour un mot de passe par exemple
  • telephone  : numéro de téléphone. Pour l’instant seulement avec le schéma français.
  • url  : URL format web

Références des vérifications

Dernière modification de cette page le 8 septembre 2011

Retour en haut de la page

Vos commentaires

  • Le 6 octobre 2013 à 05:49, par Orinasa En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Bonjour à vous

    J’ai un soucis avec 2 champs de formulaire, checkbox et selection_multiple
    Voici la réponse à l’enregistrement :
    Warning : md5() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php on line 355

    Warning : md5() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php on line 355

    Warning : addslashes() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/req/mysql.php on line 1186

    Warning : Cannot modify header information - headers already sent by (output started at /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php:355) in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/actions.php on line 89

    Quelqu’un aurai une idée ?
    Merci

    Spip 3.0.11
    Saisies 1.35.0
    Yaml 1.5.1

    • Le 8 février 2014 à 13:58, par Spipmalion En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

      As-tu trouvé la réponse à ta question ? J’ai le même problème avec selecteur_article et la Fabrique

    • Le 21 mars 2014 à 21:34, par Sylv En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

      Une question vue ici aussi : La fabrique/forum469283
      J’utilise aussi le selecteur d’article. Dans mon cas, l ’erreur md5 est générée par la fonction vérifier() de CVT.
      La transformation :
      set_request('champ', implode(",", _request('champ')));

      doit donc être appliquée dans la fonction
      formulaires_editer_Nom_de_l_Objet_vérifier()

      avant l’appel à la fonction générique
      formulaires_editer_objet_verifier()

      cause : controler_md5() n’accepte pas de tableau pour la valeur d’un champ, il y a peut-être une autre fonction plus adaptée.

    Répondre à ce message

  • Le 23 août 2013 à 11:12, par RéTo En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Bonjour à tous,
    4 jours que moi et mon collègues essayons de faire quelque chose qui conceptuellement est basique mais en vain : afficher dans le .html les résultats d’un formulaire de choix après traitement par le .php associé.

    En clair nous avons créé un formulaire de choix qui, après sélection des critères choisis par l’ utilisateur, va générer la requête SQL à notre banque de données.
    les fonctions charger() et verifier() marchent (tests avec return() et autres messages d’erreurs qui s affichent aux moments attendus). traiter() fonctionne aussi (là aussi vérifié grâce a des return).
    Ce que nous souhaiterions faire c’est retourner sur notre page de formulaire après traitement des données et afficher nos résultats qui sont tous stockés dans un tableau ’resultats’.
    En bref il faudrait que depuis le html, SPIP recupère le tableau ’resultats’, le parcourt et affiche tous ses éléments.
    Nous avons déjà tenté les pistes :
    #ENV (sur le modèle de l’affichage des erreurs dans le formulaire tel que présenté dans le tuto (http://programmer3.spip.net/Gerer-le-retour-d-erreurs)
    #SET et #GET mais on a un peu de mal avec la syntaxe pour que SPIP comprenne où sont les éléments de notre tableau ’resultats’.

    Merci d’avance. Espérons que le problème soit réglé avant le week-end. :))

    Répondre à ce message

  • Le 11 mai 2011 à 15:38, par rburton En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Bonjour,
    après validation du formulaire et insertion en bdd, comment récupérer dans la page publique l’id de l’enregistrement créé ?

    Merci,
    RB

    Répondre à ce message

  • Le 14 mars 2011 à 21:03, par Matthieu Marcillaud En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Autre chose, sachant que tu peux passer une valeur par défaut dans une saisie, tu pourrais lister tous les champs à utiliser et leurs valeurs par défaut également dans le charger(). Je me demande si Rastapopoulos a fait une fonction pour cela dans saisies.

    Répondre à ce message

  • Le 15 mars 2011 à 01:03, par Joseph En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    On peut encore améliorer les choses pour la partie charger du formulaire. En effet, saisies fournit une fonction saisies_charger_champs(). Dès lors, la fonction charger peut devenir :

    1. function mes_saisies_film() {
    2. $mes_saisies = array (
    3. ...
    4. );
    5. return $mes_saisies;
    6. }
    7. function formulaires_film_charger_dist() {
    8. // on charge les saisies et les champs
    9. include_spip('inc/saisies');
    10. $mes_saisies = mes_saisies_film();
    11. $contexte = saisies_charger_champs($mes_saisies);
    12. $contexte['mes_saisies'] = $mes_saisies;
    13. return $contexte;
    14. }

    Télécharger

    • Le 15 mars 2011 à 21:47, par RastaPopoulos En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

      Nan nan :

      1. function formulaires_film_saisies_dist(){
      2. return array(
      3. // le tableau de saisies
      4. );
      5. }

      Télécharger

      Ça c’est LA bonne méthode propre depuis la 1.9.0. :)

      À tester/améliorer si besoin, mais normalement ça fait tout charger() et tout verfier() tout seul. En tout cas les besoins de base. Et à documenter ensuite... :)

    Répondre à ce message

  • Le 15 mars 2011 à 19:37, par charles En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Salut et merci pour cette note.

    Je suis super embêter j’ai fait un peu la même chose mais je n’arrive pas à insérer en bdd.
    Tout est bon sauf ma fonction _traiter, pourriez vous m’aider ? Auriez vous une idée ?

    1. function formulaires_voter_traiter_dist($id_article,$id_auteur) {
    2.  
    3. $matable = array(`id_vote`, `id_article`, `id_auteur`, `real`, `image`, `jeu`, `scenar`, `amour`, `total`, `commentaire`, `date`);
    4. $where = array('id_article = '.$id_article ,'id_auteur = '.$id_auteur);
    5.  
    6. $real = _request('real');
    7. $image = _request('image');
    8. $jeu = _request('jeu');
    9. $scenar = _request('scenar');
    10. $amour = _request('amour');
    11. $commentaire = _request('commentaire');
    12. $total = $real + $image + $jeu + $scenar + $amour;
    13.  
    14.  
    15. if (!sql_countsel("spip_votes_films", $where)) {
    16. $res = sql_select('id_vote','spip_votes_films');
    17. $id_vote = sql_countsel('spip_votes_films') +1;
    18. $champs = array(
    19. 'id_vote'=>$id_vote,
    20. 'id_article'=>$id_article,
    21. 'id_auteur'=>$id_auteur,
    22. 'real'=>$real,
    23. 'image'=>$image,
    24. 'jeu'=>$jeu,
    25. 'scenar'=>$scenar,
    26. 'amour'=>$amour,
    27. 'total'=>$total,
    28. 'commentaire'=>sql_quote($commentaire),
    29. 'date'=> date('Y-m-d H:i:s')
    30. );
    31. sql_insertq("spip_votes_films",$champs);
    32. } else {
    33. $id_vote = sql_select($matable,'spip_votes_films', $where);
    34. $champs = array(
    35. 'id_vote'=>$id_vote,
    36. 'id_article'=>$id_article,
    37. 'id_auteur'=>$id_auteur,
    38. 'real'=>$real,
    39. 'image'=>$image,
    40. 'jeu'=>$jeu,
    41. 'scenar'=>$scenar,
    42. 'amour'=>$amour,
    43. 'total'=>$total,
    44. 'commentaire'=>sql_quote($commentaire),
    45. 'date'=> date('Y-m-d H:i:s')
    46. );
    47.  
    48. sql_updateq('spip_votes_films',$champs,$where);
    49. }
    50.  
    51.  
    52. // return array('message_ok'=>'Votre message a bien été pris en compte. Vous recevrez prochainement une réponse !');

    Télécharger

    Répondre à ce message

  • Le 14 mars 2011 à 20:56, par Matthieu Marcillaud En réponse à : Un formulaire C.V.T avec Saisies par l’exemple

    Sympa. D’autant plus que je ne connaissais pas saisies_verifier($mes_saisies);

    Je pense par contre qu’il vaudrait mieux passer dans charger() « _saisies » ou « _mes_saisies » plutôt que « saisies » ou « mes_saisies » : le souligné en premier indique à SPIP de ne pas effectuer de traitements automatiques sur les données (http://programmer.spip.org/Charger-les-valeurs-du-formulaire).

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Mailsubscribers

    16 janvier 2013 – 274 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes (...)

  • noiZetier v2

    9 novembre 2012 – 36 commentaires

    Le noiZetier offre une interface d’administration permettant d’insérer au choix des éléments modulaires de squelettes (noisettes) et de les ajouter ainsi à ses squelettes. Compatibilité La version 2 du noizetier fonctionne sous SPIP 3. Elle est (...)

  • cirr : plugin « rédacteur restreint »

    29 octobre 2010 – 60 commentaires

    Ce plugin « cirr : rédacteur restreint » permet d’affecter des rubriques aux rédacteurs et modifie les droits afin qu’un rédacteur restreint (ou un administrateur restreint) voit dans l’espace privé uniquement les rubriques qui lui sont affectées (et leur (...)

  • Un retour d’expérience d’utilisation de Formidable

    26 octobre – commentaires

    Il s’agissait de créer un formulaire d’inscription à un évènement modérer les inscriptions dans le privé publier les inscriptions dans le public Nous avons discuté de cette présentation lors de l’apéro SPIP du 15 février 2016 à la Cantine (...)

  • Métas +

    3 décembre – 14 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

Ça spipe par là