Formidable, le générateur de formulaires

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

Cette documentation est valable à partir de la version 6.1.0 de Formidable.

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

À noter, 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.

Dans un contenu

Le tableau de valeurs dans un paramètre defaut sous forme d’une suite de chaînes « clé,valeur » séparée par des virgules :
<formulaire|formidable|id=contact|defaut=hidden1,valeur,input_5,autrevaleur>

Dans un squelette

Le tableau en deuxième paramètre :

#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 :

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

Autres options utilisable dans le squelette

Il est possible de passer des options comme troisième argument du formulaire, sous forme de tableau (#ARRAY).

Options possible comme troisième argument de #FORMULAIRE_FORMIDABLE
Nom de l’optionFonctionType
forcer_modif Permet de forcer la modification d’une réponse, même si non autorisé Booléen
id_formulaires_reponses Identifiant de la réponse à modifier Entier
no_ajax Désactiver l’ajax sur le formulaire Booléen
traiter_email_destinataires Destinataires pour le traitement Tableau (#ARRAY) d’emails ou liste d’emails séparés par des virgules
traiter_email_destinataires_methode Indique si traiter_email_destinataires doit remplacer les emails déjà configurés dans le traitement ou les ajouter Au choix 'remplacer' ou 'ajouter' (valeur par défaut)
url_redirect Url de redirection Chaine

Exemple d’un formulaire Formidable dont l’identifiant est contact_libre et dont l’email destinataire est dans le champ email de la table de votre objet #EMAIL de la table spip_contacts ….

<div class="ajax">
#FORMULAIRE_FORMIDABLE{contact_libre,'',#ARRAY{traiter_email_destinataires,#EMAIL}}
</div>

Case unique

Pour rendre obligatoire la réponse oui à une 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 :

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.

Mise en forme des saisies

Le plugin ne prévoit aucun réglage de mise en forme des saisies : c’est à chaque squelette d’avoir ses styles. Il respecte cependant la convention d’écriture des formulaire SPIP. Il permet d’ajouter des classes spécifiques sur les saisies.

Affichage des réponses sous forme de tableau

Le plugin Formidable Tablesorter permet d’afficher sous forme de tableau les réponses, dans l’espace privé, avec possibilité de tri et de filtre.

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)

Discussion

167 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

  • 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

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

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