Subversion Repositories eFlore/Applications.cel

Rev

Rev 1404 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
417 aurelien 1
<?php
2
// In : utf8
3
// Out : utf8
4
 
540 david 5
// TODO : doublons
483 david 6
 
1321 aurelien 7
/**
480 david 8
Octobre 2010 David Delon.
9
Import d'observations dans le carnet en ligne à partir d'un fichier excel chargé par l'utilisateur
10
et liaison d'images déjà chargee aux observations ainsi crées.
417 aurelien 11
 
480 david 12
Nom des colonnes imposé, mais présence de toutes les colonnes non obligatoires, ordre non imposé
13
Aucune valeur dans les colonnes n'est obligatoire
14
Pour une ligne donnée, si tous les champs vides on ne fait rien, ou si seul le champ image est présent.
15
Si la seule différence entre deux lignes est la valeur de la colonne image, on considère que c'est la même observation à laquelle on associe plusieurs images.
16
Si au moins deux lignes (ou plus) sont complètement identiques on prend en compte une seule ligne (les doublons sont éliminés).
1321 aurelien 17
**/
445 david 18
 
480 david 19
// Nom des colonnes
20
 
445 david 21
define('COMMUNE','commune'); // soit un nom de commune, soit un code INSEE (5 chiffres), ou "nom de commune (numero departement)"
22
define('LIEUDIT','lieu-dit'); // Texte libre
23
define('STATION','station'); // Texte libre
24
define('MILIEU','milieu'); // Texte libre
25
define('LATITUDE','latitude'); // En decimal systeme WGS84
26
define('LONGITUDE','longitude'); // En decimal systeme WGS84
27
define('NOTES','notes'); // Texte libre
28
define('DATEOBS','date'); // date au format jj/mm/aaaa
29
define('ESPECE','espece'); // texte libre, nom latin, ou code nomenclatural (format BDNFFnn999999)
30
define('IMAGE','image'); //  nom des fichiers images préalablement uploadés sur le CEL séparés par des "/"
540 david 31
define('DEPARTEMENT','departement'); //  Texte libre
760 aurelien 32
define('TRANSMETTRE','transmettre'); //  "1" ou "oui", toute autre valeur (y compris vide) sera consideree comme "non""
445 david 33
 
540 david 34
 
480 david 35
// Resultat de l'analyse d'une ligne
445 david 36
define('LIGNE_VIDE',1); //
37
define('LIGNE_NORMALE',2); //
38
define('LIGNE_IMAGE_SEULEMENT',3); //
39
 
1321 aurelien 40
 
41
//TODO: refactoriser entièrement cette classe
970 aurelien 42
class InventoryImportExcel extends Cel  {
445 david 43
 
1321 aurelien 44
	// Element constituant une observation
760 aurelien 45
	var $format_observation=array(COMMUNE ,LIEUDIT ,STATION , DEPARTEMENT, MILIEU ,LATITUDE ,LONGITUDE ,NOTES ,DATEOBS ,ESPECE ,TRANSMETTRE, IMAGE );
480 david 46
 
1321 aurelien 47
	// Encapsulation classe lecture fichier excel
417 aurelien 48
	var $extendExcelReader;
49
 
1321 aurelien 50
	// Dernier numero d'ordre utilise
51
	var $dernier_ordre = 1;
760 aurelien 52
 
1321 aurelien 53
	var $cpt_images_liees = 0;
1413 aurelien 54
 
55
	var $utilisateur = array();
540 david 56
 
1321 aurelien 57
	/**
58
	 Constructeur
59
	**/
417 aurelien 60
	function InventoryImportExcel($config) {
61
 
1321 aurelien 62
		parent::__construct($config);
417 aurelien 63
		// Pas d'heritage multiple en php :(
64
		$this->extendExcelReader = new ExcelReader();
65
		$this->extendExcelReader->initExcelReader();
66
	}
67
 
1321 aurelien 68
	/**
69
	 Sur post
70
	**/
445 david 71
	function createElement($pairs) {
417 aurelien 72
 
1322 aurelien 73
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
74
			echo '0'; exit;
75
		}
76
 
1147 aurelien 77
		if(!isset($_SESSION)) {session_start();}
540 david 78
        $this->controleUtilisateur($pairs['utilisateur']);
1413 aurelien 79
 
80
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($pairs['utilisateur']);
480 david 81
 
540 david 82
        foreach($_FILES as $file) { // C'est le plus simple
83
            $infos_fichier = $file ;
84
        }
1413 aurelien 85
 
1321 aurelien 86
		// Chargement tableau en memoire
1413 aurelien 87
		$data = new Spreadsheet_Excel_Reader($infos_fichier['tmp_name'], true); // false : pour menager la memoire.
480 david 88
		$arr = array();
445 david 89
 
90
		$rowcount=$data->rowcount(0);
91
		$colcount=$data->colcount(0);
92
 
93
		if ($rowcount<=1) { // TODO : retour erreur
94
			print "Tableau vide";
95
			exit;
96
		}
97
 
1321 aurelien 98
		// Chargement tableau
540 david 99
        for($row=1;$row<=$rowcount;$row++)
100
            for($col=1;$col<=$colcount;$col++)
101
                $arr[$col][$row] = $data->val($row,$col,0); // Attention, inversion voulue
760 aurelien 102
 
1321 aurelien 103
		// 1 : Traitement intitules
445 david 104
		$line = array();
417 aurelien 105
 
1321 aurelien 106
		/* Les colonnes ne sont pas forcemment dans l'ordre  : on les extrait pour traitement futur  */
540 david 107
        for($col=1;$col<=$colcount;$col++) {
108
            $colonne=strtolower($arr[$col][1]);
109
            $colonne=trim($colonne);
110
            $colonne=cp1252_to_utf8($colonne);
111
            $colonne=remove_accent($colonne);
112
            switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
113
                case COMMUNE:
114
                case LIEUDIT:
115
                case STATION:
116
                case MILIEU:
117
                case DEPARTEMENT:
118
                case LATITUDE:
119
                case LONGITUDE:
120
                case NOTES:
121
                case DATEOBS:
122
                case ESPECE:
760 aurelien 123
                case TRANSMETTRE:
540 david 124
                case IMAGE:
125
                    $selection=array_values($arr[$col]);
126
                    array_shift($selection); // On ne garde pas la premiere ligne, qui contient les intitules
127
                    $line[$colonne]=$selection;
128
                    break;
445 david 129
 
540 david 130
            }
131
        }
1081 aurelien 132
		// 1 : Traitement lignes
483 david 133
		$cpt_obs=0;
760 aurelien 134
		$cpt_img=0;
540 david 135
 
136
        /* Recherche dernier numero d'ordre utilise : pas de mise a jour concurente a priori */
1321 aurelien 137
        $requete = "SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = ".$this->proteger($pairs['utilisateur'])." ";
138
		$resultat = $this->requeter($requete);
540 david 139
 
1321 aurelien 140
        if(is_array($resultat) && count($resultat) > 0) {
141
            $this->dernier_ordre = $resultat[0]['ordre']; // 1  par defaut
540 david 142
        }
143
 
480 david 144
		for ($i=0;$i<=$rowcount-1;$i++) {
540 david 145
			// On saute les eventuelles lignes vides du debut et les lignes contenant des information sur image uniquement
480 david 146
			while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
147
				if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
1321 aurelien 148
					// image non rattachée à une observation
480 david 149
				}
150
				else {
1321 aurelien 151
					// ligne vide
480 david 152
				}
445 david 153
				$i++;
154
			}
480 david 155
			while (($this->analyserLigne($line,$i)==LIGNE_NORMALE) && ($i<=$rowcount)) {
1322 aurelien 156
				$id_obs = $this->traiterLigne($line,$i,$pairs['utilisateur']);
157
				if ($this->dernier_ordre > 0) {
483 david 158
					$cpt_obs++; // Compteur d'observations crees
159
				}
445 david 160
				$i++;
480 david 161
				// On saute les lignes vide ou on traite les lignes suivantes contenant des informations sur image seulement
162
				while ((in_array($retour_analyse=$this->analyserLigne($line,$i),array(LIGNE_IMAGE_SEULEMENT, LIGNE_VIDE))) && ($i<=$rowcount)) {
445 david 163
					if  ($retour_analyse==LIGNE_IMAGE_SEULEMENT) {
1322 aurelien 164
						$this->traiterLigneComplement($line,$i,$pairs['utilisateur'],$id_obs); // images supplementaires
445 david 165
					}
166
					else {
1321 aurelien 167
						// print "vide";
445 david 168
					}
169
					$i++;
170
				}
171
			}
172
		}
760 aurelien 173
		$message = '';
174
 
175
		if($this->cpt_images_liees > 0) {
176
			$message = $this->cpt_images_liees.' images liees pour ';
177
		}
178
 
179
		$message .= $cpt_obs;
180
		print $message;
417 aurelien 181
	}
182
 
1321 aurelien 183
	function analyserLigne($line,$i) {
760 aurelien 184
 
1321 aurelien 185
		$ligne_vide=true;
186
		$ligne_image_seulement=true;
187
		$ligne_normale=true;
188
 
189
		$ligne_identique_sauf_image = true;
190
 
191
		foreach ($this->format_observation as $colonne) {
760 aurelien 192
 
1321 aurelien 193
			if($i < 1) {
760 aurelien 194
				$ligne_identique_sauf_image = false;
1321 aurelien 195
			} else {
196
 
197
				if($colonne!= IMAGE && isset($line[$colonne]) && isset($line[$colonne][$i - 1]) && isset($line[$colonne][$i])
198
					&& $line[$colonne][$i - 1] != $line[$colonne][$i] && $line[$colonne][$i] != '') {
199
					$ligne_identique_sauf_image = false;
200
				}
201
			}
202
 
203
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
204
				if ($colonne!=IMAGE) {
205
					$ligne_image_seulement=false;
206
					$ligne_vide=false;
207
				}
445 david 208
				$ligne_vide=false;
209
			}
210
		}
1321 aurelien 211
 
212
		if ($ligne_vide) {
213
			return LIGNE_VIDE;
214
		}
445 david 215
		else {
1321 aurelien 216
			if ($ligne_image_seulement || $ligne_identique_sauf_image) {
217
				return LIGNE_IMAGE_SEULEMENT;
218
			}
219
			else {
220
				return LIGNE_NORMALE;
221
			}
445 david 222
		}
223
	}
417 aurelien 224
 
1321 aurelien 225
	function traiterLigne($line,$i,$utilisateur) {
226
		// Controle donnee et insertion
227
		$info_image=array();
228
		$info_transmettre = "0";
229
		$info_espece = array('en_id_nom' => '',
230
			'nom_sel' => '',
1322 aurelien 231
			'nom_sel_nn' => '',
1321 aurelien 232
			'nom_ret' => '',
233
			'nom_ret_nn' => '',
234
			'nt' => '',
235
			'famille' => ''
236
		);
1322 aurelien 237
		$info_commune = array('nom' => '', 'code' => '');
1321 aurelien 238
 
239
		foreach ($this->format_observation as $colonne) {
240
			if (isset ($line[$colonne][$i]) && $line[$colonne][$i]!='') {
241
				switch ($colonne) {  // On ne garde que les colonnes que l'on souhaite traiter
242
					case COMMUNE:
243
						$info_commune = $this->traiterCommune($line[COMMUNE][$i]);
244
						break;
245
					case LIEUDIT:
246
						$info_lieudit = $this->traiterLieudit($line[LIEUDIT][$i]);
247
						break;
248
					case STATION:
249
						$info_station = $this->traiterStation($line[STATION][$i]);
250
						break;
251
					case MILIEU:
252
						$info_milieu = $this->traiterMilieu($line[MILIEU][$i]);
253
						break;
254
	                case DEPARTEMENT:
1322 aurelien 255
	                	$dpt = $this->traiterDepartement($line[DEPARTEMENT][$i]);
256
	                	if(is_numeric($dpt) && strlen($dpt == 5) && $info_commune['code'] == 'NULL') {
257
	                		$info_commune['code'] = $dpt;
258
	                	}
1321 aurelien 259
						break;
260
					case LATITUDE:
261
						$info_latitude = $this->traiterLatitude($line[LATITUDE][$i]);
262
						break;
263
					case LONGITUDE:
264
						$info_longitude = $this->traiterLongitude($line[LONGITUDE][$i]);
265
						break;
266
					case NOTES:
267
						$info_notes = $this->traiterNotes($line[NOTES][$i]);
268
						break;
269
					case DATEOBS:
270
						$info_dateobs = $this->traiterDateObs($line[DATEOBS][$i]);
271
						break;
272
					case TRANSMETTRE:
273
						$info_transmettre = $this->traiterTransmettre($line[TRANSMETTRE][$i]);
445 david 274
					break;
1321 aurelien 275
					case ESPECE:
276
						$chercheur_infos_taxon = new RechercheInfosTaxon($this->config);
277
						$resultat_recherche_espece = $chercheur_infos_taxon->rechercherInfosSurTexteCodeOuNumTax($line[ESPECE][$i]);
278
	                    if (isset($resultat_recherche_espece['en_id_nom']) && $resultat_recherche_espece['en_id_nom']!='') {
279
	                    	$info_espece['nom_sel'] = $resultat_recherche_espece['nom_sel'];
280
	                    	$info_espece['nom_sel_nn'] = $resultat_recherche_espece['en_id_nom'];
281
	                        $complement = $chercheur_infos_taxon->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
282
	                        $info_espece['nom_ret'] = $complement['Nom_Retenu'];
283
	                        $info_espece['nom_ret_nn'] = $complement['Num_Nom_Retenu'];
284
	                        $info_espece['nt'] = $complement['Num_Taxon'];
285
	                        $info_espece['famille'] = $complement['Famille'];
286
	                    } else {
287
	                    	$info_espece['nom_sel'] = $line[ESPECE][$i];
288
	                    }
289
	                    break;
290
					case IMAGE:
291
						$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
292
						break;
293
				}
445 david 294
			}
1321 aurelien 295
			else {
296
			 	switch($colonne) {
297
					case COMMUNE:
298
						$info_commune['nom']="";
299
						break;
300
					case LIEUDIT:
301
						$info_lieudit="";
302
						break;
303
					case STATION:
304
						$info_station="";
305
						break;
306
					case MILIEU:
307
						$info_milieu="";
308
						break;
309
					case DEPARTEMENT:
310
			            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
311
						    $info_commune['code']="";
312
	                    }
313
						break;
314
					case LATITUDE:
315
						$info_latitude = "";
316
						break;
317
					case LONGITUDE:
318
						$info_longitude = "";
319
						break;
320
					case NOTES:
321
						$info_notes='';
322
						break;
323
					case TRANSMETTRE:
324
						$info_transmettre = "0";
480 david 325
					break;
1321 aurelien 326
				}
480 david 327
			}
328
		}
760 aurelien 329
 
1321 aurelien 330
        $this->dernier_ordre++;
331
        list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
332
        $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
333
        $requete  = "INSERT INTO cel_obs (".
1413 aurelien 334
	        "ce_utilisateur,prenom_utilisateur,nom_utilisateur,courriel_utilisateur,".
335
	        "ordre,".
1321 aurelien 336
	        "nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
337
	        "zone_geo,ce_zone_geo,".
338
	        "date_observation,".
339
	        "lieudit,station, milieu, commentaire, transmission, ".
340
	        "date_creation,date_modification,latitude,longitude) ".
341
	        " VALUES(".$this->proteger($utilisateur).",".
1413 aurelien 342
	        $this->proteger($this->utilisateur['prenom']).",".
343
	        $this->proteger($this->utilisateur['nom']).",".
344
	        $this->proteger($this->utilisateur['courriel']).",".
1321 aurelien 345
	        $this->proteger($this->dernier_ordre).",".
346
	        $this->proteger($info_espece['nom_sel']).",".
347
	        $this->proteger($info_espece['nom_sel_nn']).",".
348
	        $this->proteger($info_espece['nom_ret']).",".
349
	        $this->proteger($info_espece['nom_ret_nn']).",".
350
	        $this->proteger($info_espece['nt']).",".
351
	        $this->proteger($info_espece['famille']).",".
352
	        $this->proteger($info_commune['nom']).",".
1322 aurelien 353
	        $this->proteger('INSEE-C:'.$info_commune['code']).",".
1321 aurelien 354
	        $this->proteger($info_dateobs).",".
355
	        $this->proteger($info_lieudit).",".
356
	        $this->proteger($info_station).",".
357
	        $this->proteger($info_milieu).",".
358
	        $this->proteger($info_notes).",".
359
	        $this->proteger($info_transmettre).",".
360
	        "now() , now(),".
361
	        $this->proteger($info_latitude).",".
362
	        $this->proteger($info_longitude).")";
760 aurelien 363
 
1321 aurelien 364
		$insertion = $this->executer($requete);
365
 
1322 aurelien 366
		$requete_id_obs = 'SELECT id_observation FROM cel_obs WHERE ordre = '.$this->proteger($this->dernier_ordre).' AND ce_utilisateur = '.$this->proteger($utilisateur);
367
		$resultat_id_obs = $this->requeter($requete_id_obs);
368
 
369
		$id_obs = $resultat_id_obs[0]['id_observation'];
370
 
1321 aurelien 371
		// creation lien image
372
		foreach ($info_image as $pic) {
1322 aurelien 373
 
1327 aurelien 374
			$requete_liaison = 'INSERT INTO cel_obs_images (id_image, id_observation ) VALUES ('.$this->proteger($pic['id_image']).', '.$id_obs.') ON DUPLICATE KEY UPDATE id_image = id_image ';
1321 aurelien 375
			$liaison = $this->executer($requete_liaison);
376
            if ($liaison !== false) {
377
            	$this->cpt_images_liees++;
378
            } else {
379
            	return false;
540 david 380
            }
1321 aurelien 381
		}
382
 
1322 aurelien 383
		return $id_obs;
445 david 384
	}
385
 
1322 aurelien 386
	function traiterLigneComplement($line,$i,$utilisateur, $id_obs = null) {
1321 aurelien 387
 
388
		$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
389
		// creation lien image
390
		foreach ($info_image as $pic) {
1327 aurelien 391
			$requete = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES ('.$this->proteger($pic['id_image']).', '.$this->proteger($id_obs).') ON DUPLICATE KEY UPDATE id_image = id_image' ;
1321 aurelien 392
			$resultat_liaison = $this->executer($requete);
393
	    	if ($resultat_liaison !== false) {
394
	    		$this->cpt_images_liees++;
395
	    	} else {
396
	    		return false;
397
	    	}
398
		}
445 david 399
	}
400
 
1321 aurelien 401
	function traiterCommune($identifiant_commune) {
402
		// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
403
	    $identifiant_commune=trim($identifiant_commune);
404
	    $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
1081 aurelien 405
 
1321 aurelien 406
		preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
407
 
408
		if (isset($elements[1])) { // commune + departement : montpellier (34)
409
			$nom_commune=$elements[1];
410
			$code_commune=$elements[2];
1404 aurelien 411
	 	    $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
1321 aurelien 412
		}
413
		else { // Code insee seul
414
	        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
415
	        if (isset($elements[1])) { // code insee  commune
416
	            $code_insee_commune=$elements[1];
417
	            $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
418
	        }
419
	        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
420
	               // Commune
421
	            preg_match('/(.*)/',$identifiant_commune,$elements);
422
	            if (isset($elements[1])) { // commune
423
	                $nom_commune=$elements[1];
424
	                $nom_commune=trim($nom_commune);
425
	                $nom_commune=utf8_decode($nom_commune);
426
	                $nom_commune=cp1252_to_utf8($nom_commune);
427
	                $nom_commune=remove_accent($nom_commune);
428
	                $nom_commune=preg_replace("/ /","%",$nom_commune);
429
	                $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
430
	            }
431
	        }
432
		}
433
 
434
		$resultat_commune = $this->requeter($requete);
435
 
436
		// cas de la commune introuvable dans le référentiel
437
		if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
438
			$resultat_commune['nom'] = fix_latin($identifiant_commune);
439
			$resultat_commune['code'] = 'NULL';
440
		} else {
441
			$resultat_commune = $resultat_commune[0];
442
		}
443
 
444
		return $resultat_commune;
1081 aurelien 445
	}
445 david 446
 
1321 aurelien 447
	function traiterLieudit($lieudit) {
448
		// texte libre
449
	    $lieudit=fix_latin($lieudit);
450
		return trim($lieudit);
451
	}
445 david 452
 
1321 aurelien 453
	function traiterStation($station) {
454
		// texte libre
455
	    $station=fix_latin($station);
456
		return trim($station);
457
	}
445 david 458
 
1321 aurelien 459
	function traiterMilieu($milieu) {
460
		// texte libre
461
	    $milieu=fix_latin($milieu);
462
		return trim($milieu);
463
	}
445 david 464
 
1321 aurelien 465
	function traiterDepartement($departement) {
466
		// texte libre
467
		if(is_numeric($departement) && strlen($departement) == 4) {
468
			$departement = "0"+$departement;
469
		}
760 aurelien 470
 
1321 aurelien 471
		if(is_numeric($departement) && $departement <= 9) {
472
			$departement = "0"+$departement;
473
		}
1322 aurelien 474
 
1321 aurelien 475
		return utf8_encode(trim($departement));
760 aurelien 476
	}
1081 aurelien 477
 
1321 aurelien 478
	function traiterLatitude($latitude) {
479
		//  verifier formal decimal + limite france ? TODO
480
		return trim($latitude);
1081 aurelien 481
	}
760 aurelien 482
 
1321 aurelien 483
	function traiterLongitude($longitude) {
484
		// verifier format decimal + limite france ? TODO
485
		return trim($longitude);
486
	}
760 aurelien 487
 
1321 aurelien 488
	function traiterNotes($notes) {
489
		// texte libre
490
	    $notes=remove_accent($notes);
491
		return utf8_encode(trim($notes));
760 aurelien 492
	}
493
 
1321 aurelien 494
	function traiterDateObs($dateobs) {
495
		// verifier jj/mm/aaaa sinon date vide TODO
496
		$date = trim($dateobs);
497
		if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
498
			$date = '00/00/0000';
499
		}
500
		return $date;
501
	}
760 aurelien 502
 
1321 aurelien 503
	function traiterTransmettre($transmettre) {
504
		$transmission = '0';
505
		if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
506
			$transmission = '1';
507
		}
508
		return $transmission;
509
	}
540 david 510
 
1321 aurelien 511
	function traiterImage($images,$utilisateur) { // recherche id image de ce nom
512
		$liste_images = explode("/",$images) ;
513
		$row =array();
514
	   	foreach($liste_images as $image) {
1327 aurelien 515
			$image = remove_accent(fix_latin($image));
1321 aurelien 516
			$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
517
			$ligne = $this->requeter($requete);
518
		    if(is_array($ligne) && !empty($ligne)) {
519
		    	$row[] = $ligne[0];
520
		    }
449 david 521
		}
1321 aurelien 522
		return $row;
480 david 523
	}
445 david 524
}
525
 
582 david 526
function init_byte_map(){
606 aurelien 527
    $byte_map = array();
582 david 528
    for($x=128;$x<256;++$x){
529
        $byte_map[chr($x)]=utf8_encode(chr($x));
530
    }
531
    $cp1252_map=array(
532
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
533
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
534
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
535
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
536
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
537
            "\x86" => "\xE2\x80\xA0",  // DAGGER
538
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
539
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
540
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
541
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
542
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
543
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
544
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
545
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
546
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
547
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
548
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
549
            "\x95" => "\xE2\x80\xA2",  // BULLET
550
            "\x96" => "\xE2\x80\x93",  // EN DASH
551
            "\x97" => "\xE2\x80\x94",  // EM DASH
552
            "\x98" => "\xCB\x9C",      // SMALL TILDE
553
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
554
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
555
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
556
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
557
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
558
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
559
                );
560
    foreach($cp1252_map as $k=>$v){
561
        $byte_map[$k]=$v;
562
    }
606 aurelien 563
 
564
    return $byte_map;
582 david 565
}
449 david 566
 
602 aurelien 567
function fix_latin($instr){
568
 
606 aurelien 569
    $byte_map = init_byte_map();
570
 
602 aurelien 571
    $ascii_char='[\x00-\x7F]';
572
    $cont_byte='[\x80-\xBF]';
573
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
574
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
575
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
576
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 577
 
602 aurelien 578
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 579
 
582 david 580
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
581
    $outstr='';
582
    $char='';
583
    $rest='';
584
    while((strlen($instr))>0){
602 aurelien 585
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 586
            $char=$match[1];
587
            $rest=$match[2];
588
            $outstr.=$char;
602 aurelien 589
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 590
            $char=$match[1];
591
            $rest=$match[2];
592
            $outstr.=$byte_map[$char];
593
        }
594
        $instr=$rest;
595
    }
596
    return $outstr;
597
}
598
 
1321 aurelien 599
function remove_accent($str) {
540 david 600
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
601
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
602
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
603
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
604
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
605
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
606
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
607
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
608
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
609
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
610
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
611
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
612
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
613
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
614
 
615
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
616
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
617
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
618
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
619
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
620
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
621
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
622
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
623
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
624
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
625
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
626
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
627
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
628
  return str_replace($a, $b, $str);
629
}
449 david 630
 
540 david 631
function cp1252_to_utf8($str) {
1321 aurelien 632
	$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
633
		"\xc2\x82" => "\xe2\x80\x9a",
634
		"\xc2\x83" => "\xc6\x92",
635
		"\xc2\x84" => "\xe2\x80\x9e",
636
		"\xc2\x85" => "\xe2\x80\xa6",
637
		"\xc2\x86" => "\xe2\x80\xa0",
638
		"\xc2\x87" => "\xe2\x80\xa1",
639
		"\xc2\x88" => "\xcb\x86",
640
		"\xc2\x89" => "\xe2\x80\xb0",
641
		"\xc2\x8a" => "\xc5\xa0",
642
		"\xc2\x8b" => "\xe2\x80\xb9",
643
		"\xc2\x8c" => "\xc5\x92",
644
		"\xc2\x8e" => "\xc5\xbd",
645
		"\xc2\x91" => "\xe2\x80\x98",
646
		"\xc2\x92" => "\xe2\x80\x99",
647
		"\xc2\x93" => "\xe2\x80\x9c",
648
		"\xc2\x94" => "\xe2\x80\x9d",
649
		"\xc2\x95" => "\xe2\x80\xa2",
650
		"\xc2\x96" => "\xe2\x80\x93",
651
		"\xc2\x97" => "\xe2\x80\x94",
652
 
653
		"\xc2\x98" => "\xcb\x9c",
654
		"\xc2\x99" => "\xe2\x84\xa2",
655
		"\xc2\x9a" => "\xc5\xa1",
656
		"\xc2\x9b" => "\xe2\x80\xba",
657
		"\xc2\x9c" => "\xc5\x93",
658
		"\xc2\x9e" => "\xc5\xbe",
659
		"\xc2\x9f" => "\xc5\xb8"
660
	);
661
	return strtr(utf8_encode($str), $cp1252_map);
540 david 662
}
1321 aurelien 663
?>