Subversion Repositories eFlore/Applications.cel

Rev

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