Subversion Repositories eFlore/Applications.cel

Rev

Rev 1413 | 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:
1426 aurelien 276
						$chercheur_infos_taxon = new RechercheInfosTaxonBeta($this->config);
1321 aurelien 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
					case IMAGE:
290
						$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
291
						break;
292
				}
445 david 293
			}
1321 aurelien 294
			else {
295
			 	switch($colonne) {
296
					case COMMUNE:
297
						$info_commune['nom']="";
298
						break;
299
					case LIEUDIT:
300
						$info_lieudit="";
301
						break;
302
					case STATION:
303
						$info_station="";
304
						break;
305
					case MILIEU:
306
						$info_milieu="";
307
						break;
308
					case DEPARTEMENT:
309
			            if (!isset ($info_commune['code']) || $info_commune['code']=='') {
310
						    $info_commune['code']="";
311
	                    }
312
						break;
313
					case LATITUDE:
314
						$info_latitude = "";
315
						break;
316
					case LONGITUDE:
317
						$info_longitude = "";
318
						break;
319
					case NOTES:
320
						$info_notes='';
321
						break;
322
					case TRANSMETTRE:
323
						$info_transmettre = "0";
480 david 324
					break;
1321 aurelien 325
				}
480 david 326
			}
327
		}
760 aurelien 328
 
1321 aurelien 329
        $this->dernier_ordre++;
330
        list($jour,$mois,$annee) = isset($info_dateobs) ? explode("/",$info_dateobs) : array(null,null,null);
331
        $info_dateobs=$annee."-".$mois."-".$jour." 0:0:0";
332
        $requete  = "INSERT INTO cel_obs (".
1413 aurelien 333
	        "ce_utilisateur,prenom_utilisateur,nom_utilisateur,courriel_utilisateur,".
334
	        "ordre,".
1321 aurelien 335
	        "nom_sel,nom_sel_nn,nom_ret,nom_ret_nn,nt,famille,".
336
	        "zone_geo,ce_zone_geo,".
337
	        "date_observation,".
338
	        "lieudit,station, milieu, commentaire, transmission, ".
339
	        "date_creation,date_modification,latitude,longitude) ".
340
	        " VALUES(".$this->proteger($utilisateur).",".
1413 aurelien 341
	        $this->proteger($this->utilisateur['prenom']).",".
342
	        $this->proteger($this->utilisateur['nom']).",".
343
	        $this->proteger($this->utilisateur['courriel']).",".
1321 aurelien 344
	        $this->proteger($this->dernier_ordre).",".
345
	        $this->proteger($info_espece['nom_sel']).",".
346
	        $this->proteger($info_espece['nom_sel_nn']).",".
347
	        $this->proteger($info_espece['nom_ret']).",".
348
	        $this->proteger($info_espece['nom_ret_nn']).",".
349
	        $this->proteger($info_espece['nt']).",".
350
	        $this->proteger($info_espece['famille']).",".
351
	        $this->proteger($info_commune['nom']).",".
1322 aurelien 352
	        $this->proteger('INSEE-C:'.$info_commune['code']).",".
1321 aurelien 353
	        $this->proteger($info_dateobs).",".
354
	        $this->proteger($info_lieudit).",".
355
	        $this->proteger($info_station).",".
356
	        $this->proteger($info_milieu).",".
357
	        $this->proteger($info_notes).",".
358
	        $this->proteger($info_transmettre).",".
359
	        "now() , now(),".
360
	        $this->proteger($info_latitude).",".
361
	        $this->proteger($info_longitude).")";
760 aurelien 362
 
1321 aurelien 363
		$insertion = $this->executer($requete);
364
 
1322 aurelien 365
		$requete_id_obs = 'SELECT id_observation FROM cel_obs WHERE ordre = '.$this->proteger($this->dernier_ordre).' AND ce_utilisateur = '.$this->proteger($utilisateur);
366
		$resultat_id_obs = $this->requeter($requete_id_obs);
367
 
368
		$id_obs = $resultat_id_obs[0]['id_observation'];
369
 
1321 aurelien 370
		// creation lien image
371
		foreach ($info_image as $pic) {
1322 aurelien 372
 
1327 aurelien 373
			$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 374
			$liaison = $this->executer($requete_liaison);
375
            if ($liaison !== false) {
376
            	$this->cpt_images_liees++;
377
            } else {
378
            	return false;
540 david 379
            }
1321 aurelien 380
		}
381
 
1322 aurelien 382
		return $id_obs;
445 david 383
	}
384
 
1322 aurelien 385
	function traiterLigneComplement($line,$i,$utilisateur, $id_obs = null) {
1321 aurelien 386
 
387
		$info_image=$this->traiterImage($line[IMAGE][$i],$utilisateur); // Image separee par des / +  utilisateur
388
		// creation lien image
389
		foreach ($info_image as $pic) {
1327 aurelien 390
			$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 391
			$resultat_liaison = $this->executer($requete);
392
	    	if ($resultat_liaison !== false) {
393
	    		$this->cpt_images_liees++;
394
	    	} else {
395
	    		return false;
396
	    	}
397
		}
445 david 398
	}
399
 
1321 aurelien 400
	function traiterCommune($identifiant_commune) {
401
		// Recherche correspondance sur nom, si pas unique, correspondance dep. sinon code insee
402
	    $identifiant_commune=trim($identifiant_commune);
403
	    $identifiant_commune=utf8_encode($identifiant_commune); // FIXME : devrait deja etre en utf8 a ce niveau
1081 aurelien 404
 
1321 aurelien 405
		preg_match('/(.*) \(([0-9][0-9]*)\)/',$identifiant_commune,$elements);
406
 
407
		if (isset($elements[1])) { // commune + departement : montpellier (34)
408
			$nom_commune=$elements[1];
409
			$code_commune=$elements[2];
1404 aurelien 410
	 	    $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom = ".$this->proteger($nom_commune)." AND code LIKE ".$this->proteger($code_commune.'%');
1321 aurelien 411
		}
412
		else { // Code insee seul
413
	        preg_match('/([0-9][0-9]*)|(2A[0-9][0-9]*)|(2B[0-9][0-9]*)/',$identifiant_commune,$elements);
414
	        if (isset($elements[1])) { // code insee  commune
415
	            $code_insee_commune=$elements[1];
416
	            $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE code = ".$this->proteger($code_insee_commune);
417
	        }
418
	        else { // Commune seule (le departement sera recupere dans la colonne departement si elle est presente, on prend le risque ici de retourner une mauvaise
419
	               // Commune
420
	            preg_match('/(.*)/',$identifiant_commune,$elements);
421
	            if (isset($elements[1])) { // commune
422
	                $nom_commune=$elements[1];
423
	                $nom_commune=trim($nom_commune);
424
	                $nom_commune=utf8_decode($nom_commune);
425
	                $nom_commune=cp1252_to_utf8($nom_commune);
426
	                $nom_commune=remove_accent($nom_commune);
427
	                $nom_commune=preg_replace("/ /","%",$nom_commune);
428
	                $requete="SELECT DISTINCT nom, code  FROM cel_zones_geo WHERE nom like ".$this->proteger($nom_commune.'%');
429
	            }
430
	        }
431
		}
432
 
433
		$resultat_commune = $this->requeter($requete);
434
 
435
		// cas de la commune introuvable dans le référentiel
436
		if(!is_array($resultat_commune) || count($resultat_commune) == 0) {
437
			$resultat_commune['nom'] = fix_latin($identifiant_commune);
438
			$resultat_commune['code'] = 'NULL';
439
		} else {
440
			$resultat_commune = $resultat_commune[0];
441
		}
442
 
443
		return $resultat_commune;
1081 aurelien 444
	}
445 david 445
 
1321 aurelien 446
	function traiterLieudit($lieudit) {
447
		// texte libre
448
	    $lieudit=fix_latin($lieudit);
449
		return trim($lieudit);
450
	}
445 david 451
 
1321 aurelien 452
	function traiterStation($station) {
453
		// texte libre
454
	    $station=fix_latin($station);
455
		return trim($station);
456
	}
445 david 457
 
1321 aurelien 458
	function traiterMilieu($milieu) {
459
		// texte libre
460
	    $milieu=fix_latin($milieu);
461
		return trim($milieu);
462
	}
445 david 463
 
1321 aurelien 464
	function traiterDepartement($departement) {
465
		// texte libre
466
		if(is_numeric($departement) && strlen($departement) == 4) {
467
			$departement = "0"+$departement;
468
		}
760 aurelien 469
 
1321 aurelien 470
		if(is_numeric($departement) && $departement <= 9) {
471
			$departement = "0"+$departement;
472
		}
1322 aurelien 473
 
1321 aurelien 474
		return utf8_encode(trim($departement));
760 aurelien 475
	}
1081 aurelien 476
 
1321 aurelien 477
	function traiterLatitude($latitude) {
478
		//  verifier formal decimal + limite france ? TODO
479
		return trim($latitude);
1081 aurelien 480
	}
760 aurelien 481
 
1321 aurelien 482
	function traiterLongitude($longitude) {
483
		// verifier format decimal + limite france ? TODO
484
		return trim($longitude);
485
	}
760 aurelien 486
 
1321 aurelien 487
	function traiterNotes($notes) {
488
		// texte libre
489
	    $notes=remove_accent($notes);
490
		return utf8_encode(trim($notes));
760 aurelien 491
	}
492
 
1321 aurelien 493
	function traiterDateObs($dateobs) {
494
		// verifier jj/mm/aaaa sinon date vide TODO
495
		$date = trim($dateobs);
496
		if(!preg_match("#[0-9]{2}/[0-9]{2}/([0-9]{4}|[0-9]{2})#", $date)) {
497
			$date = '00/00/0000';
498
		}
499
		return $date;
500
	}
760 aurelien 501
 
1321 aurelien 502
	function traiterTransmettre($transmettre) {
503
		$transmission = '0';
504
		if (trim($transmettre) == "1" || trim($transmettre) == "oui") {
505
			$transmission = '1';
506
		}
507
		return $transmission;
508
	}
540 david 509
 
1321 aurelien 510
	function traiterImage($images,$utilisateur) { // recherche id image de ce nom
511
		$liste_images = explode("/",$images) ;
512
		$row =array();
513
	   	foreach($liste_images as $image) {
1327 aurelien 514
			$image = remove_accent(fix_latin($image));
1321 aurelien 515
			$requete = "SELECT * FROM cel_images WHERE ce_utilisateur = ".$this->proteger($utilisateur)." AND nom_original= ".$this->proteger($image);
516
			$ligne = $this->requeter($requete);
517
		    if(is_array($ligne) && !empty($ligne)) {
518
		    	$row[] = $ligne[0];
519
		    }
449 david 520
		}
1321 aurelien 521
		return $row;
480 david 522
	}
445 david 523
}
524
 
582 david 525
function init_byte_map(){
606 aurelien 526
    $byte_map = array();
582 david 527
    for($x=128;$x<256;++$x){
528
        $byte_map[chr($x)]=utf8_encode(chr($x));
529
    }
530
    $cp1252_map=array(
531
            "\x80"=>"\xE2\x82\xAC",    // EURO SIGN
532
            "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
533
            "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
534
            "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
535
            "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
536
            "\x86" => "\xE2\x80\xA0",  // DAGGER
537
            "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
538
            "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
539
            "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
540
            "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
541
            "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
542
            "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
543
            "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
544
            "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
545
            "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
546
            "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
547
            "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
548
            "\x95" => "\xE2\x80\xA2",  // BULLET
549
            "\x96" => "\xE2\x80\x93",  // EN DASH
550
            "\x97" => "\xE2\x80\x94",  // EM DASH
551
            "\x98" => "\xCB\x9C",      // SMALL TILDE
552
            "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
553
            "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
554
            "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
555
            "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
556
            "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
557
            "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
558
                );
559
    foreach($cp1252_map as $k=>$v){
560
        $byte_map[$k]=$v;
561
    }
606 aurelien 562
 
563
    return $byte_map;
582 david 564
}
449 david 565
 
602 aurelien 566
function fix_latin($instr){
567
 
606 aurelien 568
    $byte_map = init_byte_map();
569
 
602 aurelien 570
    $ascii_char='[\x00-\x7F]';
571
    $cont_byte='[\x80-\xBF]';
572
    $utf8_2='[\xC0-\xDF]'.$cont_byte;
573
    $utf8_3='[\xE0-\xEF]'.$cont_byte.'{2}';
574
    $utf8_4='[\xF0-\xF7]'.$cont_byte.'{3}';
575
    $utf8_5='[\xF8-\xFB]'.$cont_byte.'{4}';
606 aurelien 576
 
602 aurelien 577
    $nibble_good_chars = "@^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$@s";
601 aurelien 578
 
582 david 579
    if(mb_check_encoding($instr,'UTF-8'))return $instr; // no need for the rest if it's all valid UTF-8 already
580
    $outstr='';
581
    $char='';
582
    $rest='';
583
    while((strlen($instr))>0){
602 aurelien 584
        if(1==@preg_match($nibble_good_chars,$instr,$match)){
582 david 585
            $char=$match[1];
586
            $rest=$match[2];
587
            $outstr.=$char;
602 aurelien 588
        }elseif(1==@preg_match('@^(.)(.*)$@s',$instr,$match)){
582 david 589
            $char=$match[1];
590
            $rest=$match[2];
591
            $outstr.=$byte_map[$char];
592
        }
593
        $instr=$rest;
594
    }
595
    return $outstr;
596
}
597
 
1321 aurelien 598
function remove_accent($str) {
540 david 599
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
600
             'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß',
601
             'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î',
602
             'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā',
603
             'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď',
604
             'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ',
605
             'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ',
606
             'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ',
607
             'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ',
608
             'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ',
609
             'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ',
610
             'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż',
611
             'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ',
612
             'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ');
613
 
614
  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I',
615
             'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's',
616
             'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
617
             'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a',
618
             'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd',
619
             'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g',
620
             'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i',
621
             'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l',
622
             'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R',
623
             'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't',
624
             'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
625
             'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I',
626
             'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
627
  return str_replace($a, $b, $str);
628
}
449 david 629
 
540 david 630
function cp1252_to_utf8($str) {
1321 aurelien 631
	$cp1252_map = array ("\xc2\x80" => "\xe2\x82\xac",
632
		"\xc2\x82" => "\xe2\x80\x9a",
633
		"\xc2\x83" => "\xc6\x92",
634
		"\xc2\x84" => "\xe2\x80\x9e",
635
		"\xc2\x85" => "\xe2\x80\xa6",
636
		"\xc2\x86" => "\xe2\x80\xa0",
637
		"\xc2\x87" => "\xe2\x80\xa1",
638
		"\xc2\x88" => "\xcb\x86",
639
		"\xc2\x89" => "\xe2\x80\xb0",
640
		"\xc2\x8a" => "\xc5\xa0",
641
		"\xc2\x8b" => "\xe2\x80\xb9",
642
		"\xc2\x8c" => "\xc5\x92",
643
		"\xc2\x8e" => "\xc5\xbd",
644
		"\xc2\x91" => "\xe2\x80\x98",
645
		"\xc2\x92" => "\xe2\x80\x99",
646
		"\xc2\x93" => "\xe2\x80\x9c",
647
		"\xc2\x94" => "\xe2\x80\x9d",
648
		"\xc2\x95" => "\xe2\x80\xa2",
649
		"\xc2\x96" => "\xe2\x80\x93",
650
		"\xc2\x97" => "\xe2\x80\x94",
651
 
652
		"\xc2\x98" => "\xcb\x9c",
653
		"\xc2\x99" => "\xe2\x84\xa2",
654
		"\xc2\x9a" => "\xc5\xa1",
655
		"\xc2\x9b" => "\xe2\x80\xba",
656
		"\xc2\x9c" => "\xc5\x93",
657
		"\xc2\x9e" => "\xc5\xbe",
658
		"\xc2\x9f" => "\xc5\xb8"
659
	);
660
	return strtr(utf8_encode($str), $cp1252_map);
540 david 661
}
1321 aurelien 662
?>