Je suis en train d’expérimenter le nouveau champ “fichiers” du plugin formidable (un grand merci aux contributeurs pour cette nouvelle fonctionnalité !).
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, ma méthode est pour l’instant la suivante :
J’ai compris que 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 json comme dans l’exemple ci-dessous :
Je suis en train d’expérimenter le nouveau champ “fichiers” du plugin
formidable (un grand merci aux contributeurs pour cette nouvelle
fonctionnalité !).
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, ma méthode est pour l’instant la suivante :
J’ai compris que 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 json 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})]
Y a-t-il une meilleure méthode ? Toute suggestion est la bienvenue.
-Frédéric
1. L'enregistrement n'est pas au format json, mais au format "serialized" de PHP.
2. Tu ferais bien quand même d'envisager le cas de plus d'un fichier par champ. Pour cela une boucle POUR sur le résultat de la deserialization serait utile.
3. utilise #EVAL{_DIR_FICHIERS_FORMIDABLE} plutôt que de mettre config/fichiers/formidable/ en dur
4. Je n'ai pas prévu de fonction qui te donne le chemin d'un fichier en fonction de différent paramètres, donc pour le moment t'a solution m'a l'air la plus propre
1. L'enregistrement n'est pas au format json, mais au format "serialized"
de PHP.
merci de la correction
2. Tu ferais bien quand même d'envisager le cas de plus d'un fichier par
champ. Pour cela une boucle POUR sur le résultat de la deserialization
serait utile.
merci de la suggestion, du coup, ma solution complète qui couvre le cas
<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}{id_auteu
r=<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}>
<BOUCLE_nom_fichier(POUR){tableau #VALEUR}{cle IN nom}>
3. utilise #EVAL{_DIR_FICHIERS_FORMIDABLE} plutôt que de mettre
config/fichiers/formidable/ en dur
Je viens d'essayer cette balise, mais cela ne me renvoi que le nom de la
variable "_DIR_FICHIERS_FORMIDABLE " au lieu de son contenu. Pour le test, #EVAL{_DIR_IMG_PACK} me renvoi bien "prive/images/". Faut-il la renseigner
au préalable ?
4. Je n'ai pas prévu de fonction qui te donne le chemin d'un fichier en
fonction de différent paramètres, donc pour le moment t'a solution m'a
l'air la plus propre
Ok, merci !
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Tuesday, April 18, 2017 1:02 PM
À : Frederic Lohier <associate-it@ambascience-usa.org>; spip@rezo.net
Objet : Re: [Formidable - CVT Upload] Récupérer la liste des fichiers
d'une réponse à un formulaire
Le 18.04.17 à 18:13, Frederic Lohier a écrit :
Bonjour,
Je suis en train d’expérimenter le nouveau champ “fichiers” du plugin
formidable (un grand merci aux contributeurs pour cette nouvelle
fonctionnalité !).
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, ma méthode est pour l’instant la suivante :
J’ai compris que 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 json 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_FORM
ULAIRES_REPONSE/#NOM/(#VALEUR|unserialize|table_valeur{0/nom})]
Y a-t-il une meilleure méthode ? Toute suggestion est la bienvenue.
-Frédéric
1. L'enregistrement n'est pas au format json, mais au format "serialized"
de PHP.
2. Tu ferais bien quand même d'envisager le cas de plus d'un fichier par
champ. Pour cela une boucle POUR sur le résultat de la deserialization
serait utile.
3. utilise #EVAL{_DIR_FICHIERS_FORMIDABLE} plutôt que de mettre
config/fichiers/formidable/ en dur 4. Je n'ai pas prévu de fonction qui te
donne le chemin d'un fichier en fonction de différent paramètres, donc
pour le moment t'a solution m'a l'air la plus propre
1. L'enregistrement n'est pas au format json, mais au format "serialized"
de PHP.
merci de la correction
2. Tu ferais bien quand même d'envisager le cas de plus d'un fichier par
champ. Pour cela une boucle POUR sur le résultat de la deserialization
serait utile.
merci de la suggestion, du coup, ma solution complète qui couvre le cas
<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}{id_auteu
r=<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}>
<BOUCLE_nom_fichier(POUR){tableau #VALEUR}{cle IN nom}>
3. utilise #EVAL{_DIR_FICHIERS_FORMIDABLE} plutôt que de mettre
config/fichiers/formidable/ en dur
Je viens d'essayer cette balise, mais cela ne me renvoi que le nom de la
variable "_DIR_FICHIERS_FORMIDABLE " au lieu de son contenu. Pour le test, #EVAL{_DIR_IMG_PACK} me renvoi bien "prive/images/". Faut-il la renseigner
au préalable ?
4. Je n'ai pas prévu de fonction qui te donne le chemin d'un fichier en
fonction de différent paramètres, donc pour le moment t'a solution m'a
l'air la plus propre
Ok, merci !
-Frédéric
2. Tu peux économiser un niveau de boucle en utilisant |table_valeur
<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>
3. A oui, c'est à cause de l'endroit où sont définies ces constantes. La version 3.3.4 du plugin devrait t'éviter ce souci.
Merci, je confirme que la récupération de la variable
_DIR_FICHIERS_FORMIDABLE fonctionne avec la version 3.3.4 de CVT Upload.
La dernière version de boucle qui renvoi le chemin des fichiers téléversés
dans un plusieurs champ "fichiers" dans une réponse à un formulaire
"formisable" (pour ceux qui chercheraient à faire la même chose) :
Par contre, je viens de m'apercevoir que ce chemin ne me permettait pas de
créer un lien de téléchargement (sur une page qui n'est accessible qu'aux
administrateurs) puisque les fichiers sont stockés dans le répertoire
"config" de SPIP qui n'est pas accessible publiquement. J'ai vu dans le
fichier plugins/auto/formidable/v3.3.4/inc/formidable_fichiers.php qu'il y
avait une fonction "formidable_generer_url_action_recuperer_fichier" (ligne
472: Connexion · GitLab)
qui prend comme paramètres l'id du formulaire (j'ai), l'id de la réponse
(j'ai), une saisie (nom de la saisie ? ex: fichiers_2 ?) et un paramètre
"fichier" (nom du fichier ?).
Est-il possible d'utiliser cette fonction dans un squelette afin de générer
un lien de téléchargement de ces fichiers, à condition bien sûr que l'auteur
de la réponse, ou un administrateur soit connecté.
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Tuesday, April 18, 2017 5:10 PM
À : Frederic Lohier <associate-it@ambascience-usa.org>; spip@rezo.net
Objet : Re: [Formidable - CVT Upload] Récupérer la liste des fichiers d'une
réponse à un formulaire
Le 18.04.17 à 20:59, Frederic Lohier a écrit :
1. L'enregistrement n'est pas au format json, mais au format "serialized"
de PHP.
merci de la correction
2. Tu ferais bien quand même d'envisager le cas de plus d'un fichier
par champ. Pour cela une boucle POUR sur le résultat de la
deserialization serait utile.
merci de la suggestion, du coup, ma solution complète qui couvre le
cas
<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}{id_a
uteu
r=<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_repo
nse= #ID_FORMULAIRES_REPONSE}{nom IN fichiers_1, fichiers_2}>
<BOUCLE_liste_fichiers(POUR){tableau #VALEUR}>
<BOUCLE_nom_fichier(POUR){tableau #VALEUR}{cle IN nom}>
<br/>config/fichiers/formidable/formulaire_#ID_FORMULAIRE/reponse_#ID_
FORM
ULAIRES_REPONSE/#NOM/#VALEUR
</BOUCLE_nom_fichier>
</BOUCLE_liste_fichiers>
</BOUCLE_spip_reponses>
</BOUCLE_spip_formulaires_rep>
</BOUCLE_formidable_id_form>
3. utilise #EVAL{_DIR_FICHIERS_FORMIDABLE} plutôt que de mettre
config/fichiers/formidable/ en dur
Je viens d'essayer cette balise, mais cela ne me renvoi que le nom de
la
variable "_DIR_FICHIERS_FORMIDABLE " au lieu de son contenu. Pour le
test, #EVAL{_DIR_IMG_PACK} me renvoi bien "prive/images/". Faut-il la
renseigner au préalable ?
4. Je n'ai pas prévu de fonction qui te donne le chemin d'un fichier
en fonction de différent paramètres, donc pour le moment t'a solution
m'a l'air la plus propre
Ok, merci !
-Frédéric
2. Tu peux économiser un niveau de boucle en utilisant |table_valeur
<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>
3. A oui, c'est à cause de l'endroit où sont définies ces constantes. La
version 3.3.4 du plugin devrait t'éviter ce souci.
Merci, je confirme que la récupération de la variable
_DIR_FICHIERS_FORMIDABLE fonctionne avec la version 3.3.4 de CVT Upload.
La dernière version de boucle qui renvoi le chemin des fichiers téléversés
dans un plusieurs champ "fichiers" dans une réponse à un formulaire
"formisable" (pour ceux qui chercheraient à faire la même chose) :
Par contre, je viens de m'apercevoir que ce chemin ne me permettait pas de
créer un lien de téléchargement (sur une page qui n'est accessible qu'aux
administrateurs) puisque les fichiers sont stockés dans le répertoire
"config" de SPIP qui n'est pas accessible publiquement. J'ai vu dans le
fichier plugins/auto/formidable/v3.3.4/inc/formidable_fichiers.php qu'il y
avait une fonction "formidable_generer_url_action_recuperer_fichier" (ligne
472: Connexion · GitLab)
qui prend comme paramètres l'id du formulaire (j'ai), l'id de la réponse
(j'ai), une saisie (nom de la saisie ? ex: fichiers_2 ?) et un paramètre
"fichier" (nom du fichier ?).
Est-il possible d'utiliser cette fonction dans un squelette afin de générer
un lien de téléchargement de ces fichiers, à condition bien sûr que l'auteur
de la réponse, ou un administrateur soit connecté.
-Frédéric
oui, c'est une sécurité, pour que les données ne fuitent pas.
si dans ton fichier mes_fonctions.php tu met un include_spip('inc/formidable_fichiers'), tu pourras utiliser la fonction comme filtre (le premier argument de la fonction étant alors ce sur quoi le filtre s'applique. De mémoire le chemin ainsi généré est sécurisé mais vérifie quand même, peut etre je que fais portée la sécurité ailleurs.
Cette sécurité est très appréciable. Merci beaucoup pour l'astuce, ça
fonctionne !
D'après mes test, il faut être connecté (visiteur ou +) pour pouvoir
générer le lien. Le lien généré n'est valide que pour l'utilisateur
actuellement connecté (même session). Par contre, un visiteur peut générer
le lien d'un fichier d'une réponse d'un autre visiteur si le squelette le
permet (par exemple si je spécifie l'id d'un autre auteur/visiteur dans la
boucle). Ce n'est pas gênant dans mon cas d'utilisation puisqu'avant de
charger ce squelette, je vérifie que l'utilisateur est bien un
administrateur.
<BOUCLE_spip_formulaires_rep(FORMULAIRES_REPONSES){id_formulaire}{id_auteu
r=<id_de_l_auteur>}>
<BOUCLE_spip_reponses
(FORMULAIRES_REPONSES_CHAMPS){id_formulaires_reponse=#ID_FORMULAIRES_REPON
SE}{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_FORMU
LAIRES_REPONSE/#NOM/[(#VALEUR|table_valeur{nom})]<br>
<a
href="[(#VAL{#ID_FORMULAIRE}|formidable_generer_url_action_recuperer_fichi
er{#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>
-Frédéric
-----Message d'origine-----
De : Maïeul [mailto:maieul@maieul.net]
Envoyé : Wednesday, April 26, 2017 6:28 PM
À : Frederic Lohier <associate-it@ambascience-usa.org>; spip@rezo.net
Objet : Re: [Formidable - CVT Upload] Récupérer la liste des fichiers
d'une réponse à un formulaire
Le 27.04.17 à 00:07, Frederic Lohier a écrit :
Merci, je confirme que la récupération de la variable
_DIR_FICHIERS_FORMIDABLE fonctionne avec la version 3.3.4 de CVT Upload.
La dernière version de boucle qui renvoi le chemin des fichiers
téléversés dans un plusieurs champ "fichiers" dans une réponse à un
formulaire "formisable" (pour ceux qui chercheraient à faire la même
Par contre, je viens de m'apercevoir que ce chemin ne me permettait
pas de créer un lien de téléchargement (sur une page qui n'est
accessible qu'aux
administrateurs) puisque les fichiers sont stockés dans le répertoire
"config" de SPIP qui n'est pas accessible publiquement. J'ai vu dans
le fichier plugins/auto/formidable/v3.3.4/inc/formidable_fichiers.php
qu'il y avait une fonction
"formidable_generer_url_action_recuperer_fichier" (ligne
472: Connexion · GitLab
k/inc/formidable_fichiers.php) qui prend comme paramètres l'id du
formulaire (j'ai), l'id de la réponse (j'ai), une saisie (nom de la
saisie ? ex: fichiers_2 ?) et un paramètre "fichier" (nom du fichier
?).
Est-il possible d'utiliser cette fonction dans un squelette afin de
générer un lien de téléchargement de ces fichiers, à condition bien
sûr que l'auteur de la réponse, ou un administrateur soit connecté.
-Frédéric
oui, c'est une sécurité, pour que les données ne fuitent pas.
si dans ton fichier mes_fonctions.php tu met un
include_spip('inc/formidable_fichiers'), tu pourras utiliser la fonction
comme filtre (le premier argument de la fonction étant alors ce sur quoi
le filtre s'applique. De mémoire le chemin ainsi généré est sécurisé mais
vérifie quand même, peut etre je que fais portée la sécurité ailleurs.
le lien d'un fichier d'une réponse d'un autre visiteur si le squelette le
permet (par exemple si je spécifie l'id d'un autre auteur/visiteur dans la
boucle). Ce n'est pas gênant dans mon cas d'utilisation puisqu'avant de
charger ce squelette, je vérifie que l'utilisateur est bien un
administrateur.