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

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

spurious spaces

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                //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 * Injecter le html de presentation du fichier deja uploade avant chaque input file
139 * @param array $flux
140 * @return array mixed
141 */
142function cvtupload_formulaire_fond($flux) {
143        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
144        if (($flux['args']['je_suis_poste'] or isset($flux['args']['contexte']['cvtupload_precharger_fichiers']))
145                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
146        ) {
147                include_spip('inc/filtres');
148                if (isset($flux['args']['contexte']['_fichiers_precedents_html'])
149                        and $fichiers = $flux['args']['contexte']['_fichiers_precedents_html']
150                ) {
151                        foreach ($champs_fichiers as $champ) {
152                                // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
153                                if (isset($fichiers[$champ])) {
154                                        if (!is_array($fichiers[$champ])) {// Si c'est un champ unique
155                                                $flux['data'] = preg_replace(
156                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
157                                                        $fichiers[$champ],
158                                                        $flux['data']
159                                                );
160                                        } else { // Sinon c'est un multiple
161                                                foreach ($fichiers[$champ] as $cle => $html) {
162                                                        $regexp_par_cle = "#<input[^>]*name=['\"]${champ}(?:\&\#91;|\[)${cle}(?:\&\#93;|\])[^>]*>#i";// cherche les <input name="champ[cle]"> ou <input name="champ#91;cle#93;">
163                                                        $regexp_alternative = "#<input[^>]*name=['\"]${champ}[^>]*>#i";
164
165                                                        // On commence par chercher si on a un name avec clé numérique explicite
166                                                        $flux['data'] = preg_replace(
167                                                                $regexp_par_cle,
168                                                                $html,
169                                                                $flux['data'],
170                                                                1, // seul le premier trouvé est remplacé
171                                                                $remplacement_effectue
172                                                        );
173                                                        if ($remplacement_effectue==0) {// Si pas de name avec clef numérique correspondante, on modifie le premier name avec clé implicite
174                                                                $flux['data'] = preg_replace(
175                                                                        $regexp_alternative,
176                                                                        $html,
177                                                                        $flux['data'],
178                                                                        1 // seul le premier trouvé est remplacé
179                                                                );
180                                                        }
181                                                }
182                                        }
183                                }
184                        }
185                }
186        }
187        return $flux;
188}
189
190/**
191 * Ajouter la CSS dans le head du site public
192 * @param string $flux
193 * @param bool $prive
194 * @return string
195 */
196function cvtupload_insert_head_css($flux, $prive = false) {
197        if (!$prive) {
198                $css = timestamp(find_in_path('css/cvtupload.css'));
199
200                $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
201        }
202        return $flux;
203}
Note: See TracBrowser for help on using the repository browser.