Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3638 delphine 1
 <?php
2
// declare(encoding='UTF-8');
712 jpm 3
/**
3638 delphine 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
712 jpm 7
 *
8
 * Cas d'utilisation et documentation :
3638 delphine 9
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
712 jpm 10
 *
11
 * Paramètres :
3638 delphine 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.
712 jpm 16
 *
3638 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)
712 jpm 22
 */
23
class Saisie extends WidgetCommun {
1050 jpm 24
 
712 jpm 25
	const DS = DIRECTORY_SEPARATOR;
3638 delphine 26
	const SERVICE_DEFAUT = 'saisie';
1580 jpm 27
	const WS_SAISIE = 'CelWidgetSaisie';
1888 mathias 28
	const WS_UPLOAD = 'CelWidgetUploadImageTemp';
1580 jpm 29
	const WS_OBS = 'CelObs';
3638 delphine 30
	const WS_COORD = 'CoordSearch';
31
	const LANGUE_DEFAUT = 'fr';
32
	const PROJET_DEFAUT = 'base';
1580 jpm 33
	const WS_NOM = 'noms';
34
	const EFLORE_API_VERSION = '0.1';
3638 delphine 35
	const WIDGETS_SPECIAUX = ['tb_aupresdemonarbre','tb_streets','tb_lichensgo'];
36
	const SQUELETTES_SPECIAUX = ['arbres','plantes','lichens'];
37
	const WS_OBS_LIST = 'InventoryObservationList';
38
	const WS_IMG_LIST = 'celImage';
39
	private $cel_url_tpl = null;
40
	/** Si spécifié, on ajoute une barre de navigation inter-applications */
41
	private $bar;
42
	//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
43
	private $parametres_autorises = array(
44
			'projet' => 'projet',
45
			'type' => 'type',
46
			'langue' => 'langue',
47
			'order' => 'order'
48
	);
712 jpm 49
	/**
3638 delphine 50
	 * Méthode appelée par défaut pour charger ce widget.
712 jpm 51
	 */
52
	public function executer() {
3638 delphine 53
		$retour = null;
54
		// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
55
		unset($this->parametres['callback']);
56
		extract($this->parametres);
57
		$this->bar = (isset($bar)) ? $bar : false;
58
		/* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
59
		 Sinon, rien ne sera chargé.
60
		 L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
61
		 de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
62
		 l'application.
63
		 Chemin du fichier chargeant le framework requis */
64
		$framework = dirname(__FILE__).'/framework.php';
65
		if (!file_exists($framework)) {
66
			$e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
67
			trigger_error($e, E_USER_ERROR);
68
		} else {
69
			// Inclusion du Framework
70
			require_once $framework;
71
			// Ajout d'information concernant cette application
72
			Framework::setCheminAppli(__FILE__);// Obligatoire
73
			Framework::setInfoAppli(Config::get('info'));// Optionnel
712 jpm 74
 
2500 mathias 75
		}
3638 delphine 76
		$langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
77
		$this->langue = I18n::setLangue($langue);
78
		$this->parametres['langue'] = $langue;
1050 jpm 79
 
3638 delphine 80
		if (!isset($mode)) {
81
			$mode = self::SERVICE_DEFAUT;
3042 mathias 82
		}
3638 delphine 83
		if (!isset($projet)) {
84
			$this->parametres['projet'] = self::PROJET_DEFAUT;
85
		}
3042 mathias 86
 
3638 delphine 87
		$methode = $this->traiterNomMethodeExecuter($mode);
712 jpm 88
		if (method_exists($this, $methode)) {
89
			$retour = $this->$methode();
90
		} else {
3638 delphine 91
			$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
712 jpm 92
		}
93
 
3638 delphine 94
		$contenu = ''; //print_r($retour);exit;
95
		if (is_null($retour)) {
96
			$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
97
		} else {
98
			if (isset($retour['donnees'])) {
99
				// ne pas afficher le projet dans l'url si on est dans saisie de base
3662 delphine 100
				$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?projet='. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
3638 delphine 101
 
102
				$retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
103
				$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
104
				$retour['donnees']['bar'] = $this->bar;
105
				$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
106
				$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
107
				$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
108
				$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
109
				$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
110
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
111
				$retour['donnees']['mode'] = $mode;
112
				$retour['donnees']['langue'] = $langue;
113
				$retour['donnees']['widgets_url'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'],'');
114
				$retour['donnees']['url_ws_obs_list'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS_LIST);
115
				$retour['donnees']['url_ws_cel_imgs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_IMG_LIST) . '/liste-ids?obsId=';
116
				$retour['donnees']['url_ws_cel_img_url'] = str_replace ( '%s.jpg', '{id}XS', $this->config['chemins']['celImgUrlTpl'] );
117
				$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
118
				switch ( $retour['squelette'] ) {
119
					case 'apa':
120
						$retour['donnees']['squelette'] = $this->parametres['projet'];
121
						break;
122
					case 'apaforms':
123
						$retour['donnees']['squelette'] = $this->parametres['squelette'];
124
						break;
125
					default:
126
						$retour['donnees']['squelette'] = $retour['squelette'];
127
						break;
128
				}
129
				$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
1475 aurelien 130
			} else {
3638 delphine 131
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
1475 aurelien 132
			}
712 jpm 133
		}
3638 delphine 134
		$this->envoyer($contenu);
712 jpm 135
	}
1050 jpm 136
 
3638 delphine 137
 
138
	private function executerSaisie() {
139
		$retour = array();
140
		if (in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX) ) {
141
			if (isset($this->parametres['squelette']) && in_array($this->parametres['squelette'], self::SQUELETTES_SPECIAUX) ) {
142
				$retour['squelette'] = 'apaforms';
2408 jpm 143
			} else {
3638 delphine 144
				$retour['squelette'] = 'apa';
1050 jpm 145
			}
719 jpm 146
		} else {
3638 delphine 147
			$retour['squelette'] = 'saisie';
148
			$retour['donnees']['general']     = I18n::get('General');
149
			$retour['donnees']['aide']        = I18n::get('Aide');
150
			$retour['donnees']['observateur'] = I18n::get('Observateur');
151
			$retour['donnees']['observation'] = I18n::get('Observation');
152
			$retour['donnees']['image']       = I18n::get('Image');
153
	 		$retour['donnees']['chpsupp']     = I18n::get('Chpsupp');
154
	 		$retour['donnees']['resume']      = I18n::get('Resume');
719 jpm 155
		}
3638 delphine 156
		$retour['donnees']['widget'] = $this->rechercherProjet();
157
		return $retour;
719 jpm 158
	}
1526 jpm 159
 
3638 delphine 160
	/* Recherche si le projet existe sinon va chercher les infos de base */
161
	private function rechercherProjet() {
162
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
163
		$estProjetDefini = true;
164
		$tab = array();
165
		$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
166
		$json = $this->getDao()->consulter($url);
167
		if (!in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX)){
168
			if ( $json !== "[]") {
169
				$tab = $this->rechercherChampsSupp();
170
			} else {
171
				$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
172
				$json = $this->getDao()->consulter($url);
173
				$estProjetDefini = false;
174
			}
175
		}
176
		$tableau = json_decode($json, true);
177
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
178
		if (
179
			isset($this->parametres['squelette']) &&
180
			($this->parametres['squelette'] === 'plantes' || $this->parametres['squelette'] === 'lichens')
181
		) {
182
			$tableau['type_especes'] = 'liste';
183
			if ( $this->parametres['squelette'] === 'lichens' ) {
184
				$tableau['referentiel'] = 'taxref';
185
			}
186
		}
187
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
188
		if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
189
			// si on trouve ":" dans referentiel, referentiel = première partie
190
			$tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
191
		}
192
		$tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
193
		if(!isset($this->parametres['id-obs'])) {
194
			if (isset($this->parametres['dept']) || isset($this->parametres['commune'],$this->parametres['dept']) || isset($this->parametres['code_insee'])) {
195
				$localisation = $this->traiterParamsLocalisation($this->parametres);
196
				// les paramètres dans l'url peuvent surcharger les données de localisation de la bdd
197
				if ($localisation) $tableau['localisation'] = $localisation;
198
			}
199
			if (isset($tableau['localisation'])) $tableau['localisation'] = $this->traiterLocalisation($tableau['localisation']);
200
		}
201
		if (isset($tableau['motscles'])) {
202
    		if (isset($tableau['tag-obs'])) {
203
    		    $tableau['tag-obs'] .= $tableau['motscles'];
204
		    } else if (isset($tableau['tag-img'])) {
205
		        $tableau['tag-img'] .= $tableau['motscles'];
206
		    } else {
207
		        $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
208
		    }
209
 
210
		}
211
		$tableau['chpSupp'] = $tab;
212
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
213
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
214
		return $tableau;
1476 aurelien 215
	}
1050 jpm 216
 
3638 delphine 217
	/* Recherche si un projet a des champs de saisie supplémentaire */
218
	private function rechercherChampsSupp() {
219
		$retour = array();
220
		$projet = $this->parametres['projet'];
221
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
222
		$json = $this->getDao()->consulter($url);
223
		$retour = json_decode($json, true);
1526 jpm 224
 
3638 delphine 225
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
1526 jpm 226
 
3638 delphine 227
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
228
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
229
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
2848 mathias 230
 
3638 delphine 231
			if ( isset( $chsup['fieldValues'] ) ) {
232
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
3037 mathias 233
 
3638 delphine 234
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
235
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
236
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
237
						$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = ($list_value_array !== 'other') ? 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( strtolower($list_value_array[0] ) ) ) : '';
238
					}
239
				}
240
			}
241
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
1536 jpm 242
		}
3638 delphine 243
		return $retour;
244
	}
2406 jpm 245
 
3638 delphine 246
	// remplace certains parametres définis en bd par les parametres définis dans l'url
247
	private function traiterParametres($estProjetDefini, $tableau) {
248
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
249
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
250
		foreach($this->parametres as $nom_critere => $valeur_critere) {
251
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
252
				$tableau[$nom_critere] = $valeur_critere;
253
			} else if (in_array($nom_critere, $criteres)) {
254
				$tableau[$nom_critere] = $valeur_critere;
2328 jpm 255
			}
2406 jpm 256
		}
3638 delphine 257
		return $tableau;
719 jpm 258
	}
1526 jpm 259
 
3638 delphine 260
	private function traiterLocalisation( $infos_localisation ) {
261
		$infos = explode(';', $infos_localisation);
262
		$tableauTmp = array();
263
		$retour = array();
264
		foreach ($infos as $info) {
265
			$tableauTmp = explode(':', $info);
266
			$retour[$tableauTmp[0]] = $tableauTmp[1];
2408 jpm 267
		}
3638 delphine 268
		return $retour;
1475 aurelien 269
	}
1050 jpm 270
 
3638 delphine 271
	private function traiterParamsLocalisation( $params ) {
272
		$infos = array();
273
		$tableauTmp = array();
274
		$zoom = '12';
275
		if (isset($params['commune'])) {
276
			$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?zone='.$params['commune'].'&code='.$params['dept'];
277
		} else if (isset($params['dept'])) {
278
			// pas trouvé de manière simple de déterminer le centroïde du département
279
			// du coup on retrouve le code insee du chef lieu
280
			$params['code_insee'] = $this->recupererChefLieuDept($params['dept']);
281
			$zoom = '9';
2851 mathias 282
		}
3638 delphine 283
		// quoi qu'il arrive, s'il est défini, on donne la priorité au code insee (plus précis)
284
		if (isset($params['code_insee'])) {
285
			$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?code='.$params['code_insee'];
2851 mathias 286
		}
3638 delphine 287
		if(!empty($url)) $json = $this->getDao()->consulter($url);
288
		if(!empty($json)) $infos = json_decode($json, true);
289
		if(!empty($infos)) {
290
			$infos['lat'] = str_replace(',','.',strval(round($infos['lat'],5)));
291
			$infos['lng'] = str_replace(',','.',strval(round($infos['lng'],5)));
292
			return 'latitude:'.$infos['lat'].';longitude:'.$infos['lng'].';zoom:'.$zoom;
293
		} else {
294
			return false;
2851 mathias 295
		}
296
	}
2916 mathias 297
 
3638 delphine 298
	private function rechercherInfosEspeces( $infos_projets ) {
299
		$retour = array();
300
		$referentiel = $infos_projets['referentiel'];
301
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
302
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
303
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
304
		$retour['ns_referentiel'] = $referentiel;
305
 
306
		if ( isset( $infos_projets['type_especes'] ) ) {
307
 
308
			switch ( $infos_projets['type_especes'] ) {
309
				case 'fixe' :
310
					$info_taxon = explode(':', $referentiel);
311
					if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
312
						$retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
313
					}
314
					break;
315
				case 'referentiel' : break;
316
				case 'liste' :
317
					$retour['taxons'] = $this->recupererListeNomsSci();
318
					break;
319
			}
320
		} else if ( isset( $referentiel ) ) {
321
			if ( isset($infos_projets['num_nom'] ) ) {
322
				$retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
323
			}
2916 mathias 324
		}
3638 delphine 325
		return $retour;
2916 mathias 326
	}
327
 
3638 delphine 328
	/**
329
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
330
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
331
	 * et non le taxon?)
332
	 * @param string|int $num_nom
333
	 * @return array
334
	 */
335
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
336
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
337
		$infos = json_decode( file_get_contents( $url_service_infos ) );
338
		// trop de champs injectés dans les infos espèces peuvent
339
		// faire planter javascript
340
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
341
		$resultat = array();
342
		$retour = array();
343
		if ( isset( $infos ) && !empty( $infos ) ) {
344
			$infos = (array) $infos;
345
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
346
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
347
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
348
				$retour['espece_imposee'] = true;
349
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
350
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
351
				$retour['infos_espece'] = $this->array2js( $resultat, true );
352
			}
2906 aurel 353
		}
3638 delphine 354
		return $retour;
2906 aurel 355
	}
2851 mathias 356
 
357
	protected function getReferentielImpose() {
2869 mathias 358
		$referentiel_impose = true;
3638 delphine 359
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
2851 mathias 360
			$this->ns_referentiel = $_GET['referentiel'];
2869 mathias 361
		} else if (isset($this->configProjet['referentiel'])) {
362
			$this->ns_referentiel = $this->configProjet['referentiel'];
363
		} else if (isset($this->configMission['referentiel'])) {
364
			$this->ns_referentiel = $this->configMission['referentiel'];
365
		} else {
366
			$referentiel_impose = false;
2851 mathias 367
		}
368
		return $referentiel_impose;
369
	}
370
 
2688 mathias 371
	/**
3638 delphine 372
	 * Trie par nom français les taxons lus dans le fichier csv/tsv
2805 mathias 373
	 */
2688 mathias 374
	protected function recupererListeNomsSci() {
1613 jpm 375
		$taxons = $this->recupererListeTaxon();
376
		if (is_array($taxons)) {
377
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
378
		}
1629 jpm 379
		return $taxons;
1613 jpm 380
	}
381
 
2688 mathias 382
	/**
383
	 * @TODO documenter
384
	 * @return array
385
	 */
386
	protected function recupererListeNoms() {
1613 jpm 387
		$taxons = $this->recupererListeTaxon();
388
		$nomsAAfficher = array();
389
		$nomsSpeciaux = array();
390
		if (is_array($taxons)) {
391
			foreach ($taxons as $taxon) {
392
				$nomSciTitle = $taxon['nom_ret'].
3638 delphine 393
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
394
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 395
				$nomFrTitle = $taxon['nom_sel'].
3638 delphine 396
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
397
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 398
 
399
				if ($taxon['groupe'] == 'special') {
400
					$nomsSpeciaux[] = array(
3638 delphine 401
							'num_nom' => $taxon['num_nom_sel'],
402
							'nom_a_afficher' => $taxon['nom_fr'],
403
							'nom_a_sauver' => $taxon['nom_sel'],
404
							'nom_title' => $nomSciTitle,
405
							'nom_type' => 'nom-special');
1613 jpm 406
				} else {
407
					$nomsAAfficher[] = array(
3638 delphine 408
							'num_nom' => $taxon['num_nom_sel'],
409
							'nom_a_afficher' => $taxon['nom_sel'],
410
							'nom_a_sauver' => $taxon['nom_sel'],
411
							'nom_title' => $nomSciTitle,
412
							'nom_type' => 'nom-sci');
1613 jpm 413
					$nomsAAfficher[] = array(
3638 delphine 414
							'num_nom' => $taxon['num_nom_sel'],
415
							'nom_a_afficher' => $taxon['nom_fr'],
416
							'nom_a_sauver' => $taxon['nom_fr'],
417
							'nom_title' => $nomFrTitle,
418
							'nom_type' => 'nom-fr');
1613 jpm 419
				}
420
			}
421
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
422
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
423
		}
424
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
425
	}
2328 jpm 426
 
2688 mathias 427
	/**
3638 delphine 428
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
2688 mathias 429
	 */
430
	protected function recupererListeTaxon() {
431
		$taxons = array();
3638 delphine 432
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
433
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
434
		$nom_fichier = ($this->parametres['squelette'] === 'lichens') ? 'lichens_taxons' : 'especes';
435
		$chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . $nom_fichier. '.';
436
 
437
		if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
438
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
439
		} else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
440
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
3017 delphine 441
		} else {
3638 delphine 442
			$this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
443
		}
444
		return $taxons;
445
	}
446
 
447
	/**
448
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
449
	 */
450
	protected function recupererChefLieuDept($dept) {
451
		$infosDepts = array();
452
		$code_insee = '';
453
		$chemin_fichier = dirname(__FILE__).self::DS.'squelettes'.self::DS.'dept.csv';
454
 
455
		if (file_exists($chemin_fichier ) && is_readable($chemin_fichier)) {
456
			$infosDepts = $this->decomposerFichierCsv( $chemin_fichier,"," );
457
			if(!empty($infosDepts) && is_array($infosDepts)) {
458
				foreach ($infosDepts as $key => $infosDept) {
459
					if($dept == $infosDept['dep']) {
460
						return $code_insee = $infosDept['cheflieu'];
461
					}
462
				}
3042 mathias 463
			}
2328 jpm 464
		} else {
3638 delphine 465
			$this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
2328 jpm 466
		}
712 jpm 467
	}
1050 jpm 468
 
2688 mathias 469
	/**
3638 delphine 470
	 * Découpe un fihcier csv/tsv
2688 mathias 471
	 */
3638 delphine 472
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
2328 jpm 473
		$header = null;
474
		$data = array();
3638 delphine 475
		if (($handle = fopen($fichier, "r")) !== FALSE) {
2328 jpm 476
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
477
				if (!$header) {
478
					$header = $row;
479
				} else {
480
					$data[] = array_combine($header, $row);
481
				}
482
			}
483
			fclose($handle);
484
		}
485
		return $data;
486
	}
487
 
2688 mathias 488
	/**
489
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
490
	 * @param array $array
491
	 * @param boolean $show_keys
492
	 * @return une portion de JSON représentant le tableau
493
	 */
494
	protected function array2js($array,$show_keys) {
1536 jpm 495
		$tableauJs = '{}';
496
		if (!empty($array)) {
497
			$total = count($array) - 1;
498
			$i = 0;
499
			$dimensions = array();
500
			foreach ($array as $key => $value) {
501
				if (is_array($value)) {
502
					$dimensions[$i] = array2js($value,$show_keys);
503
					if ($show_keys) {
3638 delphine 504
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 505
					}
506
				} else {
3638 delphine 507
					$dimensions[$i] = '\"'.addslashes($value).'\"';
1536 jpm 508
					if ($show_keys) {
3638 delphine 509
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 510
					}
1526 jpm 511
				}
1536 jpm 512
				if ($i == 0) {
513
					$dimensions[$i] = '{'.$dimensions[$i];
1526 jpm 514
				}
1536 jpm 515
				if ($i == $total) {
516
					$dimensions[$i].= '}';
517
				}
518
				$i++;
1526 jpm 519
			}
1536 jpm 520
			$tableauJs = implode(',', $dimensions);
1526 jpm 521
		}
1536 jpm 522
		return $tableauJs;
1526 jpm 523
	}
2906 aurel 524
}
3638 delphine 525
?>