Carnet Wiki

Saisie de fichier d’un ou plusieurs fichers dans un CVT avec bigup ou CVTUpload

Version 2 — il y a 3 mois JLuc

En 2 parties issues de
-  https://discuter.spip.net/t/saisie-fichier-et-cvt-multi-etapes/174190/19
-  https://git.spip.net/spip/bigup/issues/4889
Voir aussi :
-  https://git.spip.net/spip/bigup/src/branch/master/README.md

Q(@E) : Dans un cvt avec 2 étapes, j’ai dans le formulaire de l’étape 1, une saisie de type fichier.
Dans la fonction verifier_1 qui vérifie cette étape 1, je fait des contrôles sur $_FILES[mavar].
Tout ça marche bien.

Ensuite j’ai une étape 2 sans saisie fichier.
Quand je veux lancer le traitement final du formulaire, je repasse dans verifier_1 et là ça plante car il ne connait plus $_FILES[mavar].
Donc je suppose aussi que dans la fonction de traitement final ce sera pareil.

D’où ma question, comment puis-je conserver les données de $_FILES[mavar] dans l’étape 2 et donc dans le traiter ?
Faut-il que je stocke via un set_request() les données de $_FILES[mavar] dans une variable et si oui lesquelles ?

A(@Maï) : Il faut le plugin CVT Upload et déclarer ta saisies fichiers comme étant utilisé par ton formulaire,
avec une fonction formulaires_xx_fichiers

Q : La saisie Fichiers de CVP Upload est dans un fieldset et pas un div englobant comme les autres saisies. C’est normal/voulu ou c’est à corriger ?

A  : la saisie permet 1 à N fichiers.
C’est voulu si on propose plusieurs input pour une meme saisie.

Discussion

@mar : J’ai du mal à comprendre l’intérêt de CVT Upload, quand Bigup gère aussi cela, notamment avec _bigup_rechercher_fichiers retourné dans le Charger du formulaire, et éventuellement la saisie #SAISIE_FICHIER ? Mais quelque chose m’échappe peut être

@Ra : Inversement j’ai du mal à comprendre pourquoi BigUp a refait une autre manière séparé et dépendante de son infrastructure (avec la lib JS etc), alors qu’il me semble que la mécanique CVT devrait savoir gérer la problématique « garder les fichiers uplaodés durant les hits PHP même quand on s’arrête durant verifier() ou du multi étapes » qu’on utilise BigUp ou pas (qui est une lib JS pour uplaoder par drag n drop), càd y compris avec des inputs files classiques.

C’était tout l’objet de CVT Upload de concevoir une extension à CVT qui gère cette problématique des FILES à garder en mémoire quelque soit les champs de fichiers, et même qu’on utilise Saisies ou pas : vraiment uniquement une extension à CVT seul. Pour être ensuite intégré au core donc vraiment à CVT, et qu’ensuite des plugins (BigUp, Saisies, autres) puissent utiliser ce mécanisme suivant leurs besoins.

Quant à #SAISIE_FICHIER, ce n’est du coup pas une vraie Saisies, impossible à utiliser du coup dans la vraie API PHP complète, et donc impossible à déclarer comme champs possibles au « constructeur » pour Formidable, Champs Extras, etc.

-------

@mar :

1) Bigup conserve les fichiers y compris avec les inputs files classiques…

2) Bigup par rapport à CVT Upload :

- a) Oui le stockage est différent (car si tu réaffiches ton CVT en CVT upload sans post / ajax, tu perds le fichier uploadé ; et je ne voulais pas cela pour les gros fichiers possibles avec Bigup — avec Bigup, tant que tu affiches le même formulaire — et les mêmes arguments — que tu as déjà envoyé un fichier ou des morceaux de fichier, il sait les retrouver ; CVT Upload lui liste les fichiers dans un _hidden spécifique).
Les 2 solutions sont valides, mais si tu veux envoyer des gros fichiers et que ça coupe à la moitié, c’est plus sympa en recommençant le formulaire de ne pas avoir tout perdu.

- b) non le JS n’est pas indispensable à Bigup. Il a besoin de form et formulaire_args et ne s’active que si la clé _bigup_rechercher_fichiers est passée dans le Charger

-----------

@ni : J’avais cherché à faire fonctionner la saisie bigup en php, et peut être vais je y arriver avec « _bigup_rechercher_fichiers retourné dans le Charger du formulaire ».

Testé en utilisant deux saisies bigup dans un CVT avec saisies générées en PHP

- Dans la fonction _saisies() :

	[
		'saisie'  => 'bigup',
		'options' => [
			'nom'             => 'unfichier',
			'label'           => 'Un fichier',
			'multiple'        => false,
			'accept'          => 'image/*',
			'previsualiser'   => 1,
			'env'             => true, /* Important ! */
		],
	],
	// (...)
					[
		'saisie'  => 'bigup',
		'options' => [
			'nom'             => 'desfichiers',
			'label'           => 'Des fichiers',
			'multiple'        => true,
			'accept'          => 'image/*',
			'previsualiser'   => 1,
			'env'             => true,
		],
	],	

Dans la fonction _charger() :

$valeurs = [
    	// ...
		'unfichier'                  => '',
		'desfichiers'                => '',
		'_bigup_rechercher_fichiers' => true,
	];

Avec ou sans multiétapes, les fichiers sont bien préservés en cas d’erreur ou de navigation précédent suivant.
Testé en ligne en uploadant des fichiers lourds (vidéos de 100Mo), il n’y a pas de réupload à chaque étape, comme je peux en avoir parfois avec CVT upload.

Et dans _traiter(), on reçoit bien un $_FILES peuplé comme il faut.

Et contrairement à ce que je faisais dans mes premiers essais, inutile de calculer les $form et $formulaire_args pour recalculer le token, les pipelines de bigup s’en occupent tous seuls.

C’était à priori 'env' => true qui me manquait dans la définition de la saisie.*

-----