source: spip-zone/_plugins_/csv_import/exec/csvimport_import.php @ 39368

Last change on this file since 39368 was 39368, checked in by gilles.vincent@…, 10 years ago
  • Il ne faut pas passer les paramètres par défaut en argument des appels de fonction (dans csvimport_importcsv())
  • un cas extrème dans lequel le foreach() plante : création d'un export sans se donner les droits
  • spip_fetch_array() est déprécié (sous 2.1)
  • indentation
File size: 17.1 KB
Line 
1<?php
2/*
3 * CSVimport
4 * Plug-in d'import csv dans les tables spip et d'export CSV des tables
5 *
6 * Auteur :
7 * Cedric MORIN
8 * notre-ville.net
9 * © 2005,2009 - Distribue sous licence GNU/GPL
10 *
11 */
12
13include_spip("inc/csvimport");
14include_spip("inc/presentation");
15include_spip('public/assembler');
16
17function csvimport_visu_extrait($nombre,$import_mode,$table,$id_form){
18        // Extrait de la table en commençant par les dernieres maj
19        if ($import_mode!='form')
20                return csvimport_table_visu_extrait($table,$nombre);
21        else {
22                $contexte = array('id_form'=>$id_form,'total'=>$nombre);
23                $out = recuperer_fond("fonds/tables_visu_extrait",$contexte);
24                return $out;
25        }
26}
27
28function csvimport_table_fields($mode,$table,$id_form){
29        $table_fields = array();
30        if ($mode=='table'){
31                $csvimport_tables_auth = csvimport_tables_auth();
32                if (isset($csvimport_tables_auth[$table]['field']))
33                        $table_fields=$csvimport_tables_auth[$table]['field'];
34                else
35                        $table_fields=array_keys($GLOBALS['tables_principales'][$table]['field']);
36                $table_fields=array_flip($table_fields);
37                foreach ($table_fields as $key=>$value) {
38                        $table_fields[$key] = $key;
39                }
40                return $table_fields;
41        }
42        if ($mode=='form' && $id_form){
43                include_spip('inc/forms');
44                $structure = Forms_structure($id_form);
45                $table_fields['id_donnee'] = 'id_donnee';
46                foreach ($structure as $champ=>$info){
47                        if ($info['type']!='multiple')
48                                $table_fields[$champ] = $info['titre'];
49                        else 
50                                foreach ($info['choix'] as $choix=>$value) {
51                                        $table_fields[$choix] = $value;
52                                }
53                }
54                return $table_fields;
55        }
56        return $table_fields;
57}
58
59function csvimport_import_step3(&$step, &$erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif){
60        $table = _request('table');     
61        $id_form = intval(_request('id_form'));
62        $retour = urldecode(_request('retour'));
63        $file_name = _request('file_name');
64        $tmp_name = _request('tmp_name');
65        $size = _request('size');
66        $type = _request('type');
67        $delim = _request('delim');
68        $head = _request('head');
69        $ajouter = _request('ajouter');
70        $remplacer = _request('remplacer');
71        $assoc_field = _request('assoc_field');
72        $apercu = _request('apercu');
73       
74        $titre = _T("csvimport:import_csv",array('table'=>$table));
75       
76        if ($table===NULL && $id_form)
77                $import_mode='form';
78        else   
79                $import_mode='table';
80       
81        if ($step==3){
82                if (($remplacer)&&(_request('annule_remplace')))
83                        $step--;
84                else if (($ajouter)&&(_request('annule_ajoute')))
85                        $step--;
86                else if ($apercu!=NULL)
87                        $step--;
88                else if (($remplacer)&&(!isset($csvimport_replace_actif)))
89                        $step--;
90                else if (($ajouter)&&(!isset($csvimport_add_actif)))
91                        $step--;
92        }
93
94        if ($step==3){
95                if ( (!$file_name)||(!$tmp_name)||(!$size)||(!$type) )
96                         $erreur[$step][] = _T("csvimport:fichier_absent");
97
98                if (!$delim)
99                         $erreur[$step][] = _T("csvimport:delimiteur_indefini");
100                /*if (!isset($head))
101                         $erreur[$step][] = _L("Header non d&eacute;fini");*/
102                if (!count($assoc_field))
103                         $erreur[$step][] = _T("csv_import:correspondance_indefinie");
104                if (isset($erreur[$step])) $step--;
105        }
106       
107        if ($step==3){
108                if (!$head) $head = false;
109                $data = csvimport_importcsv($tmp_name, $head, $delim);
110                if ($data==false) {
111                  $erreur[$step][] = _T("csvimport:fichier_vide");
112                }
113                $table_fields = csvimport_table_fields($import_mode,$table,$id_form);
114                $new_assoc=csvimport_field_associate($data, $table_fields, $assoc_field);
115                $test=array_diff($new_assoc,$assoc_field);
116                if (count($test)>0){
117                        $erreur[$step][] = _T("csvimport:correspondance_incomplete");
118                }
119                if (isset($erreur[$step])) $step--;
120        }
121        if ($step==3){
122                $hidden['file_name'] = $file_name;
123                $hidden['tmp_name'] = $tmp_name;
124                $hidden['size'] = $size;
125                $hidden['type'] = $type;
126                $hidden['step'] = 3;
127                foreach($assoc_field as $key=>$value)
128                        $hidden["assoc_field[".csvimport_nettoie_key($key)."]"] = $value;
129                $hidden["delim"] = $delim;
130                $hidden["head"] = $head;
131
132                /*echo "<br />\n";
133                if (count($erreur)>0){
134                        echo "<div class='messages'>";
135                        foreach($erreur as $steper=>$desc)
136                                foreach($desc as $val)
137                                        echo "<strong>$steper::$val</strong><br />";
138                        echo "</div>\n";
139                }*/
140
141                if (($remplacer)&&(!_request('confirme_remplace'))){
142                        $hidden['remplacer'] = 'oui';
143                        $step3 .= $import_form_link;
144                        foreach($hidden as  $key=>$value)
145                                $step3 .= "<input type='hidden' name='$key' value='$value' />";
146                        // Extrait de la table en commencant par les dernieres maj
147                        $step3 .= "<ul><li class='editer_texte'>";
148                        $step3 .= csvimport_visu_extrait(5,$import_mode,$table,$id_form);
149                        $step3 .= "</li><li class='editer_texte'>";
150                        $step3 .= "<div class='explication'>"._T('csvimport:avertissement_remplacement')."</div>";
151                        $step3 .= csvimport_array_visu_assoc($data, $table_fields, $assoc_field, 5);
152                        $step3 .= "</li></ul>";
153                        $step3 .= "<p class='boutons'>";
154                        $step3 .= "<input type='submit' name='annule_remplace' value='"._T('annuler')."' class='submit' />";
155                        $step3 .= "</p>\n";
156                        $step3 .= "<p class='boutons iconedanger'>";
157                        $step3 .= "<input type='submit' name='confirme_remplace' value='"._T('csvimport:remplacer_toute_table')."' class='submit' />";
158                        $step3 .= "</p>\n";
159                        $step3 .= "</div></form>";
160                }
161                else if (($ajouter)&&(!_request('confirme_ajoute'))){
162                        $hidden['ajouter'] = 'oui';
163                        $step3 .= $import_form_link;
164                        // Extrait de la table en commencant par les dernieres maj
165                        $step3 .= csvimport_visu_extrait(5,$import_mode,$table,$id_form);
166
167                        $step3 .= csvimport_array_visu_assoc($data, $table_fields, $assoc_field, 5);
168                        if ($import_mode=='form')
169                                if (include_spip('inc/forms')){
170                                        Forms_csvimport_ajoute_table_csv($data, $id_form, $assoc_field, $err, true);
171                                        $step3 .= csvimport_show_erreurs($err);
172                                }
173                       
174                        $step3 .= "<div style='padding: 2px; color: black;'>&nbsp;";
175                        $step3 .= _T("csvimport:avertissement_ajout",array('table'=>$table));
176                        foreach($hidden as  $key=>$value)
177                                $step3 .= "<input type='hidden' name='$key' value='$value' />";
178                        $step3 .= "<p class='boutons'><input type='submit' name='annule_ajoute' value='"._T('annuler')."' class='submit' /> ";
179                        $step3 .= "<input type='submit' name='confirme_ajoute' value='"._T('csvimport:ajouter_donnees')."' class='submit' /></p>";
180                        $step3 .= "</div></form>";
181                }
182                else {
183                        // vidange de la table
184                        if (($remplacer)&&(_request('confirme_remplace'))){
185                                if ($import_mode=='table')
186                                        csvimport_vidange_table($table);
187                                elseif ($import_mode=='form')
188                                        if (include_spip('inc/forms'))
189                                                Forms_donnees_vide($id_form);
190                        }
191                        // le reste est identique que ce soit un ajout ou un remplace
192                        if (($remplacer)||($ajouter)){
193                                $err = array();
194                                if ($import_mode=='table')
195                                        $out = csvimport_ajoute_table_csv($data, $table, $assoc_field,$err);
196                                elseif ($import_mode=='form')
197                                        if (include_spip('inc/forms'))
198                                                Forms_csvimport_ajoute_table_csv($data, $id_form, $assoc_field, $err);
199
200                                // Extrait de la table en commencant par les dernieres maj
201                                $step3 .= csvimport_visu_extrait(10,$import_mode,$table,$id_form);
202
203                                if (count($err)){
204                                        $step3 .= bouton_block_invisible("erreurs");
205                                        $step3 .= _T("csvimport:erreurs_ajout_base",array('nb'=>count($err)));
206                                        $step3 .= debut_block_invisible("erreurs");
207                                        $step3 .= csvimport_show_erreurs($err);
208                                        $step3 .= fin_block();
209                                }
210                                else
211                                        $step3 .= csvimport_show_erreurs($err);
212                        }
213                }
214        }
215        return $step3;
216}
217function csvimport_import_step2(&$step, &$erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif){
218        $table = _request('table');     
219        $id_form = intval(_request('id_form'));
220        $retour = urldecode(_request('retour'));
221        $file_name = _request('file_name');
222        $tmp_name = _request('tmp_name');
223        $size = _request('size');
224        $type = _request('type');
225        $delim = _request('delim');
226        $head = _request('head');
227        $ajouter = _request('ajouter');
228        $remplacer = _request('remplacer');
229        $assoc_field = _request('assoc_field');
230        $apercu = _request('apercu');
231        if ($table===NULL && $id_form)
232                $import_mode='form';
233        else   
234                $import_mode='table';
235        if ($step==2){
236                if (!isset($_FILES))
237                        $erreur[$step][] = _T("csvimport:probleme_inextricable");
238                if (
239                        (!isset($_FILES['csvfile'])) &&( (!$file_name)||(!$tmp_name)||(!$size)||(!$type) )
240                )
241                         $erreur[$step][] = _T("csvimport:probleme_chargement_fichier");
242
243                if ((isset($_FILES['csvfile']))&&($_FILES['csvfile']['error']!=0))
244                        $erreur[$step][]=_T("csvimport:probleme_chargement_fichier_erreur",array("erreur" => $_FILES['csvfile']['error']));
245                if (isset($erreur[$step])) $step--;
246        }
247        if ($step==2){
248                if (!$head) $head = false;
249
250                if (isset($_FILES['csvfile'])){
251                        $file_name = $_FILES['csvfile']['name'];
252                        $tmp_name = $_FILES['csvfile']['tmp_name'];
253                        $size = $_FILES['csvfile']['size'];
254                        $type = $_FILES['csvfile']['type'];
255
256                        $dest = _DIR_SESSIONS.basename($tmp_name);
257                        move_uploaded_file( $tmp_name, $dest );
258                        $tmp_name = $dest;
259                }
260
261                if (!$delim){
262                        if ($type=="application/vnd.ms-excel")
263                                $delim = ";"; // specificite Excel de faire des fichiers csv avec des ; au lieu de ,
264                        else{
265                                $handle = fopen($tmp_name, "rt");
266                                $contenu = fread($handle, 8192);
267                                fclose($handle);
268                                if ($contenu!=FALSE){
269                                        if (substr_count($contenu,",")>=substr_count($contenu,";"))
270                                                $delim = ",";
271                                        else
272                                                $delim = ";";
273                                }
274                                else
275                                        $delim = ",";
276                        }
277                }
278                $data = csvimport_importcsv($tmp_name, $head, $delim);
279                if ($data==false) {
280                  $erreur[$step][] = _T("csvimport:fichier_vide");
281                  $step--;
282                }
283        }
284        $table_fields = csvimport_table_fields($import_mode,$table,$id_form);
285        if ($data && ($step==2))
286                $assoc_field=csvimport_field_associate($data, $table_fields, $assoc_field);
287        if ($step==2){
288                $hidden['file_name'] = $file_name;
289                $hidden['tmp_name'] = $tmp_name;
290                $hidden['size'] = $size;
291                $hidden['type'] = $type;
292                $hidden['step'] = 3;
293
294                $step2 .= csvimport_show_erreurs($erreur);
295                $step2 .= $import_form_link;
296                foreach($hidden as  $key=>$value)
297                        $step2 .= "<input type='hidden' name='$key' value='$value' />";
298                                       
299                $step2 .= "<ul><li class='editer_texte'>";
300                $step2 .= "<div class='explication'>"._T('csvimport:premieres_lignes',array('nb'=>5))."</div>";
301                $step2 .= csvimport_array_visu_extrait($data, /*$head*/true, 5);
302
303                $step2 .= "</li><li class='editer_texte'>";
304                $step2 .= "<p class='boutons'><input type='submit' name='apercu' value='"._T('previsualisation')."' class='submit' /></p>";
305                $step2 .= "</li>";
306
307                $step2 .= "<li><label for='separateur'>"._T("csvimport:caracteres_separation")."</label>";
308                $step2 .= "<input type='text' name='delim' id='separateur' class='text' style='width:2em;' maxlength='1' value='$delim' /></li>";
309                $step2 .= "<li><label for='entete'>"._L("csvimport:ligne_entete")."</label>";
310                $step2 .= "<input type='checkbox' name='head' id='entete' class='fondl' style='width:2em;' value='true'";
311                if ($head==true)
312                  $step2 .= " checked='checked'";
313                $step2 .= " /></li><li class='editer_texte'>";
314
315                $step2 .= csvimport_field_configure($data, $table_fields, $assoc_field);
316
317                $step2 .= "</li>\n";
318
319                $step2 .= "<li class='editer_texte'>";
320                $step2 .= csvimport_array_visu_assoc($data, $table_fields, $assoc_field, 5);
321                $step2 .= "</li></ul>\n";
322
323                if ($csvimport_add_actif) {
324                        $step2 .= "<p class='boutons'>";
325                        $step2 .= "<input type='submit' name='ajouter' value='"._T('csvimport:ajouter_table')."' class='submit' />";
326                        $step2 .= "</p>\n";
327                }
328
329                if ($csvimport_replace_actif) {
330                        $step2 .= "<p class='boutons iconedanger' style='margin-top:15px;'>";
331                        $step2 .= "<input type='submit' name='remplacer' value='"._T('csvimport:remplacer_toute_table')."' class='submit' />";
332                        $step2 .= "</p>\n";
333                }
334
335                $step2 .= "</div></form>";
336
337                return $step2;
338        }
339}
340function csvimport_import_step1(&$step, &$erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif){
341        $table = _request('table');     
342        $id_form = intval(_request('id_form'));
343        $retour = urldecode(_request('retour'));
344        $file_name = _request('file_name');
345        $tmp_name = _request('tmp_name');
346        $size = _request('size');
347        $type = _request('type');
348        $delim = _request('delim');
349        $head = _request('head');
350        $ajouter = _request('ajouter');
351        $remplacer = _request('remplacer');
352        $assoc_field = _request('assoc_field');
353        $apercu = _request('apercu');
354        if ($table===NULL && $id_form)
355                $import_mode='form';
356        else   
357                $import_mode='table';
358
359        if ($step==1){
360                $step1 = "<br />\n";
361                $step1 .= "<div style='float:$spip_lang_left'>";
362                $step1 .= csvimport_show_erreurs($erreur);
363
364                $hidden['head'] = 'true';
365                $hidden['step'] = 2;
366                $step1 .= "<form action='$import_link' method='post' enctype='multipart/form-data' class='formulaire_editer'><div>";
367                foreach($hidden as  $key=>$value)
368                        $step1 .= "<input type='hidden' name='$key' value='$value' />";
369                $step1 .= "<ul><li>";
370                $step1 .= "<label for='file_name'>"._T("csvimport:fichier_choisir")."</label>";
371                $step1 .= "<input type='file' name='csvfile' id='file_name' class='fichier' />";
372                $step1 .= "</li></ul>";
373                $step1 .= "<p class='boutons'><input type='submit' name='Valider' value='"._T('bouton_valider')."' class='submit' /></p>";
374                $step1 .= "</div></form></div>\n";
375        }
376        return $step1;
377}
378
379function exec_csvimport_import(){
380        global $spip_lang_right;
381        $assoc_field=array();
382        $table = _request('table');     
383        $id_form = intval(_request('id_form'));
384        $retour = urldecode(_request('retour'));
385        $step = _request('step');
386        $file_name = _request('file_name');
387        $tmp_name = _request('tmp_name');
388        $size = _request('size');
389        $type = _request('type');
390        $delim = _request('delim');
391        $head = _request('head');
392        $ajouter = _request('ajouter');
393        $remplacer = _request('remplacer');
394        $assoc_field = _request('assoc_field');
395        $apercu = _request('apercu');
396
397        if (!$step)
398                $step = 1;
399        if (!$retour)
400                $retour = generer_url_ecrire('csvimport_tous');
401       
402        $titre = _T("csvimport:import_csv",array('table'=>$table));
403        $icone = "../"._DIR_PLUGIN_CSVIMPORT."img_pack/csvimport-24.png";
404        $operations = array();
405
406        if ($table===NULL && $id_form) {
407                $import_mode='form';
408                $import_link = generer_url_ecrire("csvimport_import","id_form=$id_form&retour=".urlencode($retour));
409                $action = generer_url_ecrire("csvimport_import","id_form=$id_form&retour".urlencode($retour));
410                $import_form_link = "\n<form action='$action' method='post' class='formulaire_editer'><div>".form_hidden($action);
411                if (!include_spip('inc/autoriser'))
412                        include_spip('inc/autoriser_compat');
413                $is_importable = autoriser('administrer','form',$id_form);
414                $csvimport_replace_actif = true;
415                $csvimport_add_actif = true;
416        }
417        else {
418                $import_mode='table';
419                $import_link = generer_url_ecrire("csvimport_import","table=$table&retour=".urlencode($retour));
420                $action = generer_url_ecrire("csvimport_import","table=$table&retour".urlencode($retour));
421                $import_form_link = "\n<form action='$action' method='post' class='formulaire_editer'><div>".form_hidden($action);
422                $is_importable = csvimport_table_importable($table,$titre,$operations);
423       
424                if (in_array('replaceall',$operations))
425                        $csvimport_replace_actif = true;
426                if (in_array('add',$operations))
427                        $csvimport_add_actif = true;
428        }
429        $clean_link = $import_link;
430       
431        //
432        // Affichage de la page
433        //
434        $commencer_page = charger_fonction('commencer_page', 'inc');
435        pipeline('exec_init',array('args'=>$_GET,'data'=>''));
436               
437        echo $commencer_page($titre,"csvimport");
438       
439        echo debut_gauche('',true);
440       
441        $raccourcis = icone_horizontale(_T('csvimport:administrer_tables'), generer_url_ecrire("csvimport_admin"), "../"._DIR_PLUGIN_CSVIMPORT."img_pack/csvimport-24.png", "", false);
442        $raccourcis .= icone_horizontale(_T('csvimport:import_export_tables'), generer_url_ecrire("csvimport_tous"), "../"._DIR_PLUGIN_CSVIMPORT."img_pack/csvimport-24.png", "", false);
443
444        echo bloc_des_raccourcis($raccourcis);
445        echo pipeline('affiche_gauche',array('args'=>array('exec'=>'csvimport_import','table'=>$table),'data'=>''));
446       
447        echo creer_colonne_droite("",true);
448        echo pipeline('affiche_droite',array('args'=>array('exec'=>'csvimport_import','table'=>$table),'data'=>''));
449        echo debut_droite("",true);
450       
451        $erreur=array();
452       
453        if ($is_importable) {
454       
455                $hidden = array();
456               
457                $milieu = '';
458               
459                $milieu .= "<div class='entete-formulaire'>";
460                //
461                // Icones retour
462                //
463                if ($retour) {
464                        $milieu .= icone_inline(_T('icone_retour'), $retour, $icone, "rien.gif",$GLOBALS['spip_lang_left']);
465                }
466                $milieu .= gros_titre($titre,'', false);
467                $milieu .= "</div>";
468
469                $milieu .= "<div class='formulaire_spip'>";
470               
471                if($step<3){
472                        $milieu .= csvimport_visu_extrait(5,$import_mode,$table,$id_form);
473                }
474                // --- STEP 3
475                $milieu .= csvimport_import_step3($step, $erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif);
476               
477                // --- STEP 2
478                $milieu .= csvimport_import_step2($step, $erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif);
479       
480                // --- STEP 1
481                $milieu .= csvimport_import_step1($step, $erreur, $import_link, $import_form_link, $csvimport_replace_actif, $csvimport_add_actif);
482               
483                $milieu .= "</div>";
484               
485        }
486        else {
487                //
488                // Icones retour
489                //
490                if ($retour) {
491                        $milieu = "<br />\n";
492                        $milieu .= "<div style='float:$spip_lang_right'>";
493                        $milieu .= icone_inline(_T('icone_retour'), $retour, $icone, "rien.gif",$GLOBALS['spip_lang_left']);
494                        $milieu .= "</div>\n";
495                }
496        }
497       
498        echo pipeline('affiche_milieu',array('args'=>array('exec'=>'csvimport_import','table'=>$table),'data'=>$milieu));
499
500        echo fin_gauche(), fin_page();
501}
502
503?>
Note: See TracBrowser for help on using the repository browser.