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

Aucune discussion

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