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

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

divers problème de gestion des index lorsqu'on corrige l'envoi d'un champ contenant plusieurs fichiers (https://contrib.spip.net/Envoyer-des-fichiers-avec-un-formulaire-Formidable#forum491833)

File size: 7.2 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] = $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
111                                        ksort($infos_fichiers[$champ]);
112                                }
113                                else {
114                                        $infos_fichiers[$champ] = $infos;
115                                }
116                        }
117                }
118                set_request('_fichiers',$infos_fichiers);
119                // On utilise ces infos pour générer le HTML et le garder pour charger()
120                cvtupload_generer_html($infos_fichiers);
121                cvtupload_modifier_files($infos_fichiers);//On modifier $_FILES pour que cela soit transparent pour les traitements futurs
122        }
123       
124        return $flux;
125}
126
127function cvtupload_formulaire_fond($flux) {
128        // Si ça a déjà été posté (après verifier()) et qu'il y a des champs fichiers déclarés
129        if (
130                ($flux['args']['je_suis_poste'] or isset($flux['args']['contexte']['cvtupload_precharger_fichiers']))
131                and $champs_fichiers = cvtupload_chercher_fichiers($flux['args']['form'], $flux['args']['args'])
132        ) {
133                include_spip('inc/filtres');
134                if (
135                        isset($flux['args']['contexte']['_fichiers_precedents_html'])
136                        and $fichiers = $flux['args']['contexte']['_fichiers_precedents_html']
137                ) {
138                        foreach ($champs_fichiers as $champ) {
139                                // Si le visiteur a bien réussi a charger un ou plusieurs fichiers dans ce champ
140                                if (isset($fichiers[$champ])) {
141                                        if (!is_array($fichiers[$champ])) {// Si c'est un champ unique
142                                                $flux['data'] = preg_replace(
143                                                        "#<input[^>]*name=['\"]${champ}[^>]*>#i",
144                                                        $fichiers[$champ],
145                                                        $flux['data']
146                                                );
147                                        }
148                                        else { // Sinon c'est un multiple
149                                                foreach ($fichiers[$champ] as $cle=>$html) {
150                                                        $regexp_par_cle = "#<input[^>]*name=['\"]${champ}(?:\&\#91;|\[)${cle}(?:\&\#93;|\])[^>]*>#i";// cherche les <input name="champ[cle]"> ou <input name="champ#91;cle#93;">
151                                                        $regexp_alternative = "#<input[^>]*name=['\"]${champ}[^>]*>#i";
152                                                       
153                                                        // On commence par chercher si on a un name avec clé numérique explicite
154                                                        $flux['data'] = preg_replace(
155                                                                $regexp_par_cle,
156                                                                $html,
157                                                                $flux['data'],
158                                                                1, // seul le premier trouvé est remplacé
159                                                                $remplacement_effectue
160                                                        );
161                                                        if ($remplacement_effectue==0) {// Si pas de name avec clef numérique correspondante, on modifie le premier name avec clé implicite
162                                                                $flux['data'] = preg_replace(
163                                                                        $regexp_alternative,
164                                                                        $html,
165                                                                        $flux['data'],
166                                                                        1 // seul le premier trouvé est remplacé
167                                                                );
168                                                        }
169                                                }
170                                        }
171                                }
172                        }
173                }
174        }
175        return $flux;
176}
177
178function cvtupload_insert_head_css($flux, $prive=false) {
179        if (!$prive) {
180                $css = find_in_path('css/cvtupload.css');
181
182                $flux .= "\n<link rel='stylesheet' href='$css' type='text/css' media='all' />\n";
183        }
184        return $flux;
185}
Note: See TracBrowser for help on using the repository browser.