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

Last change on this file since 103115 was 103115, checked in by rastapopoulos@…, 4 years ago

psr

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