source: spip-zone/_plugins_/csv_import/inc/csvimport.php @ 29644

Last change on this file since 29644 was 29644, checked in by kent1@…, 11 years ago

Gros update du plugin CSVImport avec au menu :

  • Version pour SPIP 2.0.X uniquement
  • Adaptation graphique le plus proche du reste de SPIP 2
  • Préparation pour le multilinguisme
  • La partie lecture des CSV est délaissée à SPIP-BONUX pour éviter de faire doublon (et donc on nécessite spip-bonux)

Tout test et retour de bug est le bienvenue comme toute traduction. Il serait peut être judicieux que ce plugin soit plus verbeux (explications à droite à gauche)

File size: 12.8 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("base/abstract_sql");
14include_spip("inc/charsets");
15include_spip("inc/importer_csv");
16
17function csvimport_tables_auth(){
18        if (isset($GLOBALS['meta']['csvimport_tables_auth']))
19                return unserialize($GLOBALS['meta']['csvimport_tables_auth']);
20        else 
21                return array();
22}
23
24function csvimport_table_importable($nom_table,&$titre,&$operations){
25        $csvimport_tables_auth = csvimport_tables_auth();
26        global $connect_statut;
27        $declared = false;
28        foreach($csvimport_tables_auth as $table=>$infos){
29          if (strcmp($table,$nom_table)==0){
30            $declared = true;
31            if (isset($infos['statut'])){
32                                if (!in_array($connect_statut,$infos['statut']))
33                        $declared = false;
34                        }
35                        if ($declared){
36                                if (isset($infos['titre']))
37                                        $titre .= $infos['titre'];
38                                if (isset($infos['operations']))
39                                  foreach($infos['operations'] as $op)
40                                    $operations[]=$op;
41                        }
42                }
43        }
44        return $declared;
45}
46
47function csvimport_afficher_tables($titre_table, $icone = '') {
48        $csvimport_tables_auth = csvimport_tables_auth();
49        global $connect_statut;
50
51        if (!$icone) $icone = "../"._DIR_PLUGIN_CSVIMPORT."img_pack/csvimport-24.png";
52
53        if (count($csvimport_tables_auth)) {
54                echo debut_cadre_enfonce($icone, true, '', $titre_table);
55               
56                echo "<table width='100%' cellpadding='3' cellspacing='0' border='0'>";
57
58                $num_rows = count($csvimport_tables_auth);
59
60                $ifond = 0;
61                $premier = true;
62
63                $compteur_liste = 0;
64                foreach($csvimport_tables_auth as $latable=>$info) {
65            $declared = true;
66            if (isset($info['statut'])){
67                                if (!in_array($connect_statut,$info['statut']))
68                        $declared = false;
69                        }
70                        if ($declared) {
71
72                                $maj_exist = true;
73                                $result = sql_select("maj",$latable,"","","maj DESC");
74                                if (!$result) {
75                                        $result = sql_select("*",$latable);
76                                        $maj_exist = false;
77                                }
78
79                                $nb_data=sql_count($result);
80                                $last_mod='';
81                                if ($maj_exist){
82                                        $row = sql_fetch($result);
83                                        $last_mod = $row['maj'];
84                                }
85
86                                $vals = '';
87                                $titre = $latable;
88                                if (isset($info['titre']))
89                                        $titre = $info['titre'];
90
91                                $importable = false;
92                                $exportable = false;
93                                if (isset($info['operations'])){
94                                  if ((in_array('add',$info['operations']))||(in_array('replaceall',$info['operations'])))
95                                                $importable = true;
96                                  if (in_array('export',$info['operations']))
97                                                $exportable = true;
98                                }
99
100                                $link = generer_url_ecrire("csvimport_import","table=$latable&retour=".urlencode(self()));
101                                if ($nb_data) {
102                                        $puce = 'puce-verte-breve.gif';
103                                }
104                                else {
105                                        $puce = 'puce-orange-breve.gif';
106                                }
107
108                                $s = "";
109                                if ($importable)
110                                        $s .= "<a href='$link'>";
111                                $s .= "<img src='"._DIR_IMG_PACK."$puce' width='7' height='7' border='0'>&nbsp;&nbsp;";
112                                $s .= strlen($titre)?typo($titre):$latable;
113                                if ($importable)
114                                        $s .= "</a>";
115                                $s .= " &nbsp;&nbsp;";
116                                $vals[] = $s;
117
118                                $s = "";
119                                if ($nb_data) {
120                                        $s .= _T("csvimport:nb_enregistrements",array('nb'=>$nb_data));
121                                        if ($last_mod)
122                                          $s .= " (" . $last_mod . ")";
123                                }
124                                $vals[] = $s;
125
126                                $s = "";
127                                if ($exportable && $nb_data){
128                                        $link = generer_url_ecrire("csvimport_telecharger","table=$latable&retour=".urlencode(self()));
129                                        $s .= "<a href='$link'>";
130                                        $s .= _T("bouton_download");
131                                        $s .= "</a>";
132                                }
133                                $vals[] = $s;
134
135                                $table[] = $vals;
136                        }
137                }
138
139                $largeurs = array('','','');
140                $styles = array('arial11', 'arial1', 'arial1');
141               
142                $liste = ''; 
143                foreach ($table as $t) {
144                        reset($largeurs);
145                        if ($styles) reset($styles);
146                        $res ='';
147                        while (list(, $texte) = each($t)) {
148                                $style = $largeur = "";
149                                list(, $largeur) = each($largeurs);
150                                if ($styles) list(, $style) = each($styles);
151                                if (!trim($texte)) $texte .= "&nbsp;";
152                                $res .= "\n<td" .
153                                        ($largeur ? (" style=\'width: $largeur" ."px;\'") : '') .
154                                        ($style ? " class=\"$style\"" : '') .
155                                        ">" . lignes_longues($texte) . "\n</td>";
156                        }
157               
158                        $liste .=  "\n<tr class='tr_liste'>$res</tr>";
159                }
160               
161                echo $liste;
162                echo "</table>";
163                echo "</div>\n";
164        }
165        $out = "<br />";
166        if (defined('_DIR_PLUGIN_FORMS')&&($GLOBALS['meta']['forms_base_version']>0.17)){
167                if (include_spip('inc/forms_tables_affichage'))
168                        $out .= afficher_tables_tous_corps('table');
169                else {
170                        include_spip('public/assembler');
171                        $contexte = array('type_form'=>'table','titre_liste'=>_T("forms:toutes_tables"),'couleur_claire'=>$GLOBALS['couleur_claire'],'couleur_foncee'=>$GLOBALS['couleur_foncee']);
172                        $out .= recuperer_fond("exec/template/tables_import_tous",$contexte);
173                }
174                echo $out;
175        }
176       
177        if (!count($csvimport_tables_auth) && !$out) {
178                echo _T("csvimport:aucune_table_declaree");
179        }
180}
181
182function csvimport_csv_champ($champ) {
183        $champ = preg_replace(',[\s]+,', ' ', $champ);
184        $champ = str_replace(',",', '""', $champ);
185        return '"'.$champ.'"';
186}
187
188function csvimport_csv_ligne($ligne, $delim = ',') {
189        return join($delim, array_map('csvimport_csv_champ', $ligne))."\r\n";
190}
191
192function csvimport_importcharset($texte){
193        return importer_csv_importcharset($texte);
194}
195
196function csvimport_importcsv($file, $head = 0, $delim = ",", $enclos = '"', $len = 10000) {
197        $importer_csv = charger_fonction('importer_csv','inc');
198        return $importer_csv($file, $head = false, $delim = ",", $enclos = '"', $len = 10000);
199}
200
201function csvimport_show_erreurs($erreur){
202        $output = "";
203        if (count($erreur)>0){
204                $output .= "<div class='messages'>";
205                foreach($erreur as $steper=>$desc)
206                        foreach($desc as $key=>$val)
207                                $output .=  "<strong>$steper::$key:$val</strong><br />";
208                $output .=  "</div>\n";
209        }
210        return $output;
211}
212
213function csvimport_table_visu_extrait($nom_table,$nombre_lignes = 0){
214        $maj_exist = true;
215        $limit = "";
216        if ($nombre_lignes > 0)
217          $limit = $nombre_lignes+1;
218        $result = sql_select("*",$nom_table,"","","maj DESC",$limit);
219        if (!$result) {
220                $result = sql_select("*",$nom_table,"","","",$limit);
221                $maj_exist = false;
222        }
223        $nb_data=sql_count($result);
224        if ($nombre_lignes==0)
225                $nombre_lignes = $nb_data;
226        $data_count = 0;
227        $head_set = false;
228        $nb_col = 0;
229        if($nb_data>0){
230                $ret .= "<table width='100%'>";
231                while (($row = sql_fetch($result))&&($data_count++<$nombre_lignes)){
232                        if (!$head_set){
233                                $ret .= "<tr>";
234                                foreach($row as $key=>$value){
235                                  $ret .= "<th>" . $key . "</th>";
236                                  $nb_col++;
237                                }
238                                $ret .= "</tr>\n";
239                                $head_set = true;
240                        }
241                        $ret .= "<tr>";
242                        foreach($row as $key=>$value)
243                          $ret .= "<td>" . $value . "</td>";
244                        $ret .= "</tr>\n";
245                }
246                if ($nb_data>$nombre_lignes){
247                        $num_rows = sql_count(sql_select("*",$nom_table));
248                        $ret .= "<tr><td colspan='$nb_col' style='border-top:1px dotted;'>"._T("csvimport:lignes_table",array('table'=>$nom_table,'nb_resultats'=>$num_rows))."</td></tr>\n";
249                }
250                $ret .= "</table>\n";
251        }
252        else
253          $ret = "<p>"._T("csvimport:table_vide", array('table'=>$nom_table))."</p>";
254         
255        return $ret;
256}
257
258function csvimport_array_visu_extrait($data, $head, $nombre_lignes = 0){
259        $output = "";
260        $data_count = 0;
261        $head_set = false;
262        $nb_col = 0;
263        if ($data!=false){
264                $output .= "<table width='100%'>";
265                foreach($data as $key=>$ligne) {
266                        if (($head==true)&&($head_set==false)){
267                                $output .= "<tr>";
268                                foreach($ligne as $key=>$value){
269                                  $output .= "<th>" . $key . "</th>";
270                                  $nb_col++;
271                                }
272                                $output .= "</tr>\n";
273                                $head_set = true;
274                        }
275                        else{
276                                $output .= "<tr>";
277                                foreach($ligne as $value){
278                                  $output .= "<td>" . $value . "</td>";
279                                }
280                                $output .= "</tr>\n";
281                        }
282                        if (($nombre_lignes>0)&&($data_count++>=$nombre_lignes))
283                          break;
284                }
285                if ($data_count>0)
286                  $output .= '<tr><td style="border-top:1px dotted" colspan="'.$nb_col.'">'._T("csvimport:lignes_totales_csv",array("nb"=>count($data))).'</td></tr>';
287                $output .= "</table>\n";
288        }
289        if ($data_count==0)
290          $output .= _T("csvimport:aucune_donnee");
291        return $output;
292}
293
294function csvimport_array_visu_assoc($data, $table_fields, $assoc_field, $nombre_lignes = 0){
295        $assoc=array_flip($assoc_field);
296
297        $output = "";
298        $data_count = 0;
299        $output .= "<table width='100%'>";
300        $output .= "<tr>";
301        foreach($table_fields as $key=>$value){
302          $output .= "<th>" . $value . "</th>";
303        }
304        $output .= "</tr>\n";
305       
306        $nb_col = 0;
307        if ($data!=false){
308                foreach($data as $key=>$ligne) {
309                        $nb_col = 0;
310                        $output .= "<tr>";
311                        foreach($table_fields as $key=>$value){
312                                $nb_col++;
313                                $kc = csvimport_nettoie_key($key);
314                               
315                                $output .= "<td>";
316                                if ((isset($assoc[$kc]))&&(isset($ligne[$assoc[$kc]])))
317                                $output .= $ligne[$assoc[$kc]];
318                                else
319                                        $output .= "&nbsp;";
320                                $output .= "</td>";
321                        }
322                        $output .= "</tr>\n";
323                        if (($nombre_lignes>0)&&(++$data_count>=$nombre_lignes))
324                          break;
325                }
326        }
327        if ($data_count>0)
328          $output .= '<tr><td style="border-top:1px dotted" colspan="'.$nb_col.'">'._T("csvimport:lignes_totales_csv",array("nb"=>count($data))).'</td></tr>';
329        $output .= "</table>";
330        return $output;
331}
332
333function csvimport_nettoie_key($key){
334        return importer_csv_nettoie_key($key);
335}
336
337function csvimport_field_associate($data, $table_fields, $assoc_field){
338        global $tables_principales;
339        $assoc=$assoc_field;
340        if (!is_array($assoc)) $assoc = array();
341        $csvfield=array_keys($data{1});
342        foreach($csvfield as $k=>$v){
343                $csvfield[$k] = csvimport_nettoie_key($v);
344        }
345        $csvfield=array_flip($csvfield);
346
347        // on enleve toutes les associations dont
348        // la cle n'est pas un csvfield
349        // la valeur n'est pas un tablefield
350        // l'un des deux est deja affecte
351        foreach ($assoc as $key=>$value){
352                $good_key = false;
353                $good_value = false;
354                if (isset($csvfield[$key])){
355                  $good_key = true;
356                }
357                if ((isset($table_fields[$value]))||($value==-1)){
358                  $good_value = true;
359                }
360                if (($good_key==false)||($good_value==false))
361                  unset($assoc[$key]);
362                else{
363                        unset($csvfield[$key]);
364                        if ($value!=-1) unset($table_fields[$value]);
365                }
366        }
367
368        //assoc auto des cles qui portent le meme nom
369        foreach(array_keys($csvfield) as $csvkey){
370                foreach(array_keys($table_fields) as $tablekey)
371                  if (strcasecmp($csvkey,$tablekey)==0){
372                                $assoc[$csvkey]=$tablekey;
373                                unset($csvfield[$csvkey]);
374                                unset($table_fields[$tablekey]);
375                        }
376        }
377        //assoc des autres dans l'ordre qui vient
378        $table_fields=array_keys($table_fields);
379        foreach(array_keys($csvfield) as $csvkey){
380                $assoc[$csvkey]=array_shift($table_fields);
381                if ($assoc[$csvkey]==NULL) $assoc[$csvkey]="-1";
382                unset($csvfield[$csvkey]);
383        }
384        return $assoc;
385}
386
387function csvimport_field_configure($data, $table_fields, $assoc){
388        $output = "";
389        $csvfield=array_keys($data{1});
390
391        $output .= "<table><tr><td>"._T("csvimport:champs_csv")."</td><td>"._T("csvimport:champs_table")."</td></tr>";
392        foreach($csvfield as $csvkey){
393                $csvkey = csvimport_nettoie_key($csvkey);
394                $output .=  "<tr>";
395                $output .=  "<td>$csvkey</td>";
396                $output .= "<td><select name='assoc_field[$csvkey]'>\n";
397                $output .= "<option value='-1'>"._T("csvimport:pas_importer")."</option>\n";
398                foreach($table_fields as $tablekey => $libelle){
399                        $output .= "<option value='$tablekey'";
400                        if ($assoc[$csvkey]==$tablekey)
401                          $output .= " selected='selected'";
402                        $output .= ">$libelle</option>\n";
403                }
404                $output .= "</select></td></tr>";
405        }
406        $output .= "</table>";
407        return $output;
408}
409
410/**
411 * Fonction de vidange de la table lors du remplacement des données
412 * 
413 * @return
414 * @param String $table Nom de la table
415 */
416function csvimport_vidange_table($table){
417        sql_delete($table);
418}
419
420function csvimport_ajoute_table_csv($data, $table, $assoc_field, &$erreur){
421        global $tables_principales;
422        $csvimport_tables_auth = csvimport_tables_auth();
423        $assoc = array_flip($assoc_field);
424        $desc = sql_showtable($table);
425        if (!isset($desc['field']) || count($desc['field'])==0){
426                $erreur[0][] = _T("csvimport:description_table_introuvable");
427                return;
428        }
429        if ($GLOBALS['mysql_rappel_nom_base'] AND $db = $GLOBALS['spip_mysql_db'])
430                $table = '`'.$db.'`.'.$table;
431
432       
433        $tablefield=array_keys($desc['field']);
434        $output = "";
435        // y a-t-il une cle primaire ?
436        if (isset($desc['key']["PRIMARY KEY"])){
437                $primaire = $desc['key']["PRIMARY KEY"];
438                // la cle primaire est-elle importee ?
439                if (in_array($primaire,$assoc_field))
440                  unset($primaire);
441        }
442        // y a-t-il un champ TIMESTAMP ?
443        $test=array_flip($desc['field']);
444        if (isset($test['TIMESTAMP']))
445          $stamp = $test['TIMESTAMP'];
446
447        if ($data!=false){
448                $count_lignes = 0;
449                foreach($data as $key=>$ligne) {
450                $count_lignes ++;
451                        $check = array_flip($tablefield);
452                        foreach($check as $key=>$value){
453                                $kc = csvimport_nettoie_key($key);
454                                if ((isset($assoc[$kc]))&&(isset($ligne[$assoc[$kc]]))){
455                                        $what[$key] = addslashes($ligne[$assoc[$kc]]);
456                                        unset($check[$key]);
457                                }
458                        }
459                        if ((isset($stamp))&&isset($check[$stamp])){
460                                $what[$stamp] = date('Y-m-d H:i:s');
461                        }
462                        if (is_array($what)) {
463                                $id_primary = sql_insertq($table, $what);
464                                if ($id_primary==0)
465                                  $erreur[$count_lignes][] = "ajout impossible ::$what::$with::<br />";
466                        }
467                        else
468                          $erreur[$count_lignes][] = "rien &agrave; ajouter<br />";
469                }
470        }
471}
472
473?>
Note: See TracBrowser for help on using the repository browser.