Complément sur Formidable

Cette page complète la documentation de Formidable sur contrib. Elle pourrait un jour sortir - au moins partiellement - du carnet wiki et être publiée sur contrib.

N’hésitez pas à proposer de nouveaux compléments, dans le forum de cet article.


Afficher le label des réponses d’un formulaire

d’après Formidable, le générateur de formulaires

Pour afficher le label des réponses dans les réponses d’un formulaires, il faut :

-  Boucler sur la table spip_formulaire/ *input_1 ou votre valeur à vous

<BOUCLE_spip_formulaires(FORMULAIRES)>
[<p>(#SAISIES|unserialize|trouver_ma_saisie{input_1}|table_valeur{options/label})</p>]
</BOUCLE_spip_formulaires>

-  Mettre la fonction créée par marcimat (un grand merci) dans mes_fonctions.php

// Recupérer le label d'une saisie formidable
function trouver_ma_saisie($saisies, $champ) {
    include_spip('inc/saisies');
    if (!is_array($saisies)) {
        $saisies = unserialize($saisies);
    }
    if (!$saisies) {
        return false;
    }
    $saisie = saisies_chercher($saisies, $champ);
    return $saisie;
}

Possibilité aussi d’utiliser tout simplement la fonction « saisies_chercher », ce qui dispense d’ajouter la fonction « trouver_ma_saisies » dans le fichier « mes_options.php » :

<BOUCLE_spip_formulaires(FORMULAIRES)>
[<p>(#SAISIES|unserialize|saisies_chercher{input_1}|table_valeur{options/label})</p>]
</BOUCLE_spip_formulaires>

-  Pour afficher les réponses, mais c’est déjà documenté :

<BOUCLE_spip_formulaires_reponses(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}{nom=input_1}>
[<p>(#VALEUR)</p>]
</BOUCLE_spip_formulaires_reponses>

Afficher les résultats d’un formulaire par question et non par réponse (grouper toutes les réponses d’une question ensemble)

<BOUCLE_formidable_id_form(FORMULAIRES){id_formulaire=#ENV{id}}>
<BOUCLE_saisies(DATA){source tableau,#SAISIES|unserialize}>
[(#SET{nom_saisie,[(#VALEUR|table_valeur{options/nom})]})]
<B_spip_formulaires_rep>
[<h3>
	(#VALEUR|table_valeur{options/label})
</h3>]
<div class="reponses_form reponse[(#GET{nom_saisie})]">
<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}{!par id_formulaires_reponse}{pagination 10 [(#GET{nom_saisie})]}>
			<div>
				<h4>[Réponse N° (#ID_FORMULAIRES_REPONSE)][  - (#MAJ|affdate)]</h4>
				[(#VOIR_REPONSE{[(#GET{nom_saisie})], valeur_uniquement})]
			</div>
</BOUCLE_spip_formulaires_rep>
[[<p>Il y a au total #GRAND_TOTAL contributions, cette liste en affiche (#TOTAL_BOUCLE)</p>]
<div class="pagination">(#PAGINATION{page_precedent_suivant})</div>]
</div>
</B_spip_formulaires_rep>
</BOUCLE_saisies>
</BOUCLE_formidable_id_form>

Modèle <formulaires_reponse>

Formidable Présentation aux Grottes (2010)

Pour afficher les résultats dans spip, formidable fournit un modèle "formulaires_reponse".

Il est également possible d’aller chercher les résultats pour les présenter de la manière voulue :

    <b_numero_reponse>
    <ul>
    <boucle_numero_reponse(spip_formulaires_reponses)>
    <li>reponse #ID_FORMULAIRE_REPONSE : <br>
    <boucle__reponses_champ1 (spip_formulaires_reponses_champs){nom=textarea_1}>#VALEUR</boucle_reponse_champ1>
    -
    <boucle__reponses_champ2 (spip_formulaires_reponses_champs){nom=textarea_2}>#VALEUR</boucle_reponse_champ2>
    -
    <boucle__reponses_champ3 (spip_formulaires_reponses_champs){nom=input_1}>#VALEUR</boucle_reponse_champ3>
    </li>
    </boucle_numero>
    </ul>
    </b_numero_reponse>

Il faut alors connaitre le nom interne de chaque champ dans le formulaire concerné : input_1, ...

Depuis la version 2.6.0, il existe aussi la balise #VOIR_REPONSE{champ}.

C’est par contre plus compliqué pour faire directement à partir du name du champ car la correspondance avec le nom internet passe par une sérialisation dans le champ saisies de la table spip_formulaires. A moins qu’il n’y ait un filtre standard pour faire la correspondance...


Récupérer les fichiers téléversés par un auteur

frederic expérimente le nouveau champ « fichiers » du plugin formidable, remercie sur la liste user les contributeurs de cette nouvelle fonctionnalité, et partage sa recherche et demande s’il y a une meilleure méthode :

Je cherche à récupérer dans un squelette la liste des fichiers d’une réponse à un formulaire qui contiendrait un ou plusieurs champs fichiers. L’objectif est de pouvoir consolider dans une archive zip (à l’aide du plugin zippeur), tous les fichiers qu’un même utilisateur (identifié par son login) aurait téléversé sur un ou plusieurs formulaires qui peuvent contenir eux même un ou plusieurs champs « fichiers ». Zippeur a besoin d’un tableau des fichiers incluant leur chemin relatif.

Pour construire ce tableau :

-  ces fichiers sont stockés dans le dossier config/fichiers/formidable/formulaire_<numéro-du-formulaire>/reponse_<numéro-de-réponse>/fichiers_<numéro-du-champ-fichiers>, donc je pense pouvoir reconstruire cette arborescence en bouclant sur les réponses des formulaires avec un filtre id_auteur.

Il reste à récupérer le nom des fichiers qui sont enregistrés dans le champs « valeur » de la table « spip_formulaires_reponses_champs » au format sérialisé comme dans l’exemple ci-dessous :

a:1: {
    i: 0;
    a:4: {
        s: 6: "taille";
        i: 85034;
        s: 4: "mime";
        s: 10: "image/jpeg";
        s: 3: "nom";
        s: 15: "nom_fichier.jpg";
        s: 9: "extension";
        s: 3: "jpg";
    }
}

En supposant qu’on impose une limite d’un seul fichier par champ « fichiers », je peux récupérer le nom de fichier via cette balise : [(#VALEUR|unserialize|table_valeur{0/nom})]

Le chemin complet avec le nom :

[config/fichiers/formidable/formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/(#VALEUR|unserialize|table_valeur{0/nom})]

Pour quand même d’envisager le cas de plus d’un fichier par champ, on peut utiliser une boucle POUR sur le résultat de la deserialization. Du coup, pour couvrir le cas de 2 champs fichiers avec plusieurs fichiers, le code devient :

<BOUCLE_formidable_id_form(FORMULAIRES) {identifiant=<identifiant_du_formulaire>}>
	<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES) {id_formulaire}{id_auteur <id_auteur>}>
		<p>liste des fichiers téléversés dans les champs fichiers_1 et fichiers_2:<p>
		<BOUCLE_spip_reponses(FORMULAIRES_REPONSES_CHAMPS) {id_formulaires_reponse=
#ID_FORMULAIRES_REPONSE}{nom IN fichiers_1, fichiers_2}>
			<BOUCLE_liste_fichiers(POUR) {tableau #VALEUR}>
				<br/>
config/fichiers/formidable/formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/[(#VALEUR|table_valeur{nom})]
			</BOUCLE_liste_fichiers>
		</BOUCLE_spip_reponses>
	</BOUCLE_spip_formulaires_rep>
</BOUCLE_formidable_id_form>

Après quelques travaux, la dernière version de boucle qui renvoie le chemin des fichiers téléversés
dans un plusieurs champ « fichiers » dans une réponse à un formulaire « formisable » est :

<BOUCLE_spip_reponses
(FORMULAIRES_REPONSES_CHAMPS) {id_formulaires_reponse=#ID_FORMULAIRES_REPONSE}{nom IN fichiers_1, fichiers_2}>
   <BOUCLE_liste_fichiers(POUR) {tableau #VALEUR}>
  <br>#EVAL{_DIR_FICHIERS_FORMIDABLE}formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/[(#VALEUR|table_valeur{nom})]
   </BOUCLE_liste_fichiers>
</BOUCLE_spip_reponses >

Attention, ces fichiers sont dans le répertoire config, qui n’est pas public : c’est une protection de l’accés aux fichiers.
On peut toutefois ajouter un include_spip('inc/formidable_fichiers'); dans mes_fonctions.php, ce qui permet d’utiliser la fonction comme filtre : le premier argument est alors ce sur quoi s’applique le filtre.

Le code pour générer les liens des fichiers est alors :

<BOUCLE_formidable_id_form(FORMULAIRES) {identifiant=<identifiant_du_formulaire>}>

<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES) {id_formulaire}{id_auteur=<id_de_l_auteur>}>
      <BOUCLE_spip_reponses(FORMULAIRES_REPONSES_CHAMPS) {id_formulaires_reponse=#ID_FORMULAIRES_REPONSE}{nom IN fichiers_1, fichiers_2,<nom_de_la_saisie>}>
         <BOUCLE_liste_fichiers(POUR) {tableau #VALEUR}>
            <p>Chemin du fichier:
#EVAL{_DIR_FICHIERS_FORMIDABLE}formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/[(#VALEUR|table_valeur{nom})]<br>
            <a
href="[(#VAL{#ID_FORMULAIRE}|formidable_generer_url_action_recuperer_fichier{#ID_FORMULAIRES_REPONSE,#NOM,[(#VALEUR|table_valeur{nom})]})]">
               Lien du fichier</a></p>
         </BOUCLE_liste_fichiers>
      </BOUCLE_spip_reponses >
   </BOUCLE_spip_formulaires_rep>
</BOUCLE_formidable_id_form>

Autorisations de formidable

#AUTORISER{repondre, formulaire, #ID_FORMULAIRE}

Permet par exemple de ne pas afficher le formulaire si l’utilisateur a déjà répondu. A combiner aussi avec les modèles fournis :
-  modeles/formulaires_reponse.html (affiche une réponse précise)
-  modeles/formulaire_analyse.html (stats de toutes les réponses)


Formitable

FormiTable (developpement arrêté) : plugin avec potentiel mais non maintenu

FormiTable est un plugin de Formidable et lui fournit un traitement pour enregistrer les saisies de ’formidable’ dans une table utilisateur, avec une correspondance de chaque champ d’un formulaire vers un champ de la table.

Il permettait d’aller la facilité de formidable pour concevoir des formulaires, et la facilité de SPIP à traiter les tables et accéder à leurs champs.
-   État dégradé : Ça marchait bien mais ça n’a pas été maintenu et ça n’a pas suivi le développement de Formidable. Il se peut que Formitable (et Formidable) étaient peu utiles pour les développeurs qui peuvent coder un CVT sur mesure, et pas ressenti comme assez nécessaire pour les autres, que les traitements de Formidable, même plus limités que ceux de SPIP, satisfaisaient déjà.

Voir la documentation du plugin formitable

Discussion

7 discussions

  • 1

    Bonjour,
    Je souhaiterais qu’un auteur identifié par login, ayant répondu à un formulaire, ait le droit ensuite de modifier sa réponse, mais sans avoir le droit de voir les autres réponses du formulaire données par d’autres utilisateurs.
    Si je choisis d’attribuer une gestion d’auteurs du formulaire, chaque auteur a accès à toutes les réponses, et si je laisse tel quel, l’auteur identifié n’a pas accès à la modification de sa réponse, même en ayant choisi dans les réglages du plugin que « les internautes peuvent modifier leurs réponses après coup ».
    Comment puis-je faire ? Dois-je surcharger la fonction d’autorisation de modifier la réponse d’un formulaire ?
    Merci !

    • Bonjour,

      Voici comment j’appelle un formulaire rempli avec les champs éditables pour l’auteur identifié :

      <BOUCLE_auteur(AUTEURS){id_auteur=#SESSION{id_auteur}}{tout}>
      #FORMULAIRE_FORMIDABLE{1}
      <BOUCLE_reponses(FORMULAIRES){id_formulaire=form1}>
      <BOUCLE_spip_formulaires_reponses(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}>
      [<p class="#EDIT{valeur}">Nom: (#VALEUR)</p>]
      </BOUCLE_spip_formulaires_reponses>
      
       [(#SESSION{id_auteur}|=={#ID_AUTEUR}|oui)#FORMULAIRE_FORMIDABLE,id_formulaire=form1{#SESSION{id_auteur}}]
        <BOUCLE_reponses0(FORMULAIRES_REPONSES){id_formulaire=form1}>
           [<p>(#SAISIES|unserialize|saisies_chercher{input_8}|table_valeur{options/label})</p>]
      <BOUCLE_spip_formulaires_reponses0(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}>
           [<span class="#EDIT{valeur} cadre">(#VALEUR)</span>]
      </BOUCLE_spip_formulaires_reponses0>
      </BOUCLE_reponses0>
      </BOUCLE_reponses>
      </BOUCLE_auteur>

      ceci sur une page appelée via :
      [(#INCLUREfond=inclure/mapage,id_auteur)]

      Je ne sais plus s’il faut compléter par une autorisation spéciale dans la config du site ou un plugin (crayons ?).

      dd

    Répondre à ce message

  • 1
    horetol

    Bonjour,
    Question certainement très naïve : comment ajouter un « placeholder » sur un formulaire formidable ?
    Merci

    Répondre à ce message

  • 4

    Bonjour,
    Je cherche à envoyer les données d’un formulaire aux inscrits d’une liste de diffusion. J’ai cru voir passer dans les recherches un post de forum traitant de cette question, mais erreur 404. Avez-vous des pistes ou me faut-il développer une petite fonction ? Merci d’avance.

    • il suffit de ocnfigurer le traitement « envoyer par email », pour qu’il envoie à l’adresse de la liste de diffusion...

    • Bonjour Maïeul et merci pour la rapidité.
      A dire vrai, je pensais plutôt à une liste de diffusion Spip Newsletter

    • Bonjour,

      alors là non je ne crois pas que ce soit possible (il faudrait du reste dans ce cas qu’il s’agisse d’une liste fermée).

      Après cela ne devrait pas être trop compliqué de créer un plugin qui ajoute un traiement en ce sens.

    • Merci, cela confirme ce que je pensais et va m’éviter de me disperser.

      Si on donne suite, je ne manquerais pas de proposer le plugin.

    Répondre à ce message

  • 1
    Ilovespip

    Bonjour,
    je voudrais afficher les résultats d’un formulaire mais en isolant selon le choix d’un bouton radio saisie ? N’avoir que les résultats si le bouton radio etait lorem.
    @radio_1==« lorem »
    @radio_1==« ipsum »

    Je ne sais pas comment m’y prendre et où filtrer avec ce critère restrictif. Merci beaucoup

    <BOUCLE_formulaire2(FORMULAIRES){id_formulaire=9}{tout}>
    #SET{saisies,#SAISIES|unserialize}
    #SET{saisies_finales,#GET{saisies}|saisies_lister_finales}
    <B_reponses2>
    
    <BOUCLE_reponses2(FORMULAIRES_REPONSES){id_formulaire}>
    <BOUCLE_champ2(POUR){tableau #GET{saisies_finales}}>
    [(#VOIR_REPONSE{#VALEUR{options/nom}})]
    </BOUCLE_champ2>
    </BOUCLE_reponses2>
    		
    </B_reponses2>
    </BOUCLE_formulaire2>

    J’ai essayé ca mais ca marche pas

    <BOUCLE_champss(FORMULAIRES_REPONSES_CHAMPS){nom=radio_1}{valeur=lorem}>
    <BOUCLE_reponsess(FORMULAIRES_REPONSES) {id_formulaires_reponse}>
    [(#VOIR_REPONSE{#VALEUR{options/nom}})]
    </BOUCLE_reponsess>
    </BOUCLE_champss>
    • Je suis étonné que votre essaie ne marche pas. Il faudrait voir avec le mode debug pour comprendre. Mais on est bien d’accord que {lorem} c’est la valeur « technique » et pas la valeur « humaine » ?

      Lorsque vous déclarerz vos clé, vous faite bien

      lorem|Un texte humain
      ipsum|UN autre texte humaim

       ?

    Répondre à ce message

  • 3

    Bonjour,
    Je voudrais que les utilisateurs ayant rempli un formulaire puissent modifier leurs réponses par la suite mais je n’y arrive pas.
    J’ai passé le statut des utilisateurs de « visiteur » à « rédacteur »
    Avec le plugin « Autorité » j’ai indiqué que les auteurs n’avaient pas accès à l’espace privé
    J’ai indiqué que les réponses au formulaire était modifiables
    J’ai indiqué que les pages publiques des formulaires étaient autorisées
    J’ai ajouté manuellement les auteurs au formulaire (mais ceci n’est pas pérenne étant donné que les auteurs s’inscrivent librement sur le site)
    J’ai testé les 2 modes pour

     "Quel procédé utiliser en priorité pour connaître la réponse précédemment apportée par l’utilisateur·trice ?" :
    Par l’identifiant (id_auteur) de la personne authentifiée
    Par l’identifiant (id_formulaire_reponse) de la réponse, passé explicitement lors de l’appel au formulaire dans un squelette 

    Rien n’y fait. les champs ne sont éditable dans les pages publiques que par l’admin du site.

    Ma boucle :

    <div class="fiche">
          [(#SESSION{id_auteur}|non)
                [(#INCLURE{fond=inclure/qui,env})]
                ]
    <BOUCLE_auteur(AUTEURS){id_auteur=#SESSION{id_auteur}}{tout}>
    
    <h4><:formidable_edit:></h4>
    <BOUCLE_reponses0(FORMULAIRES_REPONSES){id_formulaire=8}{id_auteur}>
    
    // trouver comment afficher tous les labels 
    <BOUCLE_reponses(FORMULAIRES){id_formulaire=8}>
         [<p>(#SAISIES|unserialize|saisies_chercher{input_8}|table_valeur{options/label})</p>]
    </BOUCLE_reponses>
    
    <BOUCLE_spip_formulaires_reponses0(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse}>
         [<span class="#EDIT{valeur} cadre">(#VALEUR)</span>]
    </BOUCLE_spip_formulaires_reponses0>
    </BOUCLE_reponses0>
    
    </BOUCLE_auteur>
    </div>

    Si quelqu’un a une idée car là je ne vois pas ce que je pourrais faire de plus.

    Merci !

    • La modification par les auteurs du formulaire est censée se faire avec #FORMULAIRE_FORMIDABLEid_identifiant_du_formulaire, pas avec les crayons. C’est à ce niveau que les tests sont faits. J’imagine qu’il faudrait mutualiser le code de formidable entre la partie « modification d’une réponse via un formulaire » et « utilisation des crayons » et utiliser un système d’autorisation. Pas le temps en ce moment.

    • Ah d’accord, je n’avais pas compris que seuls les administrateurs pouvaient modifier les réponses dans l’espace public.
      Merci

    • non, non, c’est possible de modifier depuis l’esapce public. mais pas via crayons, via le formulaire complet. Et peut être via crayons si quelqu’un se penche dans le code pour voir ce qu’il faut modifier pour que ce soit plus large.

    Répondre à ce message

  • 1

    D’accord merci.
    Je cherche dans spip.net où est la doc sur les « boucle POUR »
    mais je ne trouve pas.

    Dans le glossaire il y a « Balises techniques » mais pas de lien actif.

    • La boucle POUR n’a jamais été officielle, j’avais oublié. Elle est censé être remplacé par DATA, qui est documenté ici.

      https://www.spip.net/fr_article6434.html

      Personnelement je trouve la syntaxe de POUR plus simple, elle est documenté avec Bonux (mais livré en standard dans les versions récentes de SPIP)

    Répondre à ce message

  • 1

    Bonjour,
    J’arrive à afficher les réponses d’un formulaire éditable avec les crayons sur le site public
    mais je n’arrive pas à comprendre comment ajouter devant chaque valeur le nom du champ (label) car

    <BOUCLE_spip_formulaires(FORMULAIRES)>
    [<p>(#SAISIES|unserialize|saisies_chercher{input_1}|table_valeur{options/label})</p>]
    </BOUCLE_spip_formulaires>

    oblige à indiquer chaque champ si je comprend bien.
    Y-a-t-il une astuce pour chercher et afficher tous les labels d’un formulaire ?

    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