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