Subversion Repositories eFlore/Applications.cel

Rev

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