source: spip-zone/_plugins_/cvt-upload/trunk/cvtupload_pipelines.php @ 114456

Last change on this file since 114456 was 114456, checked in by rastapopoulos@…, 21 months ago

CVT-Upload nettoie désormais toujours tout seul le FILES des fichiers en erreur quand il les détecte avec Saisies. Nécessite donc la dernière version de Saisies.

File size: 8.3 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) {
5        return;
6}
7
8include_spip('inc/cvtupload');
9
10/**
11 * Charger les informations qui correspondent aux champs fichiers du formulaire
12 * @param array $flux
13 * @return array mixed
14 */
15function cvtupload_formulaire_charger($flux) {
16        // S'il y a des champs fichiers de déclarés
17        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])) {
18                $contexte =& $flux['data'];
19                // On déclare le champ qui contiendra les infos en hidden
20                $contexte['cvtupload_fichiers_precedents'] = array();
21
22                // On met dans le contexte le HTML pour les fichiers précédemment postés
23                // cvtupload_generer_html() a prepare son contenu lors de son appel depuis verifier()
24                $forcer = _request('_cvtupload_precharger_fichiers_forcer');
25                if ($html_fichiers = cvtupload_generer_html()
26                  and $_fichiers = _request('_fichiers')) {
27                        $contexte['_fichiers_precedents_html'] = $html_fichiers;
28                }
29                elseif (isset($flux['data']['cvtupload_precharger_fichiers'])
30                  and ($flux['args']['je_suis_poste']==false or $forcer == true)) {
31                        $precharger_fichiers = charger_fonction('cvtupload_precharger_fichiers', 'inc');
32                        $contexte['_fichiers_precedents_html'] = cvtupload_generer_html($precharger_fichiers($flux['data']['cvtupload_precharger_fichiers'],$flux['args']['form']));
33                }
34        }
35
36        return $flux;
37}
38
39/**
40 * Verifier les contenus uploades sur les champs fichiers
41 * @param array $flux
42 * @return array
43 */
44function cvtupload_formulaire_verifier($flux) {
45        // S'il y a des champs fichiers de déclarés
46        if ($champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])) {
47                $erreurs =& $flux['data'];
48                include_spip('inc/filtres');
49                include_spip('inc/documents');
50                include_spip('inc/getdocument');
51                include_spip('inc/flock');
52                //Si le répertoire temporaire n'existe pas encore, il faut le créer.
53                $repertoire_tmp = sous_repertoire(_DIR_TMP.'cvtupload/');
54
55                // On récupère les anciens fichiers déjà postés
56                $infos_fichiers_precedents = _request('cvtupload_fichiers_precedents');
57                $infos_fichiers = array();
58
59                // Les demandes de suppression
60                $supprimer_fichier = _request('cvtupload_supprimer_fichier');
61                // On parcourt les champs déclarés comme étant des fichiers
62                foreach ($champs_fichiers as $champ) {
63                        // On commence par ne récupérer que les anciennes informations
64                        // Si ce champ de fichier est multiple, on décode chaque champ
65                        if (isset($infos_fichiers_precedents[$champ])) {
66                                if (is_array($infos_fichiers_precedents[$champ])) {
67                                        foreach ($infos_fichiers_precedents[$champ] as $cle => $fichier) {
68                                                if ($infos_decodees = decoder_contexte_ajax($fichier, $flux['args']['form'])) {
69                                                        $infos_fichiers[$champ][$cle] = $infos_decodees;
70                                                        $infos_fichiers[$champ][$cle]['infos_encodees'] = encoder_contexte_ajax($infos_decodees, $flux['args']['form']);
71
72                                                        // Si suppression ou un autre fichier uploadé en remplacement
73                                                        if (isset($supprimer_fichier[$champ][$cle])
74                                                                or (
75                                                                        isset($_FILES[$champ]['name'][$cle])
76                                                                        and $_FILES[$champ]['error'][$cle] === UPLOAD_ERR_OK
77                                                                )
78                                                        ) {
79                                                                supprimer_fichier($infos_fichiers[$champ][$cle]['tmp_name']);
80                                                                $name = $infos_fichiers[$champ][$cle]['name'];
81                                                                unset($infos_fichiers[$champ][$cle]);
82                                                                if (!count($infos_fichiers[$champ])) {
83                                                                        unset($infos_fichiers[$champ]);
84                                                                }
85                                                                if (isset($supprimer_fichier[$champ][$cle])) {
86                                                                        // On génère une erreur pour réafficher le form de toute façon
87                                                                        $erreurs["$champ"] = _T('cvtupload:erreur_fichier_supprime', array('nom' => $name));
88                                                                }
89                                                        }
90                                                }
91                                        }
92                                } // Si le champ est unique, on décode juste le champ
93                                elseif ($infos_decodees = decoder_contexte_ajax($infos_fichiers_precedents[$champ], $flux['args']['form'])) {
94                                        $infos_fichiers[$champ] = $infos_decodees;
95                                        $infos_fichiers[$champ]['infos_encodees'] = encoder_contexte_ajax($infos_decodees, $flux['args']['form']);
96
97                                        // Si suppression ou un autre fichier uploadé en remplacement
98                                        if (isset($supprimer_fichier[$champ])
99                                                or (
100                                                        isset($_FILES[$champ]['name'])
101                                                        and $_FILES[$champ]['error'] === UPLOAD_ERR_OK
102                                                )
103                                        ) {
104                                                supprimer_fichier($infos_fichiers[$champ]['tmp_name']);
105                                                $name = $infos_fichiers[$champ]['name'];
106                                                unset($infos_fichiers[$champ]);
107                                                if (isset($supprimer_fichier[$champ])) {
108                                                        // On génère une erreur pour réafficher le form de toute façon
109                                                        $erreurs["$champ"] = _T('cvtupload:erreur_fichier_supprime', array('nom' => $name));
110                                                }
111                                        }
112                                }
113                        }
114
115                        // On déplace le(s) fichier(s) dans notre dossier tmp de SPIP
116                        // Et on met à jour les infos par rapport aux anciennes versions
117                        if (isset($_FILES[$champ])
118                                and $infos = cvtupload_deplacer_fichier($_FILES[$champ], $repertoire_tmp, $flux['args']['form'], $champ)
119                        ) {
120                                if (isset($infos_fichiers[$champ])) {
121                                        $infos_fichiers[$champ] = $infos_fichiers[$champ] + $infos;//ne pas utiliser array_merge, car sinon cela réindexe le tableau, et cela nous perturbe pour le déplacement de $_FILES
122                                        ksort($infos_fichiers[$champ]);
123                                } else {
124                                        $infos_fichiers[$champ] = $infos;
125                                }
126                        }
127                }
128                set_request('_fichiers', $infos_fichiers);
129                // On utilise ces infos pour générer le HTML et le garder pour charger()
130                cvtupload_generer_html($infos_fichiers);
131                cvtupload_modifier_files($infos_fichiers);//On modifier $_FILES pour que cela soit transparent pour les traitements futurs
132        }
133
134        return $flux;
135}
136
137/**
138 * Nettoyer le FILES s'il y a des erreurs dans les fichiers
139 *
140 * @param array $flux
141 * @return array
142 */
143function cvtupload_saisies_verifier($flux) {
144        // On supprime de $_FILES les fichiers envoyés qui ne passent pas le test de vérification
145        include_spip('inc/cvtupload');
146        if (isset($flux['args']['erreurs_fichiers']) and is_array($flux['args']['erreurs_fichiers'])) {
147                foreach ($flux['args']['erreurs_fichiers'] as $champ => $erreurs) {
148                        cvtupload_nettoyer_files_selon_erreurs($champ, $erreurs);
149                }
150        }
151       
152        return $flux;
153}
154
155/**
156 * Injecter le html de presentation du fichier deja uploade avant chaque input file
157 * @param array $flux
158 * @return array mixed
159 */
160function cvtupload_formulaire_fond($flux) {
161        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
162        if (($flux['args']['je_suis_poste'] or isset($flux['args']['contexte']['cvtupload_precharger_fichiers']))
163                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
164        ) {
165                include_spip('inc/filtres');
166                if (isset($flux['args']['contexte']['_fichiers_precedents_html'])
167                        and $fichiers = $flux['args']['contexte']['_fichiers_precedents_html']
168                ) {
169                        foreach ($champs_fichiers as $champ) {
170                                // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
171                                if (isset($fichiers[$champ])) {
172                                        if (!is_array($fichiers[$champ])) {// Si c'est un champ unique
173                                                $flux['data'] = preg_replace(
174                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
175                                                        $fichiers[$champ],
176                                                        $flux['data']
177                                                );
178                                        } else { // Sinon c'est un multiple
179                                                foreach ($fichiers[$champ] as $cle => $html) {
180                                                        $regexp_par_cle = "#<input[^>]*name=['\"]${champ}(?:\&\#91;|\[)${cle}(?:\&\#93;|\])[^>]*>#i";// cherche les <input name="champ[cle]"> ou <input name="champ#91;cle#93;">
181                                                        $regexp_alternative = "#<input[^>]*name=['\"]${champ}[^>]*>#i";
182
183                                                        // On commence par chercher si on a un name avec clé numérique explicite
184                                                        $flux['data'] = preg_replace(
185                                                                $regexp_par_cle,
186                                                                $html,
187                                                                $flux['data'],
188                                                                1, // seul le premier trouvé est remplacé
189                                                                $remplacement_effectue
190                                                        );
191                                                        if ($remplacement_effectue==0) {// Si pas de name avec clef numérique correspondante, on modifie le premier name avec clé implicite
192                                                                $flux['data'] = preg_replace(
193                                                                        $regexp_alternative,
194                                                                        $html,
195                                                                        $flux['data'],
196                                                                        1 // seul le premier trouvé est remplacé
197                                                                );
198                                                        }
199                                                }
200                                        }
201                                }
202                        }
203                }
204        }
205        return $flux;
206}
207
208/**
209 * Ajouter la CSS dans le head du site public
210 * @param string $flux
211 * @param bool $prive
212 * @return string
213 */
214function cvtupload_insert_head_css($flux, $prive = false) {
215        if (!$prive) {
216                $css = timestamp(find_in_path('css/cvtupload.css'));
217
218                $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
219        }
220        return $flux;
221}
Note: See TracBrowser for help on using the repository browser.