Subversion Repositories eFlore/Applications.cel

Rev

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