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

Last change on this file since 110541 was 110541, checked in by cedric@…, 2 years ago

timestamp sur la css pour que les modifs soient prises en compte facilement

File size: 7.8 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
53                //Si le répertoire temporaire n'existe pas encore, il faut le créer.
54                $repertoire_tmp = sous_repertoire(_DIR_TMP.'cvtupload/');
55
56                // On récupère les anciens fichiers déjà postés
57                $infos_fichiers_precedents = _request('cvtupload_fichiers_precedents');
58                $infos_fichiers = array();
59
60                // Les demandes de suppression
61                $supprimer_fichier = _request('cvtupload_supprimer_fichier');
62                // On parcourt les champs déclarés comme étant des fichiers
63                foreach ($champs_fichiers as $champ) {
64                        // On commence par ne récupérer que les anciennes informations
65                        // Si ce champ de fichier est multiple, on décode chaque champ
66                        if (isset($infos_fichiers_precedents[$champ])) {
67                                if (is_array($infos_fichiers_precedents[$champ])) {
68                                        foreach ($infos_fichiers_precedents[$champ] as $cle => $fichier) {
69                                                if ($infos_decodees = decoder_contexte_ajax($fichier, $flux['args']['form'])) {
70                                                        $infos_fichiers[$champ][$cle] = $infos_decodees;
71                                                        $infos_fichiers[$champ][$cle]['infos_encodees'] = encoder_contexte_ajax($infos_decodees, $flux['args']['form']);
72
73                                                        // Si suppression ou un autre fichier uploadé en remplacement
74                                                        if (isset($supprimer_fichier[$champ][$cle])
75                                                                or (
76                                                                        isset($_FILES[$champ]['name'][$cle])
77                                                                        and $_FILES[$champ]['error'][$cle] === UPLOAD_ERR_OK
78                                                                )
79                                                        ) {
80                                                                supprimer_fichier($infos_fichiers[$champ][$cle]['tmp_name']);
81                                                                $name = $infos_fichiers[$champ][$cle]['name'];
82                                                                unset($infos_fichiers[$champ][$cle]);
83                                                                if (!count($infos_fichiers[$champ])) {
84                                                                        unset($infos_fichiers[$champ]);
85                                                                }
86                                                                if (isset($supprimer_fichier[$champ][$cle])) {
87                                                                        // On génère une erreur pour réafficher le form de toute façon
88                                                                        $erreurs["$champ"] = _T('cvtupload:erreur_fichier_supprime', array('nom' => $name));
89                                                                }
90                                                        }
91                                                }
92                                        }
93                                } // Si le champ est unique, on décode juste le champ
94                                elseif ($infos_decodees = decoder_contexte_ajax($infos_fichiers_precedents[$champ], $flux['args']['form'])) {
95                                        $infos_fichiers[$champ] = $infos_decodees;
96                                        $infos_fichiers[$champ]['infos_encodees'] = encoder_contexte_ajax($infos_decodees, $flux['args']['form']);
97
98                                        // Si suppression ou un autre fichier uploadé en remplacement
99                                        if (isset($supprimer_fichier[$champ])
100                                                or (
101                                                        isset($_FILES[$champ]['name'])
102                                                        and $_FILES[$champ]['error'] === UPLOAD_ERR_OK
103                                                )
104                                        ) {
105                                                supprimer_fichier($infos_fichiers[$champ]['tmp_name']);
106                                                $name = $infos_fichiers[$champ]['name'];
107                                                unset($infos_fichiers[$champ]);
108                                                if (isset($supprimer_fichier[$champ])) {
109                                                        // On génère une erreur pour réafficher le form de toute façon
110                                                        $erreurs["$champ"] = _T('cvtupload:erreur_fichier_supprime', array('nom' => $name));
111                                                }
112                                        }
113                                }
114                        }
115
116                        // On déplace le(s) fichier(s) dans notre dossier tmp de SPIP
117                        // Et on met à jour les infos par rapport aux anciennes versions
118                        if (isset($_FILES[$champ])
119                                and $infos = cvtupload_deplacer_fichier($_FILES[$champ], $repertoire_tmp, $flux['args']['form'], $champ)
120                        ) {
121                                if (isset($infos_fichiers[$champ])) {
122                                        $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
123                                        ksort($infos_fichiers[$champ]);
124                                } else {
125                                        $infos_fichiers[$champ] = $infos;
126                                }
127                        }
128                }
129                set_request('_fichiers', $infos_fichiers);
130                // On utilise ces infos pour générer le HTML et le garder pour charger()
131                cvtupload_generer_html($infos_fichiers);
132                cvtupload_modifier_files($infos_fichiers);//On modifier $_FILES pour que cela soit transparent pour les traitements futurs
133        }
134
135        return $flux;
136}
137
138/**
139 * Injecter le html de presentation du fichier deja uploade avant chaque input file
140 * @param array $flux
141 * @return array mixed
142 */
143function cvtupload_formulaire_fond($flux) {
144        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
145        if (($flux['args']['je_suis_poste'] or isset($flux['args']['contexte']['cvtupload_precharger_fichiers']))
146                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
147        ) {
148                include_spip('inc/filtres');
149                if (isset($flux['args']['contexte']['_fichiers_precedents_html'])
150                        and $fichiers = $flux['args']['contexte']['_fichiers_precedents_html']
151                ) {
152                        foreach ($champs_fichiers as $champ) {
153                                // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
154                                if (isset($fichiers[$champ])) {
155                                        if (!is_array($fichiers[$champ])) {// Si c'est un champ unique
156                                                $flux['data'] = preg_replace(
157                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
158                                                        $fichiers[$champ],
159                                                        $flux['data']
160                                                );
161                                        } else { // Sinon c'est un multiple
162                                                foreach ($fichiers[$champ] as $cle => $html) {
163                                                        $regexp_par_cle = "#<input[^>]*name=['\"]${champ}(?:\&\#91;|\[)${cle}(?:\&\#93;|\])[^>]*>#i";// cherche les <input name="champ[cle]"> ou <input name="champ#91;cle#93;">
164                                                        $regexp_alternative = "#<input[^>]*name=['\"]${champ}[^>]*>#i";
165
166                                                        // On commence par chercher si on a un name avec clé numérique explicite
167                                                        $flux['data'] = preg_replace(
168                                                                $regexp_par_cle,
169                                                                $html,
170                                                                $flux['data'],
171                                                                1, // seul le premier trouvé est remplacé
172                                                                $remplacement_effectue
173                                                        );
174                                                        if ($remplacement_effectue==0) {// Si pas de name avec clef numérique correspondante, on modifie le premier name avec clé implicite
175                                                                $flux['data'] = preg_replace(
176                                                                        $regexp_alternative,
177                                                                        $html,
178                                                                        $flux['data'],
179                                                                        1 // seul le premier trouvé est remplacé
180                                                                );
181                                                        }
182                                                }
183                                        }
184                                }
185                        }
186                }
187        }
188        return $flux;
189}
190
191/**
192 * Ajouter la CSS dans le head du site public
193 * @param string $flux
194 * @param bool $prive
195 * @return string
196 */
197function cvtupload_insert_head_css($flux, $prive = false) {
198        if (!$prive) {
199                $css = timestamp(find_in_path('css/cvtupload.css'));
200
201                $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
202        }
203        return $flux;
204}
Note: See TracBrowser for help on using the repository browser.