source: spip-zone/_plugins_branche_stable_/_spip_1_9_0_/csv_import/inc/csvimport.php @ 4235

Last change on this file since 4235 was 4235, checked in by cedric@…, 15 years ago

import charset et pas d'htmlentities a l'affichage dans l'admin

File size: 14.3 KB
Line 
1<?php
2/*
3 * csvimport
4 * plug-in d'import csv dans les tables spip
5 *
6 * Auteur :
7 * Cedric MORIN
8 * notre-ville.net
9 * © 2005,2006 - Distribue sous licence GNU/GPL
10 *
11 */
12
13$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
14define('_DIR_PLUGIN_CSVIMPORT',(_DIR_PLUGINS.end($p)));
15
16include_spip("base/db_mysql");
17include_spip("base/abstract_sql");
18include_spip("inc/charsets");
19
20function acces_interdit() {
21        debut_page(_T('avis_acces_interdit'), "documents", "cvsimport");
22        debut_gauche();
23        debut_droite();
24        echo "<strong>"._T('avis_acces_interdit')."</strong>";
25        fin_page();
26        exit;
27}
28
29function csvimport_tables_auth(){
30        if (isset($GLOBALS['meta']['csvimport_tables_auth']))
31                return unserialize($GLOBALS['meta']['csvimport_tables_auth']);
32        else 
33                return array();
34}
35
36function csvimport_table_importable($nom_table,&$titre,&$operations){
37        $csvimport_tables_auth = csvimport_tables_auth();
38        global $connect_statut;
39        $declared = false;
40        foreach($csvimport_tables_auth as $table=>$infos){
41          if (strcmp($table,$nom_table)==0){
42            $declared = true;
43            if (isset($infos['statut'])){
44                                if (!in_array($connect_statut,$infos['statut']))
45                        $declared = false;
46                        }
47                        if ($declared){
48                                if (isset($infos['titre']))
49                                        $titre .= $infos['titre'];
50                                if (isset($infos['operations']))
51                                  foreach($infos['operations'] as $op)
52                                    $operations[]=$op;
53                        }
54                }
55        }
56        return $declared;
57}
58
59function csvimport_afficher_tables($titre_table, $icone = '') {
60        $csvimport_tables_auth = csvimport_tables_auth();
61        global $connect_statut;
62        global $couleur_claire, $couleur_foncee;
63        global $connect_id_auteur;
64
65        if (!$icone) $icone = "../"._DIR_PLUGIN_CSVIMPORT."/img_pack/csvimport-24.png";
66
67        if (count($csvimport_tables_auth)) {
68                if ($titre_table) echo "<div style='height: 12px;'></div>";
69                echo "<div class='liste'>";
70                echo bandeau_titre_boite2($titre_table, $icone, $couleur_claire, "black",false);
71                echo "<table width='100%' cellpadding='3' cellspacing='0' border='0'>";
72
73                $num_rows = count($csvimport_tables_auth);
74
75                $ifond = 0;
76                $premier = true;
77
78                $compteur_liste = 0;
79                foreach($csvimport_tables_auth as $latable=>$info) {
80            $declared = true;
81            if (isset($info['statut'])){
82                                if (!in_array($connect_statut,$info['statut']))
83                        $declared = false;
84                        }
85                        if ($declared) {
86
87                                $maj_exist = true;
88                                $query="SELECT maj FROM $latable ORDER BY maj DESC";
89                                $result = spip_query($query);
90                                if (!$result) {
91                                        $query="SELECT * FROM $latable";
92                                        $result = spip_query($query);
93                                        $maj_exist = false;
94                                }
95
96                                $nb_data=spip_num_rows($result);
97                                $last_mod='';
98                                if ($maj_exist){
99                                        $row = spip_fetch_array($result);
100                                        $last_mod = $row['maj'];
101                                }
102
103                                $vals = '';
104                                $titre = $latable;
105                                if (isset($info['titre']))
106                                        $titre = $info['titre'];
107
108                                $importable = false;
109                                $exportable = false;
110                                if (isset($info['operations'])){
111                                  if ((in_array('add',$info['operations']))||(in_array('replaceall',$info['operations'])))
112                                                $importable = true;
113                                  if (in_array('export',$info['operations']))
114                                                $exportable = true;
115                                }
116
117                                $link = generer_url_ecrire("csvimport_import","table=$latable&retour=".urlencode(self()));
118                                if ($nb_data) {
119                                        $puce = 'puce-verte-breve.gif';
120                                }
121                                else {
122                                        $puce = 'puce-orange-breve.gif';
123                                }
124
125                                $s = "";
126                                if ($importable)
127                                        $s .= "<a href='$link'>";
128                                $s .= "<img src='"._DIR_IMG_PACK."$puce' width='7' height='7' border='0'>&nbsp;&nbsp;";
129                                $s .= strlen($titre)?typo($titre):$latable;
130                                if ($importable)
131                                        $s .= "</a>";
132                                $s .= " &nbsp;&nbsp;";
133                                $vals[] = $s;
134
135                                $s = "";
136                                if ($nb_data) {
137                                        $s .= $nb_data . " " . _L("enregistrements");
138                                        if ($last_mod)
139                                          $s .= " (" . $last_mod . ")";
140                                }
141                                $vals[] = $s;
142
143                                $s = "";
144                                if ($exportable){
145                                        $link = generer_url_ecrire("csvimport_telecharger","table=$latable&retour=".urlencode(self()));
146                                        $s .= "<a href='$link'>";
147                                        $s .= _L("T&eacute;l&eacute;charger");
148                                        $s .= "</a>";
149                                }
150                                $vals[] = $s;
151
152                                $table[] = $vals;
153                        }
154                }
155
156                $largeurs = array('','','');
157                $styles = array('arial11', 'arial1', 'arial1');
158                echo afficher_liste($largeurs, $table, $styles);
159                echo "</table>";
160                echo "</div>\n";
161        }
162        else {
163                echo _L("Pas de tables d&eacute;clar&eacute;es pour l'import CSV");
164        }
165}
166
167function csvimport_csv_champ($champ) {
168        $champ = preg_replace(',[\s]+,', ' ', $champ);
169        $champ = str_replace(',",', '""', $champ);
170        return '"'.$champ.'"';
171}
172
173function csvimport_csv_ligne($ligne, $delim = ',') {
174        return join($delim, array_map('csvimport_csv_champ', $ligne))."\r\n";
175}
176
177/**
178 * Based on an example by ramdac at ramdac dot org
179 * Returns a multi-dimensional array from a CSV file optionally using the
180 * first row as a header to create the underlying data as associative arrays.
181 * @param string $file Filepath including filename
182 * @param bool $head Use first row as header.
183 * @param string $delim Specify a delimiter other than a comma.
184 * @param int $len Line length to be passed to fgetcsv
185 * @return array or false on failure to retrieve any rows.
186 */
187
188function csvimport_importcharset($texte){
189        return importer_charset($texte,'iso-8859-1');
190}
191
192function csvimport_importcsv($file, $head = false, $delim = ",", $enclos = '"', $len = 10000) {
193        $return = false;
194        $handle = fopen($file, "r");
195        if ($handle){
196                if ($head) {
197                        $header = fgetcsv($handle, $len, $delim);
198                        $header = array_map('csvimport_importcharset',$header);
199                }
200                while (($data = fgetcsv($handle, $len, $delim)) !== FALSE) {
201                        $data = array_map('csvimport_importcharset',$data);
202                        if ($head AND isset($header)) {
203                                foreach ($header as $key=>$heading) {
204                                        $row[$heading]=(isset($data[$key])) ? $data[$key] : '';
205                                }
206                                $return[]=$row;
207                        } else {
208                                $return[]=$data;
209                        }
210                }
211                fclose($handle);
212        }
213        return $return;
214}
215
216function csvimport_show_erreurs($erreur){
217        $output = "";
218        if (count($erreur)>0){
219                $output .= "<div class='messages'>";
220                foreach($erreur as $steper=>$desc)
221                        foreach($desc as $val)
222                                $output .=  "<strong>$steper::$val</strong><br />";
223                $output .=  "</div>\n";
224        }
225        return $output;
226}
227
228function csvimport_table_visu_extrait($nom_table,$nombre_lignes = 0){
229        $maj_exist = true;
230        $limit = "";
231        if ($nombre_lignes > 0)
232          $limit = " LIMIT " . ($nombre_lignes+1);
233        $query="SELECT * FROM $nom_table ORDER BY maj DESC" . $limit;
234        $result = spip_query($query);
235        if (!$result) {
236                $query="SELECT * FROM $nom_table $limit";
237                $result = spip_query($query);
238                $maj_exist = false;
239        }
240
241        $nb_data=spip_num_rows($result);
242        if ($nombre_lignes==0)
243                $nombre_lignes = $nb_data;
244        $data_count = 0;
245        $head_set = false;
246        $nb_col = 0;
247        echo "<table>";
248        while (($row = spip_fetch_array($result,SPIP_ASSOC))&&($data_count++<$nombre_lignes)){
249                if (!$head_set){
250                        echo "<tr>";
251                        foreach($row as $key=>$value){
252                          echo "<th>" . htmlentities($key) . "</th>";
253                          $nb_col++;
254                        }
255                        echo "</tr>\n";
256                        $head_set = true;
257                }
258                echo "<tr>";
259                foreach($row as $key=>$value)
260                  echo "<td>" . $value . "</td>";
261                echo "</tr>\n";
262        }
263        if ($nb_data>$nombre_lignes){
264                $query="SELECT COUNT(*) FROM $nom_table";
265                list($num_rows) = spip_fetch_array(spip_query($query));
266                echo "<tr><td colspan='$nb_col' style='border-top:1px dotted;'>$num_rows "._L("lignes")." ...</td></tr>\n";
267        }
268        echo "</table>\n";
269        if ($data_count==0)
270          echo _L("Table vide");
271}
272
273function csvimport_array_visu_extrait($data, $head, $nombre_lignes = 0){
274        $output = "";
275        $data_count = 0;
276        $head_set = false;
277        $nb_col = 0;
278        if ($data!=false){
279                $output .= "<table>";
280                foreach($data as $key=>$ligne) {
281                        if (($head==true)&&($head_set==false)){
282                                $output .= "<tr>";
283                                foreach($ligne as $key=>$value){
284                                  $output .= "<th>" . htmlentities($key) . "</th>";
285                                  $nb_col++;
286                                }
287                                $output .= "</tr>\n";
288                                $head_set = true;
289                        }
290                        else{
291                                $output .= "<tr>";
292                                foreach($ligne as $value){
293                                  $output .= "<td>" . $value . "</td>";
294                                }
295                                $output .= "</tr>\n";
296                        }
297                        if (($nombre_lignes>0)&&($data_count++>=$nombre_lignes))
298                          break;
299                }
300                $output .= "</table>\n";
301        }
302        if ($data_count==0)
303          $output .= _L("Pas de donn&eacute;e");
304        else
305          $output .= count($data) . _L(" lignes au total");
306        return $output;
307}
308
309function csvimport_array_visu_assoc($data, $table, $assoc_field, $nombre_lignes = 0){
310        global $tables_principales;
311        $csvimport_tables_auth = csvimport_tables_auth();
312        if (isset($csvimport_tables_auth[$table]['field']))
313                $tablefield=$csvimport_tables_auth[$table]['field'];
314        else
315                $tablefield=array_keys($tables_principales[$table]['field']);
316        $assoc=array_flip($assoc_field);
317
318        $output = "";
319        $data_count = 0;
320        $output .= "<table>";
321        $output .= "<tr>";
322        foreach($tablefield as $value){
323          $output .= "<th>" . htmlentities($value) . "</th>";
324        }
325        $output .= "</tr>\n";
326
327        if ($data!=false){
328                foreach($data as $key=>$ligne) {
329                        $output .= "<tr>";
330                        foreach($tablefield as $value){
331                          $output .= "<td>";
332                          if ((isset($assoc[$value]))&&(isset($ligne[$assoc[$value]])))
333                            $output .= $ligne[$assoc[$value]];
334                                else
335                                        $output .= "&nbsp;";
336                                $output .= "</td>";
337                        }
338                        $output .= "</tr>\n";
339                        if (($nombre_lignes>0)&&(++$data_count>=$nombre_lignes))
340                          break;
341                }
342        }
343        $output .= "</table>";
344
345        if ($data_count>0)
346          $output .= count($data) . _L(" lignes au total");
347        return $output;
348}
349
350function csvimport_field_associate($data, $table, $assoc_field){
351        global $tables_principales;
352        $csvimport_tables_auth = csvimport_tables_auth();
353        $assoc=$assoc_field;
354        if (!is_array($assoc)) $assoc = array();
355        $csvfield=array_keys($data{1});
356        $csvfield=array_flip($csvfield);
357
358        if (isset($csvimport_tables_auth[$table]['field']))
359                $tablefield=$csvimport_tables_auth[$table]['field'];
360        else
361                $tablefield=array_keys($tables_principales[$table]['field']);
362        $tablefield=array_flip($tablefield);
363
364        // on enleve toutes les associations dont
365        // la cle n'est pas un csvfield
366        // la valeur n'est pas un tablefield
367        // l'un des deux est deja affecte
368        foreach ($assoc as $key=>$value){
369                $good_key = false;
370                $good_value = false;
371                if (array_key_exists($key,$csvfield)){
372                  $good_key = true;
373                }
374                if ((array_key_exists($value,$tablefield))||($value==-1)){
375                  $good_value = true;
376                }
377                if (($good_key==false)||($good_value==false))
378                  unset($assoc[$key]);
379                else{
380                        unset($csvfield[$key]);
381                        if ($value!=-1) unset($tablefield[$value]);
382                }
383        }
384
385        //assoc auto des cles qui portent le meme nom
386        $accents=array('é','è','ê','à','ù',"ô","ç");
387        $accents_rep=array('e','e','e','a','u',"o","c");
388        foreach(array_keys($csvfield) as $csvkey){
389                foreach(array_keys($tablefield) as $tablekey)
390                  if (strcasecmp(str_replace($accents,$accents_rep,$csvkey),$tablekey)==0){
391                                $assoc[$csvkey]=$tablekey;
392                                unset($csvfield[$csvkey]);
393                                unset($tablefield[$tablekey]);
394                        }
395        }
396        //assoc des autres dans l'ordre qui vient
397        $tablefield=array_keys($tablefield);
398        foreach(array_keys($csvfield) as $csvkey){
399                $assoc[$csvkey]=array_shift($tablefield);
400                if ($assoc[$csvkey]==NULL) $assoc[$csvkey]="-1";
401                unset($csvfield[$csvkey]);
402        }
403        return $assoc;
404}
405
406function csvimport_field_configure($data, $table, $assoc){
407        $output = "";
408        global $tables_principales;
409        $csvimport_tables_auth = csvimport_tables_auth();
410
411        $csvfield=array_keys($data{1});
412        if (isset($csvimport_tables_auth[$table]['field']))
413                $tablefield=$csvimport_tables_auth[$table]['field'];
414        else
415                $tablefield=array_keys($tables_principales[$table]['field']);
416
417        $output .= "<table><tr><td>"._L("Champ CSV")."</td><td>"._L("Champ Table")."</td></tr>";
418        foreach($csvfield as $csvkey){
419                $output .=  "<tr>";
420                $output .=  "<td>$csvkey</td>";
421                $output .= "<td><select name='assoc_field[".htmlentities($csvkey,ENT_QUOTES)."]'>\n";
422                $output .= "<option value='-1'>"._L("Ne pas importer")."</option>\n";
423                foreach($tablefield as $tablekey){
424                        $output .= "<option value='$tablekey'";
425                        if ($assoc[$csvkey]==$tablekey)
426                          $output .= " selected='selected'";
427                        $output .= ">$tablekey</option>\n";
428                }
429                $output .= "</select></td></tr>";
430        }
431        $output .= "</table>";
432        return $output;
433}
434
435// vidange de la table
436function csvimport_vidange_table($table){
437        $query = "DELETE FROM $table";
438        $res = spip_query($query); // et voila ...
439}
440
441function csvimport_ajoute_table_csv($data, $table, $assoc_field, &$erreur){
442        global $tables_principales;
443        $csvimport_tables_auth = csvimport_tables_auth();
444        $assoc = array_flip($assoc_field);
445        $desc = spip_abstract_showtable($table);
446        if (!isset($desc['field']) || count($desc['field'])==0){
447                $erreur[0][] = "Description de la table introuvable";
448                return;
449        }
450        if ($GLOBALS['mysql_rappel_nom_base'] AND $db = $GLOBALS['spip_mysql_db'])
451                $table = '`'.$db.'`.'.$table;
452
453       
454        $tablefield=array_keys($desc['field']);
455        $output = "";
456        // y a-t-il une cle primaire ?
457        if (isset($desc['key']["PRIMARY KEY"])){
458                $primaire = $desc['key']["PRIMARY KEY"];
459                // la cle primaire est-elle importee ?
460                if (in_array($primaire,$assoc_field))
461                  unset($primaire);
462        }
463        // y a-t-il un champ TIMESTAMP ?
464        $test=array_flip($desc['field']);
465        if (isset($test['TIMESTAMP']))
466          $stamp = $test['TIMESTAMP'];
467
468        if ($data!=false){
469                $count_lignes = 0;
470                foreach($data as $key=>$ligne) {
471      $count_lignes ++;
472                        // creation de la cle primaire puis modif de l'enregistrement
473                        //if (isset($primaire)){
474                                $what = "(";
475                                $with = "(";
476                                $check = array_flip($tablefield);
477                                foreach($check as $key=>$value){
478                                  if ((isset($assoc[$key]))&&(isset($ligne[$assoc[$key]]))){
479                                                $what .= "$key,";
480                                                $with .= "'" . addslashes($ligne[$assoc[$key]]) . "',";
481                                                unset($check[$key]);
482                                        }
483                                }
484                                if ((isset($stamp))&&isset($check[$stamp])){
485                                        $what .= "$stamp,";
486                                        $with .= "NOW(),";
487                                }
488                                if ((strlen($what)>1)&&(strlen($with)>1)) {
489                                        $what = substr($what,0,strlen($what)-1) . ")";
490                                        $with = substr($with,0,strlen($with)-1) . ")";
491                                        $id_primary = spip_abstract_insert($table, $what, $with);
492                                        if ($id_primary==0)
493                                          $erreur[$count_lignes][] = "ajout impossible ::$what::$with::<br />";
494                                }
495                                else
496                                  $erreur[$count_lignes][] = "rien &agrave; ajouter<br />";
497                        //}
498                        // creation de l'enregistrement direct
499                        /*else {
500
501                        }*/
502                }
503        }
504}
505
506?>
Note: See TracBrowser for help on using the repository browser.