This repository has been archived by the owner on Jun 30, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
bigup_fonctions.php
273 lines (252 loc) · 7.9 KB
/
bigup_fonctions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
<?php
/**
* Fonctions utiles au plugin Big Upload
*
* @plugin Big Upload
* @copyright 2015
* @author Matthieu Marcillaud
* @licence GNU/GPL
* @package SPIP\Bigup\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Compile la balise `#BIGUP_TOKEN` qui calcule un token
* autorisant l'envoi de fichiers par morceaux
*
* À utiliser à l'intérieur d'un formulaire CVT ou dans un fichier de saisies.
* Dans une utilisation dans 'saisies/', il faut transmettre `form` et `formulaire_args`
* du formulaire pour le calcul.
*
* Le token généré se base sur la valeur de l'attribut `name`
* de l'input que l'on peut recevoir soit :
*
* - en écriture html : `fichiers[images]`
* - en écriture comprise par Saisies : `fichiers/images`
*
* Si l'input est voué à recevoir plusieurs fichiers
* (attribut `multiple` et name avec `[]` tel que `fichiers[images][]`
* il faut aussi l'indiquer, soit:
*
* - en écriture html : `fichiers[images][]`
* - en écriture Saisies : `fichiers/images/`
*
* Par habitude d'usage avec le plugin Saisies, on accepte aussi
* une forme plus habituelle en transmettant un paramètre `multiple`
* (en 2è paramètre de la balise, valant par défaut `#ENV{multiple}`)
* indiquant que le token concerne un input recevant plusieurs fichiers.
* On l'écrit :
*
* - en écriture html : `fichiers[images]`
* - en écriture Saisies : `fichiers/images`
*
* La balise accepte 4 paramètres, tous automatiquement récupérés dans l'environnement
* s'ils ne sont pas renseignés :
*
* - nom : la valeur de l'attribut name. Défaut `#ENV{nom}`
* - form : le nom du formulaire. Défaut `#ENV{form}`
* - formulaire_args : hash des arguments du formulaire. Défaut `#ENV{formulaire_args}`
* - multiple : indication d'un champ multiple, si valeur 'oui' ou 'multiple'. Défaut `#ENV{multiple}`
*
* @syntaxe `#BIGUP_TOKEN{name, multiple, form, formulaire_args}`
* @example
* - `#BIGUP_TOKEN` utilisera `#ENV{nom}` en nom de champ par défaut
* - `#BIGUP_TOKEN{#ENV{nom}, #ENV{multiple}, #ENV{form}, #ENV{formulaire_args}}` : valeurs par défaut.
* - `#BIGUP_TOKEN{file}` : champ unique
* - `#BIGUP_TOKEN{file\[\]}` : champ multiple
* - `#BIGUP_TOKEN{file/}` : champ multiple
* - `#BIGUP_TOKEN{file, multiple}` : champ multiple
* - Le token sera calculé dans la saisie bigup :
* `[(#SAISIE{bigup, file, form, formulaire_args, label=Fichier, ... })]`
* - Le token est calculé dans l'appel :
* `[(#SAISIE{bigup, file, token=#BIGUP_TOKEN{file}, label=Fichier, ... })]`
*
* @see saisies/bigup.html Pour un usage dans une saisie.
* @see balise_SAISIE_FICHIER_dist()
* @note
* La signature complète est `#BIGUP_TOKEN{champ, multiple, form, formulaire_args}`
*
* La balise nécessite de connaître le nom du formulaire
* (par défaut `#ENV{form}` ainsi que le hash de ses arguments
* (par défaut `#ENV{formulaire_args}`.
*
* Si cette balise est utilisée dans une inclusion (tel que `#INCLURE` ou `#SAISIE`),
* il faut penser à transmettre à l'inclure `form` et `formulaire_args`.
* La balise `#SAISIE_FICHIER` s'en occupe.
*
* @balise
* @uses calculer_balise_BIGUP_TOKEN()
*
* @param Champ $p
* Pile au niveau de la balise
* @return Champ
* Pile complétée par le code à générer
**/
function balise_BIGUP_TOKEN($p){
if (!$_champ = interprete_argument_balise(1, $p)) {
$_champ = "@\$Pile[0]['nom']";
}
if (!$_multiple = interprete_argument_balise(2, $p)) {
$_multiple = "@\$Pile[0]['multiple']";
}
if (!$_form = interprete_argument_balise(3, $p)) {
$_form = "@\$Pile[0]['form']";
}
if (!$_form_args = interprete_argument_balise(4, $p)) {
$_form_args = "@\$Pile[0]['formulaire_args']";
}
$p->code = "calculer_balise_BIGUP_TOKEN($_champ, $_multiple, $_form, $_form_args)";
$p->interdire_scripts = false;
return $p;
}
/**
* Calcule un token en fonction de l'utilisateur, du champ, du formulaire…
*
* Retourne un token de la forme `champ:time:clé`
*
* @uses calculer_action_auteur()
* @see \Spip\Bigup\Flow::verifier_token()
*
* @param string $champ
* Nom du champ input du formulaire
* @param string|bool $multiple
* Indique si le champ est multiple
* @param string $form
* Nom du formulaire
* @param string $form_args
* Hash du contexte ajax du formulaire
* @return string|false
* String : Le token
* false : Erreur : un des arguments est vide.
**/
function calculer_balise_BIGUP_TOKEN($champ, $multiple, $form, $form_args) {
if (!$champ OR !$form OR !$form_args) {
spip_log("Demande de token bigup, mais un argument est vide", _LOG_ERREUR);
return false;
}
$time = time();
// le vrai nom du champ pour le token (truc/muche => truc[muche])
$champ = bigup_nom2name($champ);
// Ajouter [] s'il est multiple et s'il ne l'a pas déjà.
if (in_array($multiple, [true, 'oui', 'multiple'])) {
if (substr($champ, -2) != '[]') {
$champ = $champ . '[]';
}
}
include_spip('inc/securiser_action');
$token = $champ . ':' . $time . ':' . calculer_action_auteur("bigup/$form/$form_args/$champ/$time");
return $token;
}
/**
* Retrouve les fichiers correspondant à un name d'input donné, s'il y en a.
*
* @param array $fichiers
* @param string $nom
* Name utilisé, tel que 'oiseaux/bleus' ou 'oiseaux[bleus]'
* @param string $multiple
* Si contenu, le champ est considéré multiple
* @return array
*/
function bigup_lister_fichiers($fichiers, $nom, $multiple) {
if (!$fichiers or !$nom) {
return [];
}
// Cas particulier de nom tableau (truc[]) sans déclaration d’attribut multiple
if (substr($nom, -2) == '[]') {
$nom = substr($nom, 0, -2);
}
$nom = bigup_name2nom($nom);
if ($multiple) {
$liste = table_valeur($fichiers, $nom);
} else {
$liste = [ table_valeur($fichiers, $nom) ];
}
return is_array($liste) ? array_filter($liste) : [];
}
// Duplicat fonctions de saisies, pour eviter une dependance.
// A regler mieux que ca (dans le core ?)
/**
* Passer un nom en une valeur compatible avec un `name` de formulaire
*
* - toto => toto,
* - toto/truc => toto[truc],
* - toto[truc] => toto[truc]
*
* @param string $nom
* return string
**/
function bigup_nom2name($nom) {
if (false === strpos($nom, '/')) {
return $nom;
}
$nom = explode('/', $nom);
$premier = array_shift($nom);
$nom = implode('][', $nom);
return $premier . '[' . $nom . ']';
}
/**
* Passer un nom en une valeur compatible avec une classe css
*
* - toto => toto,
* - toto/truc => toto_truc,
* - toto[truc] => toto_truc
*
* @param string $nom
* return string
**/
function bigup_nom2classe($nom) {
return str_replace(array('/', '[', ']', '[', ']'), array('_', '_', '', '_', ''), $nom);
}
/**
* Passer un `name` en un format de nom compris de saisies
*
* - toto => toto,
* - toto[truc] => toto/truc,
* - toto[truc][] => toto/truc/
* - toto/truc => toto/truc
*
* @see saisie_nom2name() pour l'inverse.
* @param string $name
* @return string
**/
function bigup_name2nom($name) {
if (false === strpos($name, '[')) {
return $name;
}
$name = explode('[', str_replace(']', '', $name));
return implode('/', $name);
}
/**
* Retourne la liste des mimes types acceptés pour des logos / illustrations,
* tels qu’attendus par le champ accept.
* @return string
*/
function bigup_get_accept_logos() {
$extensions = $GLOBALS['formats_logos'];
$mimes = array_map('bigup_get_mime_type_extension', $extensions);
return implode(",", $mimes);
}
/**
* Transforme une extension en mime-type (de façon simpliste)
* @param string $extension
* @return string mime type
*/
function bigup_get_mime_type_extension($extension) {
$extension = strtolower($extension);
$mime = "image/$extension";
// cas particuliers
switch ($extension) {
case 'bmp':
$mime = "image/x-ms-bmp";
break;
case 'jpg':
$mime = "image/jpeg";
break;
case 'svg':
$mime = "image/svg+xml";
break;
case 'tif':
$mime = "image/tiff";
break;
}
return $mime;
}