Formidable, le générateur de formulaires

Un générateur de formulaires facilement configurable pour les non-informaticiens et facilement extensible pour les développeur⋅euses.

Introduction

Historiquement, deux plugins avaient déjà été développés précédemment pour gérer des formulaires :

  • Forms &Tables, qui n’a pas été complètement porté pour SPIP 2.
  • et spip-formulaire créé par artego mais qui n’était plus maintenu.

La question s’est donc posée : construire sur la base d’un des deux plugins ou repartir de zéro ?
Form &Table, très complet pour les utilisateurs, présentait l’inconvénient d’avoir un côté « fourre-tout » qui le rendait difficilement modifiable et difficile à personnaliser par les dévs.

Il a finalement été décidé de repartir de zéro pour proposer quelque chose :

  • de plus facile à utiliser pour les utilisateurs d’une part,
  • mais aussi de plus facile à personnaliser pour les développeur⋅euses.
    Avec le parti pris de se baser de préférence sur plusieurs petits plugins spécialisés et de tirer parti de la nouvelle norme CVT.

Interface utilisateur

L’utilisation basique de l’interface est abordée dans ce screencast : Mon premier formulaire pas à pas : c’est Formidable !

Appeler mon formulaire

Vous devez appeler le formulaire ayant le nom « formidable », en lui passant en paramètre l’identifiant de votre formulaire.

Dans un contenu
Utilisez le modèle <formulaire> classique : <formulaire|formidable|id=34> ou bien <formulaire|formidable|id=contact>

Dans un squelette
#FORMULAIRE_FORMIDABLE{34} ou bien #FORMULAIRE_FORMIDABLE{contact}

Afficher les résultats du formulaire

Dans un contenu
Utilisez le modèle <formulaire_analyse|id_formulaire=34>

Pré-remplir dynamiquement les champs d’un formulaire depuis un squelette

À noter que dans un squelette, vous avez la possibilité de surcharger dans l’appel, les valeurs par défaut des champs de votre formulaire. Pour cela, vous devez passer un tableau de nom=>valeur en deuxième paramètre. Vous pourrez trouver les noms de vos champs dans l’aide-mémoire situé sur la page de configuration des traitements.

Le tableau en deuxième paramètre :

  1. #FORMULAIRE_FORMIDABLE{contact, #ARRAY{nom_du_champ, Ma valeur}}

C’est particulièrement utile pour remplir un champ caché avec une valeur dynamique venant du squelette :

  1. #FORMULAIRE_FORMIDABLE{contact, #ARRAY{hidden_1, #ID_DOCUMENT}}

Pré remplir les champs depuis une ancienne réponse

Si les réponses sont enregistrées, on peut passer en troisième argument un identifiant de réponse.

  1. #FORMULAIRE_FORMIDABLE{contact,'',23}

pour modifier la réponse 23.

Champs oui-non et case unique

Pour rendre obligatoire la réponse « oui » à un champ de type oui-non ou case unique (pour la validation de conditions d’utilisation par exemple), il faut simplement rendre le champ obligatoire.

Courriels de notification

Une option des traitements proposés permet d’envoyer un mail de notification automatiquement, à chaque saisie d’un formulaire.

Le squelette par défaut employé pour la mise en forme de ces mails est plugins/formidable/notifications/formulaire_email.html. Vous pouvez le copier dans le répertoire ’notifications’ de votre squelette et l’y modifier à votre guise. Cette modification vaudra pour tous les formulaires.

Pour utiliser un squelette spécifique pour les mails de notification de l’un seulement des formulaires définis avec Formidable, il suffit d’ajouter son squelette dans le répertoire ’notifications’ de votre dossier squelettes, mais en ajoutant l’identifiant.

IDENTIFIANT étant l’identifiant du formulaire défini dans Formidable, les squelettes doivent se nommer :
formulaire_IDENTIFIANT_email.html pour le mail aux destinataires
formulaire_IDENTIFIANT_accuse.html pour l’accusé de réception du visiteur

Conservation des IP

Les adresse IP des personnes répondant aux formulaires sont stockées en base de donnée. Depuis la version 1.5 (SPIP 3) / 0.7 (SPIP < 3), elle sont automatiquement hashé, de manière à ce que l’IP ne soit plus reconnaissable, au bout de 124 jours (environ 4 mois).

Pour changer ce délai, vous pouvez redéfinir la constante _CNIL_PERIODE dans votre fichier mes_options.php.

Par exemple :

  1. define('_CNIL_PERIODE', 24*3600);

permet de hasher les IP toutes les 24 heures.

Si vous voulez désactiver le hashage, mettez la valeur à 0.

Envoi de fichiers

Lire l’article complémentaire : Envoyer des fichiers avec un formulaire Formidable.

Voir aussi sur le wiki


-  Complément de doc et exemples sur les boucles et balises de formidable
-  Exemples de stylage CSS d’un formulaire Formidable
-  todoFormidable
-  Formidable, présentation aux Grottes (2010)

Dernière modification de cette page le 23 mars 2019

Discussion

658 discussions

  • 2

    J’ai pu reproduire le problème du non respect de l’unicité quand un auteur tente de modifier une réponse qui n’est pas la sienne (et que l’identification est id_auteur).

    Voilà le formulaire problématique :

    id_formulaire : ’13’
    identifiant : test_multi
    titre : ’test multi auteurs’
    descriptif : ’’
    css : ’’
    message_retour : ’’
    saisies :
      -
        saisie : input
        options :  nom : input_1, label : ’Ligne de texte’, size : 40, sql : ’text DEFAULT ’’’’ NOT NULL’ 
        identifiant : ’@5ce2bc8d3d2c9’
    traitements :
      enregistrement :
        moderation : posteriori
        multiple : on
        modifiable : on
        effacement : ’’
        effacement_delai : ’’
        identification : id_auteur
        variable_php : ’’
        unicite : input_1
        message_erreur_unicite : ’’
        anonymiser : ’’
        ip : ’’
        invalider : on
        resume_reponse : ’’
        analyse_exclure_champs : ’’
    public : non
    statut : publie
    maj : ’2019-05-20 17:31:31’
    apres : formulaire
    url_redirect : ’’
    date_creation : ’2019-05-20 16:42:04’
    

    Voilà comment reproduire le bug :
    -  L’auteur 1 enregistre une réponse « toto » (id 123)
    -  L’auteur 2 affiche le formulaire rempli avec la réponse 123
    -  L’auteur 2 valide le formulaire sans changer la réponse « toto »
    -  Une nouvelle réponse est créée avec « toto » comme réponse, et l’unicité n’est pas respectée

    Alors que si l’auteur 2 affiche un formulaire vierge et indique « toto », le test d’unicité est appliqué et la réponse est bien refusée.

    Voilà aussi le squelette utilisé modeles/testmulti.html :

    [(#REM) on recupere l'identifiant]
    #SET{id_form,0}
    <BOUCLE_form(FORMULAIRES){identifiant=test_multi}>
    #SET{id_form,#ID_FORMULAIRE}
    </BOUCLE_form>
     
    [(#ENV{id_reponse}|oui)
       #FORMULAIRE_FORMIDABLE{#GET{id_form}, #ARRAY, #ENV{id_reponse}}
    ]
     
    [(#ENV{id_reponse}|non)
       #FORMULAIRE_FORMIDABLE{#GET{id_form}}
    ]
     
    <hr>
     
    <B_rep>
    <ul>
    <BOUCLE_rep(FORMULAIRES_REPONSES){id_formulaire=#GET{id_form}}>
       <li><a href="[(#SELF|parametre_url{id_reponse, #ID_FORMULAIRES_REPONSE})]">#VOIR_REPONSE{input_1, brut}</a></li>
    </BOUCLE_rep>
    </ul>
    </B_rep>
    • Sans regarder le code, je pense comprendre ce qui se passe :
      comme on édite une réponse existante, le test d’unicité est valide.

      C’est seulement ensuite que l’autorisation de modifier la réponse est examinée, et que la décision est prise d’enregistrer une nouvelle réponse au lieu de modifier l’existante.

      On enregistre alors une nouvelle réponse avec un doublon.

    • bon j’essaie de voir tout cela se week-end

    Répondre à ce message

  • Enfin (et ce sera tout pour ce soir), il y a un bug quand on configure un formulaire avec « Ne pas conserver l’identifiant de la personne connectée. »

    Si on change d’avis (après enregistrement des traitements) et qu’on rend le formulaire « Modifiable » avec id_auteur comme méthode d’identification, le champ « Ne pas conserver l’identifiant de la personne connectée. » est caché, mais il reste coché :

    id_formulaire : ’13’
    identifiant : test_multi
    titre : ’test multi auteurs’
    descriptif : ’’
    css : ’’
    message_retour : ’’
    saisies :
      -
        saisie : input
        options :  nom : input_1, label : ’Ligne de texte’, size : 40, sql : ’text DEFAULT ’’’’ NOT NULL’ 
        identifiant : ’@5ce2bc8d3d2c9’
    traitements :
      enregistrement :
        moderation : posteriori
        multiple : on
        modifiable : on
        effacement : ’’
        effacement_delai : ’’
        identification : id_auteur
        variable_php : ’’
        unicite : input_1
        message_erreur_unicite : ’’
        anonymiser : on
        ip : ’’
        invalider : on
        resume_reponse : ’’
        analyse_exclure_champs : ’’
    public : non
    statut : publie
    maj : ’2019-05-20 22:58:31’
    apres : formulaire
    url_redirect : ’’
    date_creation : ’2019-05-20 16:42:04’
    

    Note :

        modifiable : on
        identification : id_auteur
        anonymiser : on
    

    Du coup, quand on enregistre une réponse, c’est id_auteur = 0 qui est enregistré.

    Il faudrait juste décocher la case « Ne pas conserver l’identifiant de la personne connectée » quand on la cache.

    Répondre à ce message

  • 4

    Bonjour

    Je rencontre un problème à la modification d’une réponse quand une personne A modifie une réponse d’une personne B.

    Mon formulaire est configuré pour avoir des réponses multiples, et je passe par un modèle pour pouvoir modifier les réponse :

    [(#ENV{id_reponse}|oui)
      #FORMULAIRE_FORMIDABLE{#ENV{id_form}, #ARRAY, #ENV{id_reponse}}
     
      <p>
      <a href="[(#SELF|parametre_url{id_reponse,''})]">retour à la liste des entités</a>
      </p>
    ]
     
    [(#ENV{id_reponse}|non)
      [(#INCLURE{fond=modeles/entites_liste,env,id_form=#ENV{id_form}})]
    ]

    Quand il y a dans l’URL id_reponse=1234 ça permet de modifier la réponse. Sinon, ça affiche la liste des réponses.

    Tant que c’est la même personne qui entre une valeur par le formulaire et qui modifie, aucun souci.

    Quand « A » modifie une réponse saisie par « B », voilà ce qui se passe :
    -  une nouvelle réponse est enregistrée pour le formulaire
    -  en ne vérifiant pas les clauses d’unicité (j’en ai une sur un input_1)
    -  par la suite, ni « A » ni « B » ne peuvent plus modifier leurs réponses car la clause d’unicité est appliquée

    J’ai tenté de cocher « Ne pas conserver l’identifiant de la personne connectée. » mais ça ne change strictement rien. L’id_auteur est toujours enregistré dans la table spip_formulaires_reponses

    Comment faire pour ignorer l’id_auteur et permettre la modification par un autre auteur ?

    • Hum, je ne reproduis pas ce bug. Si j’ai dit de ne pas tenir compte de l’identifiant, Est-ce unformulaire qui date d’avant décembre ? Il y a eu une reecriture du code sur cette fonctionnalité là à ce moment, et peut etre qu’un souci dans la migration.

      Par contre, il y dans tous les cas une vérification que l’internaute est bien l’auteur de la réponse : soit par id_auteur, soit par cookie, soit par une autre variable PHP. Je viens d’ajouter dans la version 3.38.0 une option où le passage explicite de l’identifiant de réponse suffit à l’identification.

      Reste juste ta question de l’unicité du champ, mais je ne suis pas sur d’avoir compris le problème.

    • Merci pour ta rapidité !

      Par contre, quand je sélectionne id_formulaires_reponse dans la partie « Configuration des traitements », j’obtiens cette erreur après la validation de la page :

       :Pri:ERREUR : Erreur 1064 de mysql : You have an error in your SQL syntax ; check the manual that corresponds to your MariaDB server version for the right syntax to use near ’ORDER BY date’ at line 6
      in /www/spip3/plugins/auto/formidable/v3.38.0/inc/formidable.php L210 [sql_allfetsel(),formidable_verifier_reponse_formulaire(),formidable_trouver_reponse_a_editer(),formulaires_formidable_charger_dist(),call_user_func_array(),formulaire__charger(),balise_FORMULAIRE__contexte(),balise_FORMULAIRE__dyn(),call_user_func_array(),traiter_formulaires_dynamiques()]
      SELECT id_formulaires_reponse
      FROM `intranet`.spip_formulaires_reponses
      WHERE (id_formulaire = 4)
              AND (statut = ’publie’)
              AND                              <--- l’erreur est là
      ORDER BY date
      

      Mais ça n’empêche pas le formulaire de fonctionner.

      Concernant mon problème de double réponse, je vais tenter de reproduire le problème avec un formulaire simple.

      Florence

    • a oui, la version 3.38.1 corrige cela.

    • Nickel ! Plus de message d’erreur.

    Répondre à ce message

  • 5

    Sur un site en 2 langues je n’arrive pas à faire afficher le texte du bouton de validation d’un formulaire :
    Si je mets <multi>[fr]Envoyer[en]Submit</multi> dans la config des options globales il m’affiche
    <multi>[fr]Envoyer[en]Submit</multi> texto sur le site public

    Pour les autres champs du formulaire j’ai bien le bon texte de langue qui s’affiche.

    Répondre à ce message

  • 2

    Bonjour

    Parfois, je reçois un mail de mon site : Récupérez le plus rapidement possible les fichiers temporaires suivants
    Pour le champ f :

    avec une liste de fichiers temporaires à récupérer dans ..../tmp/cvtupload

    Or ces fichiers ne sont plus présents dans le répertoire, bien que je m’y rende 1 heure seulement après que le mail ait été envoyé.

    Qu’est-ce qui produit cette anomalie ?

    • des difficultés lors du transfer des fichiers entre le repertoir temporaire et le repertoire definitif. J’ai vraiment l’impression que tu as des souci sur ton serveur. Mais par contre c’est bizarre que moins d’une heure après cela soit effacé, car le délai est normalement de 6 heures (réglage via _CVTUPLOAD_AGE_MAX)

    • Bon, je pense savoir ce qui a pu provoqué le fait que les fichiers disparaissait. J’ai mis une sécurité dans la version 3.37.7 de formidable. Désormais les fichiers sont copiés depuis le répertoire temporaire, et non pas déplacé. Comme cela s’il y a une merde, les fichiers dans tmp/cvt_upload sont conservés.

      Est-ce que ton souci arrivait avec des formulaireds ajaxés ? J’ai aussi corrigé un bug dans ce genre de cas.

    Répondre à ce message

  • 11

    Bonjour
    Je souhaite afficher les résultats d’un formulaire dans une page mais je suis perdu.
    Sur un site, j’utilise les noisettes ce qui me permet d’insérer ce code dans un cadre spip :

    <BOUCLE_formidable_id_form(FORMULAIRES_REPONSES){id_formulaire=2}>
    	<tr>
    		<td>#VOIR_REPONSE{input_5, valeur_uniquement, '' }</td>
    		<td>#VOIR_REPONSE{input_2, valeur_uniquement, '' }</td>
    		<td>#VOIR_REPONSE{input_3, valeur_uniquement, '' }</td>
    		<td>#VOIR_REPONSE{date_1, valeur_uniquement, '' }</td>
    		<td>#VOIR_REPONSE{date_2, valeur_uniquement, '' }</td>
    		<td>#VOIR_REPONSE{checkbox_1, valeur_uniquement, '' }</td>
    </BOUCLE_formidable_id_form>	

    Sur un autre site, je ne peux pas installer les noisettes mais je dois également utiliser ce même code. Comment dois-je faire ? Où faut-il que j’intègre ce code ou comment dois-je le modifier ? Si je le mets directement dans un article, cela ne fonctionne pas.
    Par avance merci
    Guietfa

    • comment ca tu ne peux pas instalelr de noisettes ? pourquoi ?

      si tu veux pouvoir executer du code SPIP dans un article, ce n’est pas possible. par contre tu peux te créer un modèle https://www.spip.net/fr_article3454.html#Quelques-conseils-pour-ecrire-un-modele

    • Je ne peux pas car je ne suis pas administrateur et je n’ai pas les droits.
      Oula, le modèle ça à l’air coton... Je vais voir ce que je peux faire mais je sens que ça va me dépacer...
      Merci beaucoup pour cette réponse si rapide

    • sans les droits d’administration / d’envoi de fichier dans les squelettes tu ne pourras rien faire.

    • Si si , ça, je peux faire ! Je peux ajouter des fichiers dans le squelette

    • ah !

      bah un modèle c’est simple. c’est juste un squelettes nom.html dans un dossier modeles.. Ensuite tu appel le modèle via <<nom|> dans ton article.

      Evidemment tu remplace nom par le nom de ton modèle.

    • Je récapitule :
      Dans le dossier modele, je créé un fichier machin.html.
      Dans mon fichier machin.html, je copie le code suivant :

      <BOUCLE_formidable_id_form(FORMULAIRES_REPONSES){id_formulaire=2}>
      	<tr>
      		<td>#VOIR_REPONSE{input_5, valeur_uniquement, '' }</td>
      		<td>#VOIR_REPONSE{input_2, valeur_uniquement, '' }</td>
      		<td>#VOIR_REPONSE{input_3, valeur_uniquement, '' }</td>
      		<td>#VOIR_REPONSE{date_1, valeur_uniquement, '' }</td>
      		<td>#VOIR_REPONSE{date_2, valeur_uniquement, '' }</td>
      		<td>#VOIR_REPONSE{checkbox_1, valeur_uniquement, '' }</td>
      </BOUCLE_formidable_id_form>

      Dans un nouvel article, j’appel mes réponses en écrivant : <machin|>

      C’est bien cela ?

    • oui, mais le dossier est modeles au pluriel-

    • ok
      mais je viens de tester et ça ne fonctionne pas. Ca m’affiche
      <machin|>

    • tu as bien mis ton dossier modeles dans le dossier squelettes ?

    • Oui il est au bon endroit

    • Ca y est, j’ai trouvé. Il ne faut pas mettre de majuscule dans le nom du fichier...
      Désolé et surtout, merci beaucoup pour ton aide précieuse !

    Répondre à ce message

  • 2

    Bonjour

    Je n’ai peut-être pas les yeux en face des trous, mais je n’arrive pas à configurer le formulaire de façon à ce qu’après l’envoi, le formulaire vide soit ré-affiché.

    Si je choisis « le formulaire à nouveau », le formulaire s’affiche avec les valeurs que j’ai soumises. Cet affichage est ok quand je permets de modifier les réponses. Mais quand les réponses ne sont pas modifiable et que les gens peuvent répondre plusieurs fois, ce n’est pas très adapté. Le risque est grand que les personnes soumettent plusieurs fois la même réponse.

    Si je choisis « rediriger vers une autre page » et que je mets le lien vers l’article, j’ai bien le formulaire vide, mais les utilisateurs n’ont pas le message de retour du formulaire.

    Est-ce que j’ai loupé un élément de configuration ?

    Répondre à ce message

  • 2

    Je viens de mettre à jour Formidable sur un SPIP 3.2.4 (PHP Version 7.1.25) et j’ai un problème d’affichage des réponses sur la page / ?exec=formulaires_reponses&id_formulaire=1

    Merci

    Répondre à ce message

  • 3

    Bonjour

    J’ai configuré le formulaire pour que le résultat me soit envoyé en y intégrant les fichiers téléversés. Si la taille max est dépassée, un lien est inséré à la place. OK.
    J’ai programmé dans connect.php pour que le lien soit valide 10j.

    J’ai reçu une réponse, il y a 3 jours, Quand je clique, cela ouvre une page de mon site avec le message : formidable_recuperer_fichier_par_email : Accès interdit
    Je suis pourtant bien connecté et webmaster.

    • dans connect.php ? normalement c’est mes_options.php

      une possibilité est que le lien soit coupé par le lecteur de mail.

      Il faudrait me transférer le mail en privé pour que je vois ce qu’il en est.
      En tout cas comme cela je n’ai pas d’outil explicatif.

    • Message privé envoyé.

    • Pour mémoire : on suspecte une interaction avec le plugin spip_thelia et son authentification unique.

    Répondre à ce message

  • 13

    Bonjour,
    Je viens de faire la mise à jour et j’ai ce message juste sous le bandeau d’en-tête (dans l’espace administrateur)

    Erreur dans les plugins : /home/monidentifiant/www/plugins/auto/formidable/v3.36.3/formidable_pipelines.php

    Quelqu’un peut me dire ce que cela veut dire et pourquoi j’ai ça ?

    • Le cache der SPIP a-t-il bien été vidé ?

    • je ne pense pas que ce soit un problème de cache. On dirait plutot que le ficheir de pipelines a mal été installé.
      Est-ce que tu peux regarder si le fichier est bien présent ?

    • Le fichiers “formidable_pipelines.php” se trouve bien dans le dossier “v3.36.5” avec un total de 32 éléments confondus (dossiers + fichiers).

    • Ah ! Mais le message indique que le problème se situe en v.3.36.3 et non pas v3.36.5. Donc c’est visiblement un problème de cache, effectivement. Un truc a du mal se passer au moment de la mise à jour.

      Vous pouvez soit vider le cacher intégralement, soit effacer les fichiers charger_ dans le dosiser tmp/cache

    • Voici les 4 fichiers trouvés :

      charger_pipelines.php
      charger_plugins_chemins.php
      charger_plugins_fonctions.php
      charger_plugins_options.php

      Si je les supprime tous, que va-t-il se passer ?

    • Il vont se recréer automatiquement, mais avec un contenu actualisé. Normalement ils auraient du être recrée au moment de la mise à jour du plugin, mais visiblement tel n’a pas été le cas.

    • Merci Maïeul ! Juste avant de faire cette nouvelle mise à jour (3.36.6), j’avais supprimé ces 4 fichiers et c’est bon. Je ne vois plus ce message :

      Erreur dans les plugins :
      /home/monidentifiant/www/plugins/auto/formidable/v3.36.3/formidable_pipelines.php

       ;)

    • Bonjour,

      J’ai à nouveau le même problème avec le plugin “saisies” :

      Erreur dans les plugins : /home/monidentifiant/www/plugins/auto/saisies/v3.18.10/saisies_pipelines.php

      Je supprime à nouveau :

      charger_pipelines.php
      charger_plugins_chemins.php
      charger_plugins_fonctions.php
      charger_plugins_options.php

      du dossier tmp/cache ?

    • oui mais ce n’est pas normal. C’est encore arrivé après une mise à jour de plugin ?

    • Oui mais après avoir rafraichi la page la ligne s’en va.
      En faisant “Vider le cache” aussi.

    • oui, mais cela ne devrair pas arriver....

    • Je viens de mettre à jour "zcore” et encore ce même message d’erreur apparaît.

      Erreur dans les plugins : /home/monidentifiant/www/plugins/auto/zcore/v2.7.1/zcore_pipelines.php

    • c’est clairement un bug quelque part chez vous avec la mise à jour des plugins -> il faudrait rapporter cela sur https://core.spip.net/projects/spip/issues/ en donnant un maximum d’information (version de SPIP, hébergeur, version de PHP)=

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?
  • [Se connecter]

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom