Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3228 delphine 1
 <?php
3120 delphine 2
// declare(encoding='UTF-8');
3
/**
4
 * Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
7
 *
8
 * Cas d'utilisation et documentation :
9
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
10
 *
11
 * Paramètres :
12
 * ===> extra = booléen (1 ou 0)  [par défaut : 1]
13
 * Affiche / Cache la vignette en taille plus importante au bas du widget.
14
 * ===> vignette = [0-9]+,[0-9]+  [par défaut : 4,3]
15
 * Indique le nombre de vignette par ligne et le nombre de ligne.
16
 *
3228 delphine 17
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
18
 * @license	GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license	CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @version	$Id$
21
 * @copyright	Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
3120 delphine 22
 */
23
class Saisie2 extends WidgetCommun {
3239 idir 24
 
3228 delphine 25
	const DS = DIRECTORY_SEPARATOR;
26
	const SERVICE_DEFAUT = 'saisie';
3240 idir 27
	const WS_SAISIE = 'CelWidgetSaisie';
28
	const WS_UPLOAD = 'CelWidgetUploadImageTemp';
29
	const WS_OBS = 'CelObs';
3228 delphine 30
	const LANGUE_DEFAUT = 'fr';
31
	const PROJET_DEFAUT = 'base';
32
	const WS_NOM = 'noms';
33
	const EFLORE_API_VERSION = '0.1';
34
	private $cel_url_tpl = null;
35
	/** Si spécifié, on ajoute une barre de navigation inter-applications */
36
	private $bar;
37
	//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
38
	private $parametres_autorises = array(
39
			'projet' => 'projet',
40
			'type' => 'type',
41
			'langue' => 'langue',
42
			'order' => 'order'
43
	);
44
	/**
45
	 * Méthode appelée par défaut pour charger ce widget.
46
	 */
47
	public function executer() {
48
		$retour = null;
49
		// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
50
		unset($this->parametres['callback']);
51
		extract($this->parametres);
52
		$this->bar = (isset($bar)) ? $bar : false;
53
		/* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
54
		 Sinon, rien ne sera chargé.
55
		 L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
56
		 de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
57
		 l'application.
58
		 Chemin du fichier chargeant le framework requis */
59
		$framework = dirname(__FILE__).'/framework.php';
60
		if (!file_exists($framework)) {
61
			$e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
62
			trigger_error($e, E_USER_ERROR);
63
		} else {
64
			// Inclusion du Framework
65
			require_once $framework;
66
			// Ajout d'information concernant cette application
67
			Framework::setCheminAppli(__FILE__);// Obligatoire
68
			Framework::setInfoAppli(Config::get('info'));// Optionnel
3239 idir 69
 
3228 delphine 70
		}
71
		$langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
72
		$this->langue = I18n::setLangue($langue);
73
		$this->parametres['langue'] = $langue;
3120 delphine 74
 
3228 delphine 75
		if (!isset($mode)) {
76
			$mode = self::SERVICE_DEFAUT;
77
		}
78
		if (!isset($projet)) {
79
			$this->parametres['projet'] = self::PROJET_DEFAUT;
80
		}
3239 idir 81
 
3228 delphine 82
		$methode = $this->traiterNomMethodeExecuter($mode);
3239 idir 83
		if (method_exists($this, $methode)) {
84
			$retour = $this->$methode();
3228 delphine 85
		} else {
86
			$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
87
		}
3239 idir 88
 
3257 delphine 89
		$contenu = ''; //print_r($retour);exit;
3228 delphine 90
		if (is_null($retour)) {
91
			$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
92
		} else {
3239 idir 93
			if (isset($retour['donnees'])) {
3271 idir 94
				// ne pas afficher le projet dans l'url si on est dans saisie de base
95
				$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? $this->parametres['projet'].'&' : '';
96
 
3260 idir 97
				$retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
3249 idir 98
				$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
3228 delphine 99
				$retour['donnees']['bar'] = $this->bar;
3268 idir 100
				$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
3228 delphine 101
				$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
3240 idir 102
				$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
103
				$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
104
				$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
3271 idir 105
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl'].'?'.$projet_dans_url.'langue='.$this->parametres['langue'];
3228 delphine 106
				$retour['donnees']['mode'] = $mode;
3260 idir 107
				if( isset( $this->parametres['squelette'] ) ) {
108
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS. $this->parametres['squelette'].'.tpl.html';
109
				} else {
110
					$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
111
				}
3228 delphine 112
				$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
113
			} else {
114
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
115
			}
116
		}
117
		$this->envoyer($contenu);
118
	}
3120 delphine 119
 
3239 idir 120
 
3228 delphine 121
	private function executerSaisie() {
122
		$retour = array();
123
		$retour['squelette'] = 'saisie';
3248 idir 124
		$retour['donnees']['general'] = I18n::get('General');
125
		$retour['donnees']['aide'] = I18n::get('Aide');
3228 delphine 126
		$retour['donnees']['observateur'] = I18n::get('Observateur');
3248 idir 127
		$retour['donnees']['observation'] = I18n::get('Observation');
128
		$retour['donnees']['image'] = I18n::get('Image');
129
 		$retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
130
 		$retour['donnees']['resume'] = I18n::get('Resume');
3228 delphine 131
		$retour['donnees']['widget'] = $this->rechercherProjet();
132
		return $retour;
133
	}
3239 idir 134
 
3228 delphine 135
	/* Recherche si le projet existe sinon va chercher les infos de base */
136
	private function rechercherProjet() {
137
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
3239 idir 138
		$estProjetDefini = true;
139
		$tab = array();
3228 delphine 140
		$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
3239 idir 141
		$json = $this->getDao()->consulter($url);
142
 
3257 delphine 143
		if ( $json !== "[]" ) {
3239 idir 144
			$tab = $this->rechercherChampsSupp();
145
		} else {
146
			$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
147
			$json = $this->getDao()->consulter($url);
3228 delphine 148
			$estProjetDefini = false;
149
		}
3239 idir 150
		$tableau = json_decode($json, true);
3228 delphine 151
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
152
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
3249 idir 153
		if ($tableau['milieux'] != '') {
154
			$tableau['milieux'] = explode(';', $tableau['milieux']);
3228 delphine 155
		} else {
156
			$tableau['milieux'] = array();
157
		}
3239 idir 158
		$tableau['chpSupp'] = $tab;
3240 idir 159
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
3249 idir 160
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['dossierTmp'] . $tableau['projet'] . $langue_projet_url . '/' );
3228 delphine 161
		return $tableau;
162
	}
3239 idir 163
 
3228 delphine 164
	/* Recherche si un projet a des champs de saisie supplémentaire */
165
	private function rechercherChampsSupp() {
166
		$retour = array();
3239 idir 167
		$projet = $this->parametres['projet'];
168
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
3228 delphine 169
		$json = $this->getDao()->consulter($url);
170
		$retour = (array) json_decode($json, true);
3249 idir 171
 
3239 idir 172
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
173
 
174
 
3249 idir 175
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
176
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
177
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
3239 idir 178
 
179
			if ( isset( $chsup['fieldValues'] ) ) {
180
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $chsup['fieldValues'], true );
181
				if ( isset($retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] ) ) {
3249 idir 182
					$retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] = $this->clean_string( $retour[$projet]['champs-supp'][$key]['fieldValues']['placeholder'] );
3239 idir 183
				}
184
 
185
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
186
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value ) {
3249 idir 187
						$retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'][$list_key] = $this->clean_string( $list_value );
3228 delphine 188
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
3249 idir 189
						$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( $list_value ) );
3228 delphine 190
					}
191
				}
192
			}
3239 idir 193
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
3228 delphine 194
		}
195
		return $retour;
196
	}
3239 idir 197
 
3249 idir 198
	private function clean_string( $string ) {
199
		// les fonctions de base de php ne parviennent pas à une conversion satisfaisante des codes ascii
200
		// qui ont été générés automatiquement lors de la transmission des chaines en json
201
		// dans le widget cel manager vers la base
202
		// Pour les mêmes raisons, @apos@ et @quot@ est une autre astuces utilisée dans ce même widget
203
		// pour permettre la transmission des apostrophes et guillements sans erreur
204
		$patterns = array( '/\@apos\@/', '/\@quot\@/', '/u00c0/', '/u00c1/', '/u00c2/', '/u00c3/', '/u00c4/', '/u00c5/', '/u00c6/', '/u00c7/', '/u00c8/', '/u00c9/', '/u00ca/', '/u00cb/', '/u00cc/', '/u00cd/', '/u00ce/', '/u00cf/', '/u00d1/', '/u00d2/', '/u00d3/', '/u00d4/', '/u00d5/', '/u00d6/', '/u00d8/', '/u00d9/', '/u00da/', '/u00db/', '/u00dc/', '/u00dd/', '/u00df/', '/u00e0/', '/u00e1/', '/u00e2/', '/u00e3/', '/u00e4/', '/u00e5/', '/u00e6/', '/u00e7/', '/u00e8/', '/u00e9/', '/u00ea/', '/u00eb/', '/u00ec/', '/u00ed/', '/u00ee/', '/u00ef/', '/u00f0/', '/u00f1/', '/u00f2/', '/u00f3/', '/u00f4/', '/u00f5/', '/u00f6/', '/u00f8/', '/u00f9/', '/u00fa/', '/u00fb/', '/u00fc/', '/u00fd/', '/u00ff/' );
205
		$replacements = array( '&apos;', '&quot;', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý','ÿ' );
206
 
207
		$clean_string = preg_replace( $patterns, $replacements, $string );
208
 
209
		return $clean_string;
210
	}
211
 
3239 idir 212
 
213
 
3228 delphine 214
	// remplace certains parametres définis en bd par les parametres définis dans l'url
215
	private function traiterParametres($estProjetDefini, $tableau) {
216
		$criteres = array('tag', 'motcle', 'projet', 'titre', 'logo');
217
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
218
		foreach($this->parametres as $nom_critere => $valeur_critere) {
3249 idir 219
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
3228 delphine 220
				$tableau[$nom_critere] = $valeur_critere;
221
			} else if (in_array($nom_critere, $criteres)) {
222
				$tableau[$nom_critere] = $valeur_critere;
223
			}
224
		}
225
		return $tableau;
226
	}
3239 idir 227
 
228
 
229
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
230
		$retour = array();
231
		$referentiel = $infos_projets['referentiel'];
3228 delphine 232
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
3260 idir 233
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
234
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
3228 delphine 235
		$retour['ns_referentiel'] = $referentiel;
3239 idir 236
 
237
		if ( isset( $infos_projets['type_especes'] ) ) {
238
 
239
			switch ( $infos_projets['type_especes'] ) {
3249 idir 240
				case 'fixe' :
3257 delphine 241
					$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['especes'] );
3228 delphine 242
					break;
3257 delphine 243
				case 'referentiel' : break;
3249 idir 244
				case 'liste' :
3239 idir 245
					$referentiel = $infos_projets['referentiel'];
3256 idir 246
////////////////////// temporaire test transmission liste taxons
247
					$retour['taxons'] = $this->recupererListeNomsSci();
3239 idir 248
					break;
3228 delphine 249
			}
3239 idir 250
		} else if ( isset( $infos_projets['referentiel'] ) ) {
3228 delphine 251
			$referentiel = $infos_projets['referentiel'];
3239 idir 252
			if ( isset($infos_projets['num_nom'] ) ) {
3257 delphine 253
				$retour = $this->chargerInfosTaxon( $infos_projets['referentiel'], $infos_projets['num_nom'] );
3228 delphine 254
			}
255
		}
256
		return $retour;
257
	}
3239 idir 258
 
3228 delphine 259
	/**
260
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
261
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
262
	 * et non le taxon?)
263
	 * @param string|int $num_nom
264
	 * @return array
265
	 */
3239 idir 266
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
267
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
268
		$infos = json_decode( file_get_contents( $url_service_infos ) );
3228 delphine 269
		// trop de champs injectés dans les infos espèces peuvent
270
		// faire planter javascript
3239 idir 271
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet',
272
				'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
3228 delphine 273
		$resultat = array();
274
		$retour = array();
3239 idir 275
		if ( isset( $infos ) && !empty( $infos ) ) {
276
			$infos = (array) $infos;
3249 idir 277
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
3239 idir 278
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
3249 idir 279
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
3228 delphine 280
				$retour['espece_imposee'] = true;
281
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
282
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
3239 idir 283
				$retour['infos_espece'] = $this->array2js( $resultat, true );
3228 delphine 284
			}
285
		}
286
		return $retour;
287
	}
3120 delphine 288
 
3239 idir 289
	protected function getReferentielImpose() {
290
		$referentiel_impose = true;
3249 idir 291
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
3239 idir 292
			$this->ns_referentiel = $_GET['referentiel'];
293
		} else if (isset($this->configProjet['referentiel'])) {
294
			$this->ns_referentiel = $this->configProjet['referentiel'];
295
		} else if (isset($this->configMission['referentiel'])) {
296
			$this->ns_referentiel = $this->configMission['referentiel'];
297
		} else {
298
			$referentiel_impose = false;
299
		}
300
		return $referentiel_impose;
301
	}
3231 delphine 302
 
3228 delphine 303
	/**
3256 idir 304
	 * Trie par nom français les taxons lus dans le fichier csv
3228 delphine 305
	 */
306
	protected function recupererListeNomsSci() {
307
		$taxons = $this->recupererListeTaxon();
308
		if (is_array($taxons)) {
309
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
310
		}
311
		return $taxons;
312
	}
3239 idir 313
 
3228 delphine 314
	/**
315
	 * @TODO documenter
316
	 * @return array
317
	 */
318
	protected function recupererListeNoms() {
319
		$taxons = $this->recupererListeTaxon();
320
		$nomsAAfficher = array();
321
		$nomsSpeciaux = array();
322
		if (is_array($taxons)) {
323
			foreach ($taxons as $taxon) {
324
				$nomSciTitle = $taxon['nom_ret'].
325
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
326
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
327
				$nomFrTitle = $taxon['nom_sel'].
328
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
329
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
3239 idir 330
 
3228 delphine 331
				if ($taxon['groupe'] == 'special') {
332
					$nomsSpeciaux[] = array(
333
							'num_nom' => $taxon['num_nom_sel'],
334
							'nom_a_afficher' => $taxon['nom_fr'],
335
							'nom_a_sauver' => $taxon['nom_sel'],
336
							'nom_title' => $nomSciTitle,
337
							'nom_type' => 'nom-special');
338
				} else {
339
					$nomsAAfficher[] = array(
340
							'num_nom' => $taxon['num_nom_sel'],
341
							'nom_a_afficher' => $taxon['nom_sel'],
342
							'nom_a_sauver' => $taxon['nom_sel'],
343
							'nom_title' => $nomSciTitle,
344
							'nom_type' => 'nom-sci');
345
					$nomsAAfficher[] = array(
346
							'num_nom' => $taxon['num_nom_sel'],
347
							'nom_a_afficher' => $taxon['nom_fr'],
348
							'nom_a_sauver' => $taxon['nom_fr'],
349
							'nom_title' => $nomFrTitle,
350
							'nom_type' => 'nom-fr');
351
				}
352
			}
353
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
354
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
355
		}
356
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
357
	}
3239 idir 358
 
3228 delphine 359
	/**
3256 idir 360
	 * Lit une liste de taxons depuis un fichier csv fourni
3228 delphine 361
	 */
362
	protected function recupererListeTaxon() {
363
		$taxons = array();
3256 idir 364
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
365
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
3260 idir 366
		$fichier_csv = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . 'especes.csv';
3257 delphine 367
 
3256 idir 368
		if ( file_exists( $fichier_csv ) && is_readable( $fichier_csv ) ) {
369
			$taxons = $this->decomposerFichierCsv( $fichier_csv );
3228 delphine 370
		} else {
3256 idir 371
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_csv'.";
3228 delphine 372
		}
373
		return $taxons;
374
	}
3239 idir 375
 
3228 delphine 376
	/**
3256 idir 377
	 * Découpe un fihcier csv
3228 delphine 378
	 */
3256 idir 379
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
3228 delphine 380
		$header = null;
381
		$data = array();
3256 idir 382
		if (($handle = fopen($fichier, "r")) !== FALSE) {
3228 delphine 383
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
384
				if (!$header) {
385
					$header = $row;
386
				} else {
387
					$data[] = array_combine($header, $row);
388
				}
389
			}
390
			fclose($handle);
391
		}
392
		return $data;
393
	}
3239 idir 394
 
3228 delphine 395
	/**
396
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
397
	 * @param array $array
398
	 * @param boolean $show_keys
399
	 * @return une portion de JSON représentant le tableau
400
	 */
401
	protected function array2js($array,$show_keys) {
402
		$tableauJs = '{}';
403
		if (!empty($array)) {
404
			$total = count($array) - 1;
405
			$i = 0;
406
			$dimensions = array();
407
			foreach ($array as $key => $value) {
408
				if (is_array($value)) {
409
					$dimensions[$i] = array2js($value,$show_keys);
410
					if ($show_keys) {
3260 idir 411
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
3228 delphine 412
					}
413
				} else {
3260 idir 414
					$dimensions[$i] = '\"'.addslashes($value).'\"';
3228 delphine 415
					if ($show_keys) {
3260 idir 416
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
3228 delphine 417
					}
418
				}
419
				if ($i == 0) {
420
					$dimensions[$i] = '{'.$dimensions[$i];
421
				}
422
				if ($i == $total) {
423
					$dimensions[$i].= '}';
424
				}
425
				$i++;
426
			}
427
			$tableauJs = implode(',', $dimensions);
428
		}
429
		return $tableauJs;
430
	}
3120 delphine 431
 
3257 delphine 432
	private function remove_accents($string) {
433
	    if ( !preg_match('/[\x80-\xff]/', $string) )
434
	        return $string;
3260 idir 435
 
3257 delphine 436
	        $chars = array(
437
	            // Decompositions for Latin-1 Supplement
438
	            chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
439
	            chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
440
	            chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
441
	            chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
442
	            chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
443
	            chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
444
	            chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
445
	            chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
446
	            chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
447
	            chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
448
	            chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
449
	            chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
450
	            chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
451
	            chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
452
	            chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
453
	            chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
454
	            chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
455
	            chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
456
	            chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
457
	            chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
458
	            chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
459
	            chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
460
	            chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
461
	            chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
462
	            chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
463
	            chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
464
	            chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
465
	            chr(195).chr(191) => 'y',
466
	            // Decompositions for Latin Extended-A
467
	            chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
468
	            chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
469
	            chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
470
	            chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
471
	            chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
472
	            chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
473
	            chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
474
	            chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
475
	            chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
476
	            chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
477
	            chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
478
	            chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
479
	            chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
480
	            chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
481
	            chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
482
	            chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
483
	            chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
484
	            chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
485
	            chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
486
	            chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
487
	            chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
488
	            chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
489
	            chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
490
	            chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
491
	            chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
492
	            chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
493
	            chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
494
	            chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
495
	            chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
496
	            chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
497
	            chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
498
	            chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
499
	            chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
500
	            chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
501
	            chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
502
	            chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
503
	            chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
504
	            chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
505
	            chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
506
	            chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
507
	            chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
508
	            chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
509
	            chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
510
	            chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
511
	            chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
512
	            chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
513
	            chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
514
	            chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
515
	            chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
516
	            chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
517
	            chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
518
	            chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
519
	            chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
520
	            chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
521
	            chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
522
	            chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
523
	            chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
524
	            chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
525
	            chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
526
	            chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
527
	            chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
528
	            chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
529
	            chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
530
	            chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
531
	        );
532
 
533
	        $string = strtr($string, $chars);
534
 
535
	        return $string;
536
	}
3120 delphine 537
}
3239 idir 538
?>