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.

Merci de:
-  noter ici la date et le sens de votre intervention (en résumé, quelques mots max)
-  faire les réflexions et discussions dans le forum privé (on ne comprend rien aux pages wiki qui contiennent des discussions)


Afficher le label des réponses d’un formulaire

d’après http://contrib.spip.net/Formidable-le-generateur-de-formulaires#forum481173

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>

http://contrib.spip.net/Formidable-Presentation-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. Etat “en cours de développement, utilisé mais bugué”.

Voir la documentation du plugin formitable

Discussion

4 discussions

  • 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

      ?

    Reply to this 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.

    Reply to this message

  • 2

    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)

    • 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)

    Reply to this 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

    Reply to this message

Add a comment

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 / PostgreSQL
  • 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 apparait.

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.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom