Envoyer des fichiers avec un formulaire Formidable

La version 3.0.0 du plugin Formidable permet de créer des formulaires comprenant des envois de fichiers. Cet article regroupe la documentation relative à cette fonctionnalité. Pour une présentation générale de Formidable, voir «Formidable, le générateur de formulaires».

Configuration requise

Afin de pouvoir accéder à la fonction d’envoi de fichiers il vous faut:

  • Le plugin CVTupload dans sa version 1.9.4 au minimum. Attention, il reste possible d’activer Formidable sans avoir ce plugin. Simplement, il sera alors impossible d’envoyer des fichiers avec Formidable.
  • L’extension PHP fileinfo.
  • Le plugin Formidable en version 3.0.0, lequel nécessite notamment:
    • le plugin Saisies en version 2.17.0 au minimum;
    • le plugin Vérifier en version 1.4.1 au minimum.

Configuration des fichiers à envoyer

Lors de la création d’un formulaire, il est possible de choisir un champ de type «Fichier(s)».

Insertion d'un nouveau champ d'envoi de fichiers
Insertion d’un nouveau champ d’envoi de fichiers

Ce type de champ possède un certain nombre de propriétés configurables. Certaines, telles le titre, sont communes à l’ensemble des champs proposés par Formidable. Nous ne nous attarderons pas dessus, et n’exposerons que les propriétés spécifiques au type de champ «Fichier(s)».

Accéder à la configuration d'un champ “Fichier(s)”
Accéder à la configuration d’un champ “Fichier(s)”

Nombre de fichiers

Dans la configuration du champ, l’onglet «Utilisation» permet de choisir le nombre de fichiers à envoyer pour ce champ. Par défaut, la valeur est 1.

Configuration du nombre de fichiers par champ
Configuration du nombre de fichiers par champ

Notez qu’il s’agit du nombre de fichiers pour ce champ, mais qu’il est possible d’ajouter des champs supplémentaires pour d’autres fichiers, ce qui permet de distinguer les fichiers selon les besoins.

Pour l’instant, chaque fichier est associé à un input unique, afin d’être compatible avec un maximum de navigateur. Dans le futur, des versions améliorées de la saisie pourront être disponibles pour améliorer l’ergonomie.

Exemple de champ permettant d'envoyer un seul fichier
Exemple de champ permettant d’envoyer un seul fichier
Exemple de champ permettant d'envoyer plusieurs fichiers
Exemple de champ permettant d’envoyer plusieurs fichiers

Notez que si un·e internaute triche et modifie le HTML afin d’envoyer plus de fichiers, le système n’enregistrera pas plus de fichiers que configurés.

Puisque chaque fichier est associé à un input unique, chaque input reçoit un label individuel. Il est cependant possible de désactiver ce label pour n’afficher que le label commun à l’ensemble des fichiers.

Validation

L’onglet « Validation » de la configuration du champ permet de régler les propriétés des fichiers envoyés.
Cet onglet est assez long, car il permet de choisir finement les types de fichiers autorisés à l’envoi.

Présentation globale des options de vérification d'un champ d'envoi de fichiers
Présentation globale des options de vérification d’un champ d’envoi de fichiers

Caractère obligatoire

La première option dans cet onglet, est, comme pour tous les champs, le caractère obligatoire ou non de l’envoi de fichier.

Notez que dans le cas d’un champ permettant d’envoyer plusieurs fichiers, on considère que l’obligation d’envoi est remplie à partir du moment où un fichier est envoyé. Si vous souhaitez imposer l’envoi de trois fichiers, il vous faut créer trois champs [1].

Type Mime et extension

Une première série de boutons radio permet de choisir types de fichiers sont autorisés:

  • Autoriser tous les types et extensions cette option est très déconseillée;
  • Autoriser tous les types Mime et extensions connues de SPIP dans sa table spip_types_documents [2];
  • Autoriser uniquement les les images web (gif, jpg, png) (.jpg, .png, .gif);
  • Autoriser uniquement les types et extensions sélectionnés parmi les cases à cocher; utile par exemple pour n’autoriser que l’envoi de pdf. Les cases à cocher de choix de type n’apparaissent que si on choisit cette option.

Notez les points suivants:

  • Dans tous les cas, Formidable zippera automatiquement les fichiers d’un type et/ou d’une extension absente de la table spip_types_documents, afin notamment d’empêcher son exécution sur le serveur.
  • Si vous choisissez l’option « Tous les types Mime et extension autorisés par SPIP » ou « Un type Mime associé à une extension précisée ci-dessous» la vérification se fera:
    • la plupart du temps, sur la base du type Mime détecté par PHP et de l’extension du fichier
    • lorsque PHP détecte un type Mime text/plain ou application/octet-stream, qui sont très génériques, sur la seule base de l’extension [3].

Taille du fichier

La taille du fichier est, de facto, limitée par la configuration de votre serveur. Souvent par défaut, 32 kio [4].

L’ami Marcimat travaille actuellement sur un projet «BigUp» qui permet d’envoyer des fichiers plus gros. Si cela est nécessaire pour vos besoins, le contacter.

En dehors même des limites techniques, il peut être utile de limiter pour des raisons éditoriales la taille des fichiers envoyés. Pour cela, il vous suffit de remplir le champ «taille» en indiquant une taille maximale en kio.

Notez ces deux points:

  • la vérification de la taille a lieu après l’envoi du fichier sur le serveur
  • la vérification de la taille se comprend fichier par fichier, et non pour l’ensemble des fichiers d’un même champ.

Dimension de l’image

Une dernière série de réglages permet de vérifier la dimension des images envoyées.

Configuration de la dimension d'une image
Configuration de la dimension d’une image

Notez qu’il faut dans ce cas s’assurer que le document envoyé est bien une image en choisissant la bonne option auparavant. De plus, la fonction utilisée pour déterminer la taille de l’image est getimagesize(), qui ne comprend pas tous les types d’images.

Il est possible de préciser une largeur maximum (en pixels) et une hauteur maximum (en pixels). Une option permet également d’autoriser les images qui rentrent dans ces dimensions lorsqu’on les tourne de 90°.

Configuration des traitements

Comme pour tous les formulaires Formidable, un formulaire proposant l’envoi de fichier peut enregistrer les réponses et/ou les envoyer par courriel. Il n’y a rien de particulier à faire dans le cas qui nous occupe.

Confidentialité des fichiers

Au moment de l’enregistrement des traitements, Formidable vérifie s’il est possible d’enregistrer les fichiers à un endroit inaccessible par http. En cas de problème, un message est affiché, et dans ce cas l’envoi des fichiers ne pourra avoir lieu tant que le problème ne sera pas résolu. Voir plus bas, le paragraphe sur «Où les fichiers sont-ils stockés?».

Durée du lien par email

Il est conseillé de choisir l’enregistrement des réponses, et de ne pas se contenter de l’envoi par courriel. En effet, les fichiers ne sont pas joints dans le courriel, pour éviter des problèmes en cas de fichiers lourds, mais un lien y est inséré.

Le lien dans l’email expire 24h après l’envoi du formulaire. Il est possible d’augmenter ce délai en mettant la ligne suivant dans votre fichier mes_options.php:

define ('_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL', <une_durée_exprimée_en_seconde>);

Si la durée est mise sur 0, le lien est valable ad vitam aeternam.

Joindre directement les fichiers dans le courriel

Depuis la version 3.5.0, il est possible de joindre les fichiers directement dans le courriel.
Mais :
-  le lien entre les fichiers et les champ associé est perdu
-  les fichiers sont à la fin du courriel
-  si la taille (en Mio) dépasse la valeur de la constante _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL (par défaut 10), les fichiers ne sont pas joints et on repasse à une présentation classique par insertion d’un lien.

Utiliser le formulaire en tant que visiteur⋅euse

Une fois le formulaire publié sur le site public, le·la visiteur⋅euse peut le remplir et choisir les fichiers à envoyer.

Si ielle envoie une réponse avec des erreurs dans un champ, les fichiers déjà envoyés sont conservés, et il n’a pas besoin de les renvoyer. Ielle peut cependant décider, le cas échéant, de supprimer des fichiers déjà envoyés.

Lorsqu'un formulaire contient une erreur, les fichiers envoyés sont conservés
Lorsqu’un formulaire contient une erreur, les fichiers envoyés sont conservés

Si vous autorisez un·e visiteur·euse à modifier une réponse envoyée, le formulaire de modification de réponse lui propose automatiquement les fichiers qu’ielle a auparavant envoyés, avec la possibilité de supprimer – et donc de remplacer – des fichiers.
Notez que, comme pour les autres champs, il n’est fait aucune sauvegarde des anciennes valeurs.

Exemple de présentation d'un formulaire pour modifier une réponse déjà existante
Exemple de présentation d’un formulaire pour modifier une réponse déjà existante
Exemple de remplacement d'un fichier envoyé auparavant
Exemple de remplacement d’un fichier envoyé auparavant

Récupérer les fichiers envoyés

Les fichiers envoyés sont stockés dans un endroit normalement inaccessible au public. Dans la présentation des réponses, que ce soit dans l’espace privé de SPIP ou par courriel, un lien est inséré.
Ce lien est sécurisé de telle sorte que seules les personnes ayant le droit de voir les réponses ou ayant reçue le courriel puissent télécharger le fichier.

Présentation des fichiers envoyés dans la réponse d'un formulaire
Présentation des fichiers envoyés dans la réponse d’un formulaire

Notez que quelques changements sont effectués dans le nom des fichiers envoyés:

  • passage en minuscule;
  • suppression des accents;
  • remplacement des espaces par des tirets-bas;
  • suppression des points initiaux si le nom du fichier commence par un point;
  • ajout éventuel de suffixe pour distinguer les fichiers homonymes;
  • mise en zip du fichier s’il n’est pas d’un type ou d’une extension listée dans la table spip_types_documents

Dans l’accusé de réception, ces liens sont également insérés.
Cependant, il est possible désactiver cela en mettant la ligne suivante dans le fichier mes_options.php:

define('_FORMIDABLE_LIENS_FICHIERS_ACCUSE_RECEPTION', false);

Où les fichiers sont-ils stockés?

Cette partie de la documentation intéresse surtout les webmestres et non les administrateur·trice·s.

Dans tous les cas, les fichiers sont enregistrés dans le dossier config/fichiers/formidable, qui est automatiquement créé. Il vous faut donc transférer le dossier config/fichiers [5] lorsque vous migrez un site d’un serveur à un autre, et si possible sauvegarder régulièrement ce dossier.

Normalement SPIP s’assure que le dossier config n’est pas accessible en lecture à l’extérieur.
Par précaution, Formidable s’assure également de cela à chaque envoi du fichier.
Si ce critère n’est pas rempli, ou s’il est impossible d’écrire dans config/fichiers/formidable:

  • un message de log est enregistré dans formidable.log;
  • le fichier n’est pas déplacé dans config/fichiers;
  • un courriel est envoyé à l’adresse du webmestre configuré dans les réglages d’identité du site [6], ce qui lui permet de récupérer en urgence le fichier dans le dossier tmp/cvtupload;

À l’intérieur de config/fichiers/formidable, les fichiers sont stockés selon la structure suivante:

  • Si les réponses sont enregistrées en base de données, un dossier par formulaire, puis un dossier par réponse, puis un dossier par champ. Par exemple formulaire_1/reponse_2/fichiers_3.
  • Si les réponses ne sont pas enregistrées, mais simplement envoyées par courriel, nous utilisons un dossier timestamp : à l’intérieur de ce dossier est créé un dossier par réponse, dont le nom correspond au timestamp de la réponse. Au sein de chaque dossier de réponse, un dossier est créé par champs.

    Effacement des fichiers

    Ces fichiers sont effacés:

  • Lorsque la réponse est effacée de la base de données, quand Formidable efface les réponses «à la poubelle».
  • Lorsque le formulaire est effacé de la base de données quand Formidable efface les formulaires en statut «à la poubelle».
  • Pour les réponses qui ne sont pas stockées en base de données, lorsque les fichiers sont plus vieux que la constante _FORMIDABLE_EFFACEMENT_FICHIERS_EMAIL, qui par défaut est égale à la constante _FORMIDABLE_EXPIRATION_FICHIERS_EMAIL, qui est égale par défaut à 24*3600 secondes. Vous pouvez modifier cette constante en ajoutant dans votre fichier mes_options.php la ligne suivante:
    define ('_FORMIDABLE_EFFACEMENT_FICHIERS_EMAIL', <une_durée_exprimée_en_seconde>);

    Si la durée est mise à 0, les fichiers sont conservés ad vitam aeternam.
    Dans tous les cas, veillez à ce que la constante _FORMIDABLE_EFFACEMENT_FICHIERS_EMAIL soit au moins égale à _FORMIDABLE_EXPIRATION_FICHIERS_EMAIL.

Footnotes

[1En général, dans ce cas, chaque champ correspond à un besoin différent.

[2Voir l’article de la documentation de SPIP «Ajouter un type de document».

[3Nos tests en local nous ont montré qu’un fichier LaTeX, d’extension .tex, était détecté de type Mime application/octet-stream, ce qui n’est pas très utile comme information.

[4Un kibioctet (kio) contient 1024 octets, un kilooctet (ko) contient 1000 octets… il est vrai que SPIP considère qu’un kilooctets correspond à 1024 octets. Voir l’article Wikipédia à ce sujet.

[5Pour le moment, seul le plugin Formidable écrit dans config/fichiers, mais d’autres plugins pourraient le faire dans le futur.

updated on 7 January 2020

Discussion

16 discussions

  • 1
    Fifouille

    Bonjour,

    Il m’est impossible de choisir le champs “Fichiers” . Il n’apparaît pas.

    Pouvez-vous m’orienter pour résoudre ce problème ?

    J’ai la version 4.4.0 du plugin Formidable.

    Merci

    Reply to this message

  • 1

    Bonjour,
    J’ai des erreurs dans les logs du serveur lorsqu’un formulaire est posté avec un fichier joint :

    [Mon Jun 29 13:58:51.640953 2020] [authz_core:error] [pid 28436:tid 22930138228480] [client 102.xxx.xxx.xx:0] AH01630: client denied by server configuration: /home/site/www/site.org/config/fichiers/formidable/formulaire_2/test.txt, referer: https://www.site.org/

    Les droits du fichier test.txt sont actuellement à “666”. Est-ce que c’est correct ?

    Merci

    • oui c’est normal. pour s’assurer que les fichiers ne sont pas accessibles en externes, formidable crée des fichiers bidons test.txt et essaie de les appeler. Et donc si le serveur rale, c’est que les fichiers sont pas accesibles et c’est bon signe :)

    Reply to this message

  • 2

    Bonsoir, et meilleurs vœux...
    J’affiche les réponses d’un formulaire dans un site public, mais le lien vers le fichier joint ne fonctionne que pour les administrateurs à priori (fonction formidable_recuperer_fichier), y a-t-il un moyen de le rendre fonctionnel également pour d’autres auteurs connectés (rédacteurs ou visiteurs) ? Merci d’avance.

    • La fonction vérifier le droit de voir une réponse, qui est défini par l’autorisation “voir” / “formulairesreponse”.

      Il faut donc surcharger. Cf la doc sur les autorisation
      https://programmer.spip.net/Creer-ou-surcharger-des

      Du reste, vous devriez utiliser la balise #AUTORISER pour vous assurer des autorisations.

      Exemple pour permettre de télécharger les réponses de toute les formulaires pour les personnes connectées.

              function autoriser_formulairesreponse_voir($faire, $type, $id, $qui, $opt) {
                      if (isset($qui['statut']) and $qui['statut']) {
                              return true;
                      } else {
                              return false;
                      }
              }

      Attention, il faut faire vraiemnt attention, en terme de confidentialité et autre, ce n’est pas top.

    • Bonjour, merci beaucoup pour ce retour. Je vais essayer ça. Comme ça ne concerne qu’un seul formulaire, je devrais pouvoir circonscrire les risques éventuels. Bon début de semaine.

    Reply to this message

  • 8

    Bonjour,
    Je voudrais que les liens vers les fichiers joints aux réponses dans les emails soient invalidés au bout d’un certain nombre de jours (env 5 jours) mais mon formulaire est paramétré pour que les réponses soient enregistrées en base.
    Et dans la description de ce plugin je lis :

    "Pour les réponses {{qui ne sont pas stockées en base de données,}} lorsque les fichiers sont plus vieux que la constante _FORMIDABLE_EFFACEMENT_FICHIERS_EMAIL, qui par défaut est égale à la constante _FORMIDABLE_EXPIRATION_FICHIERS_EMAIL, qui est égale par défaut à 24*3600 secondes. Vous pouvez modifier cette constante en ajoutant dans votre fichier mes_options.php la ligne suivante :
        define ('_FORMIDABLE_EFFACEMENT_FICHIERS_EMAIL', <une_durée_exprimée_en_seconde>);"

    Si je comprends bien il n’est alors pas possible de modifier les 24 heures de validité du lien vers les docs dans les emails ?

    Merci

    • Lire plus haut dans la doc

      Il est conseillé de choisir l’enregistrement des réponses, et de ne pas se contenter de l’envoi par courriel. En effet, les fichiers ne sont pas joints dans le courriel, pour éviter des problèmes en cas de fichiers lourds, mais un lien y est inséré. Or, ce lien expire 24h après l’envoi du formulaire. Si vous choisissez cependant de ne pas enregistrer les réponses, il est possible d’augmenter ce délai en mettant la ligne suivant dans votre fichier mes_options.php :

          define ('_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL', <une_durée_exprimée_en_seconde>);
    • par défaut cette durée est de 24h. Au bout de 24h, on ne peut pas plus accéder via le mail aux fichiers, mais uniquement via l’interface d’administration

    • Oui c’est ce que j’avais compris. Je ne joins pas les fichiers à l’email mais je voudrais augmenter le temps de validité des liens reçus parce que 24h c’est court surtout si on ne bosse pas tous les jours.... sinon il faut se connecter au site, aller dans l’admin, télécharger le fichier,etc.. Les utilisateurs râlent.

    • bah du coup ce define est fait pour toi...

    • Ah. Je ne suis pas dans le cas cité :
      Pour les réponses qui ne sont pas stockées en base de données,
      puisque je stocke les réponses en base.

    • c’est surtout que tu lis la mauvaise ligne :) ce paragraphe concerne l’effacement des fichiers, ton besoin concerne la validité du lien. Cf d’ailleurs le paragraphe que je t’ai cité dans ma réponse.......

    • j’ai rajouté des intertitres pour que ce soit plus visible

    • Merci de ton aide, tout fonctionne !

    Reply to this message

  • 12

    Bonjour,
    Petit souci sur les fichiers joints.
    J’ajoute l’upload de fichier dans un formulaire FORMIDABLE.
    L’upload se passe sans problème, le fichier est bien enregistré dans config/fichiers/formidable
    Comme j’enregistre les réponses, depuis l’admin, j’ai bien le lien dans la réponse du formulaire concerné et le lien permet de bien visualisé le fichier uploadé.
    Par contre dans le mail de notification, le lien n’est pas bon.
    Une idée ?

    • Bonjour, j’ai aussi ce problème sur un site et je me demande si ce n’est pas lié au mode compact déclaré dans mes_options.php :

      if (!defined('_SAISIES_AFFICHAGE_COMPACT'))
      define('_SAISIES_AFFICHAGE_COMPACT', 'oui');
    • Plusieurs personnes m’ont sigalé ce problème, mais jusqu’à maintenant je ne l’ai jamais reproduit.... donc je n’arrive pas à le debuger.

    • mais l’hypothèse “c’est l’affichage compact qui pose problème” est à tester. Je vais voir ca.

    • j’ai testé en local, c’est pas ca. Je vais essayer de mettre des logs là où ca pourrait être utile pour debuger.

    • Dans la version 3.38.11 j’ai mis des logs pour essayer de comprendre le soucis.

      Il faudrait

      1) mettre le temps du debugage

      define('_LOG_FILTRE_GRAVITE', _LOG_DEBUG);

      dans le fichier mes_options.php
      2) faire un test denvoie de fichiers où le liens ne marche pas
      3) m’envoyer (en privé) les logs du fichier formidable.log

    • Ils sembleraient que certains lecteurs mails (outlook pour ne citer que lui) coupent les liens recus, ce qui expliquerait le problème. Mais je ne sais pas trop comment faire, à part repenser totalement le système de lien mail, ce que je n’ai pas franchement le temps de faire.

    • Bonjour, à priori, le problème est toujours présent. Je viens de mettre en place le système pour un de mes clients, et idem, l’upload est impeccable, les fichiers sont sur le serveur, mais l’accès est impossible, et ce n’est pas lié au client mail, car le problème se produit depuis le back-office, en lisant la réponse du formulaire Formidable (SPIP+plugins tous en dernière version). Merci :)

    • ah ! ca c’est plus étonnant.

      Bon, il n’empeche que pour que j’y vois plus clair, il me faudrait les logs, selon la procédure que j’ai décrite plus haut dans ce fil.

    • Volontiers, je ne vois par où je peux vous écrire en MP

    • monprenomsanstrema@monprenomsanstrema.net

    • Donc, histoire de boucler cette partie de commentaire, et dans l’éventualité où ça pourrait servir à quelqu’un d’autre, Formidable appelle la fonction mime_content_type() qui, dans notre configuration PHP n’existait pas et déclenchait une erreur 500, ce qui a été immédiatement résolu en installant l’extension fileinfo. Encore merci pour l’aide.

    • La toute dernière version de CVT upload vérifie que l’extension fileinfo est bien installé (uniquement si on est sous spip> 3.2)

    Reply to this message

  • 4
    Christophe

    Bonjour,

    J’ai un besoin auquel je ne trouve pas réponse dans la documentation de votre plugin ainsi que les différentes réponses ci-dessous.
    Je préfère préciser que je ne suis qu’un webmestre moyen et pas habile en php :)

    Je souhaiterai faire un formulaire d’avis et de commentaires avec Formidable, qui demanderait notamment une pièce jointe (image avatar de la personne qui répond au formulaire), afin de l’afficher ensuite sur le site. Les personnes qui répondent ne seront à aucun moment enregistrées sur le site en tant que visiteurs.

    Cette image sera affichée en faisant un traitement dans mon squelette sur les réponses du formulaire (par exemple avec FORMULAIRES_REPONSES_CHAMPS ?). Mais en lisant bien la doc, je comprends que l’image est stockée dans un répertoire inaccessible en lecture publique, qu’on ne peut pas récupérer par un chemin normal.

    Du coup je suis tombé sur cette réponse de Maïeul du 16 mars :

    3. Mais si je comprend bien ton problème tu ne veux pas récuperer une url, mais UN CHEMIN de fichier depuis le serveur. De ce point de vue là c’est la fonction formidable_generer_chemin_fichier() qui te permet de récupérer cela. C’est une fonction qui prend en paramètre unique un tableau :
    * formulaire => identifiant numérique du formulaire,
    * timestamp => timestamp de la réponse (si la réponse est uniquement envoyée par courriel)
    * reponse => identifiant numérique de la réponse
    * saisie => nom du champ formidable (type fichier_1)
    * fichier => nom du fichier

    J’avoue que je ne comprends pas trop comment procéder : je connais l’identifiant de mon formulaire, je peux connaître via une boucle le nom du fichier et le label de la saisie, mais où avoir l’identifiant numérique de la réponse ? (existe-il un id pour les réponses d’un formulaire formidable?)

    Merci de m’éclairer sur ce point :)

    • La boucle FORMULAIRES_REPONSES et la boucle FORMULAIRES_REPONSES_CHAMPS on un champ #ID_FORMULAIRES_REPONSE.

      Je t’invite à utiliser un outil comme phpmyadmin pour comprendre comment sont structurer les formulaires/réponses de formidable, un peu particulier.

      Cela étant, pour un tel besoin, il faudrait peut être mieux utiliser la possibilité d’ajouter des PJ aux “forums” de SPIP.

    • Christophe

      Merci Maïeul pour ce retour très rapide !

      Alors j’ai exploré un début de solution grâce au wiki trouvé ici (https://contrib.spip.net/Balises-et-boucles-avec-Formidable) et cela donne :

      <BOUCLE_formidable_id_form(FORMULAIRES){id_formulaire=1}>
      	<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}>
      			<BOUCLE_spip_reponses(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse=#ID_FORMULAIRES_REPONSE}{nom=fichiers_1}>
       
      				<img src="#URL_SITE_SPIP/[config/fichiers/formidable/formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/(#VALEUR|unserialize|table_valeur{0/nom})]">
       
      			</BOUCLE_spip_reponses>
      	</BOUCLE_spip_formulaires_rep>
      </BOUCLE_formidable_id_form>

      J’arrive bien à générer l’adresse url de l’image mais je ne peux bien sûr pas y accéder à cause des permissions sur config (et je ne vais pas supprimer les htaccess^^)

      Je vais détailler un peu plus mon besoin parce que je ne pense pas que les PJ aux forums de spip puissent m’aider (mais je ne connais pas bien).

      J’ai créé un formulaire formidable qui récupère différents champs renseignés pour générer des avis d’internautes avec gestion de microdata de type review. Je récupère donc le nom, prénom, titre du commentaire, texte du commentaire, notation de 1 à 5, un champ multiple avec le service à noter, un champ multiple pour préciser la langue, et le champ pour joindre un fichier joint pour faire l’avatar. J’utilise ensuite la plupart de ces valeurs dans différentes boucles pour l’interactivité de mon site (associer des avis à un produit par exemple, à des articles...)

      Existe-t-il un moyen de contourner le fonctionnement de Formidable pour le stockage des fichiers, et les stocker par exemple dans IMG? J’ai parcouru formidable_fichier.php mais je n’ose pas modifier le code car je risque de tout casser.

      Merci pour votre aide !

    • 1. Il y a la fonction / filtre formidable_generer_chemin_fichier() qui te permet de générer l’adresse plus proprement qu’en mettant /[config/fichiers/formidable/formulaire_#ID_FORMULAIRE/reponse_#ID_FORMULAIRES_REPONSE/#NOM/(#VALEUR|unserialize|table_valeur{0/nom})]
      2. Mais cela ne réglera pas ton problème d’accès : c’est fait exprès que ces fichiers ne soit pas accessibles. Tu peux bien sûr surcharger formidable_fichier, mais dans ce cas tu perdra la gestion des fichiers sécuriéses pour les autres formulaires formidables.

      Du coup tu as deux solutions:
      -  A mon avis le plus propre serait que tu crée ton propre formulaire CVT (donc sans utiliser formidable, en codant “à la main” le formulaire) en t’appuyant sur cvt-upload pour la gestion de l’envoi de fichier.
      -  Si tu conserve formidable, tu te crée une fonction qui te copie le fichier à un endroit accessible, en s’assurant de ne pas copier le fichier à chaque fois que tu requete la page (car sinin tu passe ton temps à copier le fichier). Pour cela tu peux t’appuer sur la fonction https://code.spip.net/autodoc/tree/ecrire/inc/documents.php.html#function_deplacer_fichier_upload() https://code.spip.net/autodoc/tree/ecrire/inc/documents.php.html#function_deplacer_fichier_upload

      Dans tous les cas il te faudra mettre la main dans un peu de code.

    • Christophe

      Bonjour Maïeul, et merci pour ton aide !

      J’imaginais quelque chose de semblable avec une solution recopiant les fichiers sans savoir trop où commencer, je vais donc explorer la piste que tu me donnes et mettre la main dans le cambouis php :)

      Je reviendrai poster mon code ici quand il sera prêt et testé.

      Merci encore!

    Reply to this message

  • 3

    Bonjour,

    Tout d’abord, merci pour cette fabuleuse évolution d’un Formidable plugin !

    J’aurais besoin de récuper l’url non sérialisée d’un fichier image téléversé via formidable pour des traitements ultérieurs comme l’inclusion dans un pdf généré depuis un autre formulaire CVT via tcpdf.

    Par exemple : un formulaire d’inscription généré par formidable réclame un justificatif.
    Dans un second temps, on interroge la db via la boucle formulaire_réponses pour alimenter la génération d’un pdf comprenant les données saisies ainsi que le justificatif concaténés.
    Le problème est que je n’arrive pas à obtenir une url utilisable depuis un formulaire SPiP.

    Auriez-vous une piste ?

    bonne soirée

    • Je ne suis pas certain de comprendres tous les besoins, d’autant qu’il est tard
      1. Concrètement, les fichiers sont stockés dans config/fichiers. Ces fichiers sont inaccessibles par url direct, pour des raisons de sécurité.
      2. Ils sont accessibles via une url d’action sécurisée, qui s’assure que la personne qui se connecte a bien le droit de lire ces fichiers. Sur le principe des action sécurisée, voire https://programmer.spip.net/Fonctionnement-des-actions. Concrètement l’url de l’action sécurisée est générée via formidable_generer_url_action_recuperer_fichier() et l’execution de cette action est dans action_formidable_recuperer_fichier()
      3. Mais si je comprend bien ton problème tu ne veux pas récuperer une url, mais UN CHEMIN de fichier depuis le serveur. De ce point de vue là c’est la fonction formidable_generer_chemin_fichier() qui te permet de récupérer cela. C’est une fonction qui prend en paramètre unique un tableau:

       * formulaire => identifiant numérique du formulaire,  
       * timestamp => timestamp de la réponse (si la réponse est uniquement envoyée par courriel)
       * reponse => identifiant numérique de la réponse
       * saisie => nom du champ formidable (type fichier_1)
       * fichier => nom du fichier

      dans inc/formidable_fichiers.php

    • Bonjour Maïeul,

      Merci beaucoup pour cet éclairage qui m’a permis d’arriver à mes fins : c’était bien le 3e point, récupérer le chemin depuis le serveur.
      Ah si j’avais pris la peine de lire un peu plus avant ce code, bien documenté qui plus est ... (air connu)

      Je te prie de bien vouloir excuser mon temps de réaction, je n’ai pu tester cela qu’aujourd’hui, tu as mis moins d’une heure à répondre, et moi, moins d’un mois ...

      Merci encore !

      Guillaume

    • L’essentiel est que ton besoin soi résolu.

    Reply to this message

  • 3

    Hello,

    Sur un site en 3.2 je reçois des message d’erreur lorsqu’un internaute étourdi joint le même fichier (même nom de fichier) 2 fois au formulaire.

    [ERREUR] Impossible de sauvegarder les fichiers de la réponse 830 au formulaire 2
    Récupérez le plus rapidement possible les fichiers temporaires suivants
    Pour le champ f :
    -  Le fichier temporaire : /home/public_html/site.org/tmp/cvtupload/formidable_pomMNj
    -  Ayant pour véritable nom : 20180220183459145.pdf

    Je vais voir les réponses dans l’admin de SPIP et lorsque je clique sur le document cassé Firefox crash complètement..

    Je vais (presque) immédiatement visiter le répertoire /tmp/cvtupload/ mais il est toujours vide.

    • Hum, je viens de tester en local. Cela ne pose aucun problème d’envoyer des fichiers avec le même nom. Je pencherais pour un problème côté serveur, mais c’est assez dure de savoir.

      Peux être fouiller dans les logs apaches?

    • Hello,

      Alors, voici ce que qu’il y a dans les logs pour cet envoi :

      http://spip.pastebin.fr/53299

      merci

    • ca se sont les logs de SPIP, pas ceux d’apaches.

      Je me demande si le problème ne viendrait pas de droit d’écriture sur config. Ils devrait être en 755.

    Reply to this message

  • 4

    Merci pour ce beau plugin :)

    J’ai essayé de le faire marcher avec le plugin champ extra (càd configurer un champ extra avec la saisie ’Fichiers’) mais ça ne fonctionne pas, le fichier n’est pas enregistré. Le champ SQL correspondant n’avait pas été créé en base, je l’ai créé à la main, mais aucune donnée n’est enregistrée dans le champ en question.

    Est-ce que j’ai râté quelque chose ?

    • Oui. Conceptuellement on distingue quatres choses
      -  cvt-upload qui permet de gérer des envois de fichiers dans un formulaire en faisant que si le formulaire est refusé une première fois pour x raison (champ mal rempli par ex) on ait pas besoin de renvoyer les fichiers
      -  la saisie cvt-upload, livrée en standard avec cvt-upload, qui gère l’affichage html (et qui pourrait être surchargée pour avoir quelque chose de plus moderne, par ex)
      -  la fonction de verification de la saisie (du plugins vérifier) qui s’assure que les règlages de type taille minimal, taille maximale etc sont respectés
      -  le devenir du fichier une fois envoyé, qui doit être réglé au cas par cas. Pour formidable, j’ai choisi une méthode à savoir stocker dans config/formulaires, mais cela n’est pas implémenté pour d’autres besoins, et pas pour champ extra.

      Donc il faudrait étendre champ extra pour avoir cette fonctionnalité, à mon avis sous la forme d’un plugin extension (à develloper de préférence sur la zone plutôt que sur github, plus communautaire). Mais auparavent il faudrait en discuter sur la zone pour voir ce qui serait optimal en terme de comportement.

    • Merci pour ton retour.

      Du coup, j’ai fait un plugin qui correspond à mon use-case, donner la possibilité d’uploader plusieurs logos par article : https://github.com/cahri/spip-logos.... C’est très expérimental.

    • Hehe.

      Les logos c’est un vieux serpent de mer chez SPIP. Cela fait une éternité qu’on parle de transformer cela en simple documents, avec juste des atttrbuts pour dire que c’est du logo.

      Hésite pas à proposer une doc.

    • Je ferai la doc dans le week-end si tout va bien :)

    Reply to this message

  • 9

    Bonjour Maïeul,

    Super heureuse que cette fonctionnalité soit enfin disponible. Je ne vais plus être obligée de choisir entre les super fonctionnalités de formidable et l’envoi de fichier proposé par le formulaire de contact avancé.
    Merci beaucoup pour votre travail et sa redistribution à tous.

    Toutefois pour pouvoir l’utiliser dans mon projet actuel, j’ai vraiment besoin que les pièces jointes soit incorporées dans le mail, est-ce qu vous travaillez sur cette possibilité ou, si ce n’est pas très compliqué, auriez-vous des pistes à me donner ?

    Merci pour tout.

    Julie

    • En fait le principal problème, si on ouvre cette possibilité, est que les PJ peuvent saturés le mail, et faire que celui n’arrive finalement jamais à destination.

      Du coup d’un point de vue ergonomique il faut réflechir à une options pour avoir un seul maximum.

    • Waouw, quelle célérité !
      Merci Maïeul.

      Bon, je ne suis pas sûre d’avoir bien compris à quoi il faut réfléchir 😅, mais voici mes éléments de réflexion.

      Dans mon monde idéal, j’imagine une checkbox : “joindre également les documents en pièce jointe”. Cette option pourrait être proposée dans une section “Transfert des fichiers” dans l’onglet validation du paramètres du champs Fichier.

      En complément, si il est possible de tester le poids total des fichiers avent leur envoi, un autre paramètre pourrait être ajouté sous la forme d’un input : poids total autorisé pour les pj (avec valeur par défaut 10mo, qui semble être aujourd’hui une norme assez commune).

      Par contre, si cela n’est pas possible, le poids total des fichiers devrait être anticipé par l’administrateur. Charge à lui de restreindre le nombre et le poids autorisés pour les fichiers si il veut être sûr de recevoir les messages envoyés avec des pj.

      Tout ça est bien sûr de la théorie et je suis malheureusement bien incapable de savoir comment concrétiser ces idées ....

    • En fait le principal problème est que le formulaire de config est déjà bien chargé.

      Bon, reste . à trouver du tps pour implémenter tt cela.

    • Une fois de plus merci pour votre réactivité.

      Comme je ne connais pas encore de formule magique pour allonger le temps ou devenir développeur, je peux seulement proposer mon aide comme testeur.

      N’hésitez pas !

      Julie

    • Pour la taille limite, je vais la fixer finalement via une constante (surchargeable) car c’est un réglage global pour le site.

    • La version 3.5 permet de joindre directement les fichiers dans l’email, mais ce n’est pas optimale je trouve, on perd les info de champs (ce serait trop complexe pour moi de faire les deux)

    • MERCI !!!!
      🙇😇👍😄

    • Je t’avais promis de tester, c’est chose faite et je te fais donc un petit retour :

      -  la variable _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL apparait dans l’interface de gestion des traitements alors que j’ai bien défini une valeur dans l’onglet Validation de la configuration du champs.
      -  dans le message reçu par email, une image contact-16.png apparait en pièce jointe.
      Je te joins des captures d’écran.

      Pour le reste tout est impéc. Encore Merci.

      Julie

    • Non, _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL est une constante définie en PHP qui n’a rien à voir avec la taille maximum des pièces jointes que le formulaire accepte. C’est la taille maximum des pièces jointes qui seront éventuellements envoyées par mail. Si cela dépasse _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL alors on retourne à l’ancien système. Ce qui est dérangeant c’est que je ne peux pas (pour le moment) faire que _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL soit automatiquement remplacée par sa valeur effective.

      Pour le contact 16 je suis étonné. Il faudrait m’envoyer le .yaml du formulaire pour que je puisse tester.

    Reply to this message

Ajouter un commentaire

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