Valider 7a7f7e06 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

Créer une balise `#SAISIE_FICHIER` qui ajoute 2 calculs en plus par rapport à `#SAISIE` :

- le token (dans token) et
- la liste des fichiers complets en attente (dans fichiers)

Ajout de l'attribut accept sur l'input file pour pouvoir s'en servir à différent moments.
Utiliser l'attribut accept sur le bouton ouvrant le choix de fichier.
Envoyer 'accept' au serveur tant qu'à faire lors de l'upload des chunks…
Même s'il peut être fourvoyé par un malin, pour la plupart des utilisations,
ça permettra déjà un premier tri sur les fichiers (mais normalement le js doit s'en occuper)
parent 0f2e6d87
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+67 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

/**
 * Saisie fichier spécifique
 *
 * @plugin     Bigup
 * @copyright  2015
 * @author     marcimat
 * @licence    GNU/GPL
 * @package    SPIP\Bigup\Fonctions
 */

if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip('balise/saisie');



/**
 * Compile la balise `#SAISIE_FICHIER` qui retourne le code HTML de la saisie de formulaire indiquée.
 *
 * Identique à peu de choses près à la balise `#SAISIE`
 * - calcule le token en fonction du nom du champ : ajoute `token = #BIGUP_TOKEN{nom}`
 * - remplace `valeur = #ENV*{nom}` par `valeur = #ENV{_fichiers/nom}`
 *
 * @syntaxe `#SAISIE_FICHIER{type,nom[,option=xx,...]}`
 *
 * @param Champ $p
 * @return Champ
 */
function balise_SAISIE_FICHIER_dist($p) {

	// on recupere les parametres sans les traduire en code d'execution php
	$type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $type
	$titre       = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $titre

	// creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
	$env_titre   = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*')); // #ENV*{titre}

	// copier, pas cloner l'objet par référence
	$fichiers = unserialize(serialize($titre));
	$fichiers[0]->texte = '_fichiers/' . $fichiers[0]->texte;

	// creer #ENV{_fichiers/$titre}
	$fichiers = Pile::creer_balise('ENV', array('param' => array($fichiers)));

	// creer #BIGUP_TOKEN{$titre}
	$token = Pile::creer_balise('BIGUP_TOKEN', array('param' => array($titre)));

	// on modifie $p pour ajouter des arguments
	// {nom=$titre, valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
	$p = Pile::creer_et_ajouter_argument_balise($p, 'nom', $titre);
	$p = Pile::creer_et_ajouter_argument_balise($p, 'valeur', $env_titre);
	$p = Pile::creer_et_ajouter_argument_balise($p, 'fichiers', $fichiers); // ajouté par rapport à `#SAISIE`
	$p = Pile::creer_et_ajouter_argument_balise($p, 'token', $token);       // ajouté par rapport à `#SAISIE`
	$p = Pile::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
	$p = Pile::creer_et_ajouter_argument_balise($p, 'erreurs');
	$p = Pile::creer_et_ajouter_argument_balise($p, 'fond', 'saisies/_base');

	// on appelle la balise #INCLURE
	// avec les arguments ajoutes
	if (function_exists('balise_INCLURE')) {
		return balise_INCLURE($p);
	} else {
		return balise_INCLURE_dist($p);
	}
}
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -114,7 +114,7 @@ function bigup_formulaire_charger($flux) {
function bigup_formulaire_verifier($flux) {

	// enlever un fichier dont on demande sa suppression
	if ($identifiant = _request('_enlever_fichier')) {
	if ($identifiant = _request('bigup_enlever_fichier')) {
		$bigup = bigup_get_bigup($flux);
		if ($bigup->enlever_fichier($identifiant)) {
			// on n'affiche pas les autres erreurs
+13 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -27,21 +27,21 @@
				obligatoire=oui,
				rows=3})]

			[(#SAISIE{bigup, file,
				label=Un seul fichier possible,
				token=#BIGUP_TOKEN{file},
				_fichiers})]

			[(#SAISIE{bigup, files, 
				label=Plusieurs fichiers possibles,
				token=#BIGUP_TOKEN{files},
			[(#SAISIE_FICHIER{bigup, file,
				label=Un seul fichier possible})]

			[(#SAISIE_FICHIER{bigup, images, 
				label=Plusieurs fichiers images (par mime/type),
				accept=image/*,
				multiple=oui})]

			[(#SAISIE_FICHIER{bigup, extension, 
				label=Plusieurs fichiers pdf (par extension),
				multiple=oui,
				_fichiers})]
				accept=.pdf})]

			[(#SAISIE{bigup, autre,
				label=Un autre fichier,
				token=#BIGUP_TOKEN{autre},
				_fichiers})]
			[(#SAISIE_FICHIER{bigup, autre,
				label=Un autre fichier})]

		</div>

+4 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -23,6 +23,7 @@ $.fn.bigup = function() {
		var name = $(this).attr('name');
		var token = $(this).data('token');
		var multiple = $(this).prop('multiple');
		var accept = $(this).prop('accept');

		var $form = $(this).parents('form');
		var target = $form.attr('action');
@@ -38,7 +39,8 @@ $.fn.bigup = function() {
			query: {
				bigup_token: token,
				formulaire_action: formulaire_action,
				formulaire_action_args: formulaire_action_args
				formulaire_action_args: formulaire_action_args,
				accept: accept, // pourra servir au serveur pour éviter un stockage inutile
			}
		});

@@ -63,7 +65,7 @@ $.fn.bigup = function() {
		$zone.show();

		// Assigner la zone et son bouton à flow.
		flow.assignBrowse($zone.find('.dropfilebutton'));
		flow.assignBrowse($zone.find('.dropfilebutton'), false, !multiple, {accept: accept});
		flow.assignDrop($zone);

		// Téléverser aussitôt les fichiers déposés
+8 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff

#SET{multiple,#ENV{multiple}|=={oui}}

<B_fichiers>
<div class='bigup fichiers'>
<BOUCLE_fichiers(DATA){source tableau,#ENV{_fichiers/#ENV{nom}}}>
<BOUCLE_fichiers(DATA){source tableau, #FICHIERS}>
	<div class='fichier'>
		<div class='actions'>
			<button class='submit' type='submit' name='_enlever_fichier' value="#IDENTIFIANT">Enlever</button>
			<button class='submit' type='submit'
				name='bigup_enlever_fichier' value="#IDENTIFIANT"
				onclick="jQuery(this).parents('form').find('input,textarea,select').filter('[required]').prop('required', false); return true;">
				Enlever
			</button>
		</div>
		[(#EXTENSION|vignette)]
		<div class='infos'>
@@ -18,9 +23,8 @@
</div>
</B_fichiers>



<input type="file" name="#ENV{nom}" 
	class="file bigup[ (#ENV{class})]"
	[(#GET{multiple}|oui)multiple ]
	[accept="(#ENV{accept}|attribut_html)"]
	data-token="#ENV{token}" />