Subversion Repositories eFlore/Applications.cel

Rev

Rev 3844 | 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']);
3700 idir 106
				$retour['donnees']['url_remarques'] = $this->config['chemins']['widgetRemarquesUrl'];
3638 delphine 107
				$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
108
				$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
109
				$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
110
				$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
3844 idir 111
				$retour['donnees']['url_ws_geoloc'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD);
3638 delphine 112
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
113
				$retour['donnees']['mode'] = $mode;
114
				$retour['donnees']['langue'] = $langue;
115
				$retour['donnees']['widgets_url'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'],'');
116
				$retour['donnees']['url_ws_obs_list'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS_LIST);
117
				$retour['donnees']['url_ws_cel_imgs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_IMG_LIST) . '/liste-ids?obsId=';
118
				$retour['donnees']['url_ws_cel_img_url'] = str_replace ( '%s.jpg', '{id}XS', $this->config['chemins']['celImgUrlTpl'] );
119
				$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
120
				switch ( $retour['squelette'] ) {
121
					case 'apa':
122
						$retour['donnees']['squelette'] = $this->parametres['projet'];
123
						break;
124
					case 'apaforms':
125
						$retour['donnees']['squelette'] = $this->parametres['squelette'];
126
						break;
127
					default:
128
						$retour['donnees']['squelette'] = $retour['squelette'];
129
						break;
130
				}
131
				$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
1475 aurelien 132
			} else {
3638 delphine 133
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
1475 aurelien 134
			}
712 jpm 135
		}
3638 delphine 136
		$this->envoyer($contenu);
712 jpm 137
	}
1050 jpm 138
 
3638 delphine 139
 
140
	private function executerSaisie() {
141
		$retour = array();
142
		if (in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX) ) {
143
			if (isset($this->parametres['squelette']) && in_array($this->parametres['squelette'], self::SQUELETTES_SPECIAUX) ) {
144
				$retour['squelette'] = 'apaforms';
2408 jpm 145
			} else {
3638 delphine 146
				$retour['squelette'] = 'apa';
1050 jpm 147
			}
719 jpm 148
		} else {
3638 delphine 149
			$retour['squelette'] = 'saisie';
150
			$retour['donnees']['general']     = I18n::get('General');
151
			$retour['donnees']['aide']        = I18n::get('Aide');
152
			$retour['donnees']['observateur'] = I18n::get('Observateur');
153
			$retour['donnees']['observation'] = I18n::get('Observation');
154
			$retour['donnees']['image']       = I18n::get('Image');
155
	 		$retour['donnees']['chpsupp']     = I18n::get('Chpsupp');
156
	 		$retour['donnees']['resume']      = I18n::get('Resume');
719 jpm 157
		}
3638 delphine 158
		$retour['donnees']['widget'] = $this->rechercherProjet();
159
		return $retour;
719 jpm 160
	}
1526 jpm 161
 
3638 delphine 162
	/* Recherche si le projet existe sinon va chercher les infos de base */
163
	private function rechercherProjet() {
164
		// projet avec un squelette défini (et non juste un mot-clé d'observation)
165
		$estProjetDefini = true;
166
		$tab = array();
167
		$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
168
		$json = $this->getDao()->consulter($url);
169
		if (!in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX)){
170
			if ( $json !== "[]") {
171
				$tab = $this->rechercherChampsSupp();
172
			} else {
173
				$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
174
				$json = $this->getDao()->consulter($url);
175
				$estProjetDefini = false;
176
			}
177
		}
178
		$tableau = json_decode($json, true);
179
		$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
180
		if (
181
			isset($this->parametres['squelette']) &&
182
			($this->parametres['squelette'] === 'plantes' || $this->parametres['squelette'] === 'lichens')
183
		) {
184
			$tableau['type_especes'] = 'liste';
185
			if ( $this->parametres['squelette'] === 'lichens' ) {
3799 delphine 186
				$tableau['referentiel'] = 'taxreflich';
3638 delphine 187
			}
188
		}
189
		$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
190
		if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
191
			// si on trouve ":" dans referentiel, referentiel = première partie
192
			$tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
193
		}
194
		$tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
195
		if(!isset($this->parametres['id-obs'])) {
196
			if (isset($this->parametres['dept']) || isset($this->parametres['commune'],$this->parametres['dept']) || isset($this->parametres['code_insee'])) {
197
				$localisation = $this->traiterParamsLocalisation($this->parametres);
198
				// les paramètres dans l'url peuvent surcharger les données de localisation de la bdd
199
				if ($localisation) $tableau['localisation'] = $localisation;
200
			}
201
			if (isset($tableau['localisation'])) $tableau['localisation'] = $this->traiterLocalisation($tableau['localisation']);
202
		}
203
		if (isset($tableau['motscles'])) {
204
    		if (isset($tableau['tag-obs'])) {
205
    		    $tableau['tag-obs'] .= $tableau['motscles'];
206
		    } else if (isset($tableau['tag-img'])) {
207
		        $tableau['tag-img'] .= $tableau['motscles'];
208
		    } else {
209
		        $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
210
		    }
211
 
212
		}
213
		$tableau['chpSupp'] = $tab;
214
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
215
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
216
		return $tableau;
1476 aurelien 217
	}
1050 jpm 218
 
3638 delphine 219
	/* Recherche si un projet a des champs de saisie supplémentaire */
220
	private function rechercherChampsSupp() {
221
		$retour = array();
222
		$projet = $this->parametres['projet'];
223
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
224
		$json = $this->getDao()->consulter($url);
225
		$retour = json_decode($json, true);
1526 jpm 226
 
3638 delphine 227
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
1526 jpm 228
 
3638 delphine 229
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
230
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
231
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
2848 mathias 232
 
3638 delphine 233
			if ( isset( $chsup['fieldValues'] ) ) {
234
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
3037 mathias 235
 
3638 delphine 236
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
237
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
238
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
239
						$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] ) ) ) : '';
240
					}
241
				}
242
			}
243
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
1536 jpm 244
		}
3638 delphine 245
		return $retour;
246
	}
2406 jpm 247
 
3638 delphine 248
	// remplace certains parametres définis en bd par les parametres définis dans l'url
249
	private function traiterParametres($estProjetDefini, $tableau) {
250
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
251
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
252
		foreach($this->parametres as $nom_critere => $valeur_critere) {
253
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
254
				$tableau[$nom_critere] = $valeur_critere;
255
			} else if (in_array($nom_critere, $criteres)) {
256
				$tableau[$nom_critere] = $valeur_critere;
2328 jpm 257
			}
2406 jpm 258
		}
3638 delphine 259
		return $tableau;
719 jpm 260
	}
1526 jpm 261
 
3638 delphine 262
	private function traiterLocalisation( $infos_localisation ) {
263
		$infos = explode(';', $infos_localisation);
264
		$tableauTmp = array();
265
		$retour = array();
266
		foreach ($infos as $info) {
267
			$tableauTmp = explode(':', $info);
268
			$retour[$tableauTmp[0]] = $tableauTmp[1];
2408 jpm 269
		}
3638 delphine 270
		return $retour;
1475 aurelien 271
	}
1050 jpm 272
 
3638 delphine 273
	private function traiterParamsLocalisation( $params ) {
274
		$infos = array();
275
		$tableauTmp = array();
276
		$zoom = '12';
277
		if (isset($params['commune'])) {
278
			$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?zone='.$params['commune'].'&code='.$params['dept'];
279
		} else if (isset($params['dept'])) {
280
			// pas trouvé de manière simple de déterminer le centroïde du département
281
			// du coup on retrouve le code insee du chef lieu
282
			$params['code_insee'] = $this->recupererChefLieuDept($params['dept']);
283
			$zoom = '9';
2851 mathias 284
		}
3638 delphine 285
		// quoi qu'il arrive, s'il est défini, on donne la priorité au code insee (plus précis)
286
		if (isset($params['code_insee'])) {
287
			$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?code='.$params['code_insee'];
2851 mathias 288
		}
3638 delphine 289
		if(!empty($url)) $json = $this->getDao()->consulter($url);
290
		if(!empty($json)) $infos = json_decode($json, true);
291
		if(!empty($infos)) {
292
			$infos['lat'] = str_replace(',','.',strval(round($infos['lat'],5)));
293
			$infos['lng'] = str_replace(',','.',strval(round($infos['lng'],5)));
294
			return 'latitude:'.$infos['lat'].';longitude:'.$infos['lng'].';zoom:'.$zoom;
295
		} else {
296
			return false;
2851 mathias 297
		}
298
	}
2916 mathias 299
 
3638 delphine 300
	private function rechercherInfosEspeces( $infos_projets ) {
301
		$retour = array();
302
		$referentiel = $infos_projets['referentiel'];
303
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
304
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
305
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
306
		$retour['ns_referentiel'] = $referentiel;
307
 
308
		if ( isset( $infos_projets['type_especes'] ) ) {
309
 
310
			switch ( $infos_projets['type_especes'] ) {
311
				case 'fixe' :
312
					$info_taxon = explode(':', $referentiel);
313
					if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
314
						$retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
315
					}
316
					break;
317
				case 'referentiel' : break;
318
				case 'liste' :
3894 idir 319
				case 'liste+autre' :
3638 delphine 320
					$retour['taxons'] = $this->recupererListeNomsSci();
321
					break;
322
			}
323
		} else if ( isset( $referentiel ) ) {
324
			if ( isset($infos_projets['num_nom'] ) ) {
325
				$retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
326
			}
2916 mathias 327
		}
3638 delphine 328
		return $retour;
2916 mathias 329
	}
330
 
3638 delphine 331
	/**
332
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
333
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
334
	 * et non le taxon?)
335
	 * @param string|int $num_nom
336
	 * @return array
337
	 */
338
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
339
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
340
		$infos = json_decode( file_get_contents( $url_service_infos ) );
341
		// trop de champs injectés dans les infos espèces peuvent
342
		// faire planter javascript
343
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
344
		$resultat = array();
345
		$retour = array();
346
		if ( isset( $infos ) && !empty( $infos ) ) {
347
			$infos = (array) $infos;
348
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
349
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
350
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
351
				$retour['espece_imposee'] = true;
352
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
353
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
354
				$retour['infos_espece'] = $this->array2js( $resultat, true );
355
			}
2906 aurel 356
		}
3638 delphine 357
		return $retour;
2906 aurel 358
	}
2851 mathias 359
 
360
	protected function getReferentielImpose() {
2869 mathias 361
		$referentiel_impose = true;
3638 delphine 362
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
2851 mathias 363
			$this->ns_referentiel = $_GET['referentiel'];
2869 mathias 364
		} else if (isset($this->configProjet['referentiel'])) {
365
			$this->ns_referentiel = $this->configProjet['referentiel'];
366
		} else if (isset($this->configMission['referentiel'])) {
367
			$this->ns_referentiel = $this->configMission['referentiel'];
368
		} else {
369
			$referentiel_impose = false;
2851 mathias 370
		}
371
		return $referentiel_impose;
372
	}
373
 
2688 mathias 374
	/**
3638 delphine 375
	 * Trie par nom français les taxons lus dans le fichier csv/tsv
2805 mathias 376
	 */
2688 mathias 377
	protected function recupererListeNomsSci() {
1613 jpm 378
		$taxons = $this->recupererListeTaxon();
379
		if (is_array($taxons)) {
380
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
381
		}
1629 jpm 382
		return $taxons;
1613 jpm 383
	}
384
 
2688 mathias 385
	/**
386
	 * @TODO documenter
387
	 * @return array
388
	 */
389
	protected function recupererListeNoms() {
1613 jpm 390
		$taxons = $this->recupererListeTaxon();
391
		$nomsAAfficher = array();
392
		$nomsSpeciaux = array();
393
		if (is_array($taxons)) {
394
			foreach ($taxons as $taxon) {
395
				$nomSciTitle = $taxon['nom_ret'].
3638 delphine 396
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
397
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 398
				$nomFrTitle = $taxon['nom_sel'].
3638 delphine 399
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
400
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 401
 
402
				if ($taxon['groupe'] == 'special') {
403
					$nomsSpeciaux[] = array(
3638 delphine 404
							'num_nom' => $taxon['num_nom_sel'],
405
							'nom_a_afficher' => $taxon['nom_fr'],
406
							'nom_a_sauver' => $taxon['nom_sel'],
407
							'nom_title' => $nomSciTitle,
408
							'nom_type' => 'nom-special');
1613 jpm 409
				} else {
410
					$nomsAAfficher[] = array(
3638 delphine 411
							'num_nom' => $taxon['num_nom_sel'],
412
							'nom_a_afficher' => $taxon['nom_sel'],
413
							'nom_a_sauver' => $taxon['nom_sel'],
414
							'nom_title' => $nomSciTitle,
415
							'nom_type' => 'nom-sci');
1613 jpm 416
					$nomsAAfficher[] = array(
3638 delphine 417
							'num_nom' => $taxon['num_nom_sel'],
418
							'nom_a_afficher' => $taxon['nom_fr'],
419
							'nom_a_sauver' => $taxon['nom_fr'],
420
							'nom_title' => $nomFrTitle,
421
							'nom_type' => 'nom-fr');
1613 jpm 422
				}
423
			}
424
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
425
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
426
		}
427
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
428
	}
2328 jpm 429
 
2688 mathias 430
	/**
3638 delphine 431
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
2688 mathias 432
	 */
433
	protected function recupererListeTaxon() {
434
		$taxons = array();
3638 delphine 435
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
436
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
437
		$nom_fichier = ($this->parametres['squelette'] === 'lichens') ? 'lichens_taxons' : 'especes';
438
		$chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . $nom_fichier. '.';
439
 
440
		if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
441
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
442
		} else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
443
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
3017 delphine 444
		} else {
3638 delphine 445
			$this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
446
		}
447
		return $taxons;
448
	}
449
 
450
	/**
451
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
452
	 */
453
	protected function recupererChefLieuDept($dept) {
454
		$infosDepts = array();
455
		$code_insee = '';
456
		$chemin_fichier = dirname(__FILE__).self::DS.'squelettes'.self::DS.'dept.csv';
457
 
458
		if (file_exists($chemin_fichier ) && is_readable($chemin_fichier)) {
459
			$infosDepts = $this->decomposerFichierCsv( $chemin_fichier,"," );
460
			if(!empty($infosDepts) && is_array($infosDepts)) {
461
				foreach ($infosDepts as $key => $infosDept) {
462
					if($dept == $infosDept['dep']) {
463
						return $code_insee = $infosDept['cheflieu'];
464
					}
465
				}
3042 mathias 466
			}
2328 jpm 467
		} else {
3844 idir 468
			$this->debug[] = "Impossible d'ouvrir le fichier '$chemin_fichier'.";
2328 jpm 469
		}
712 jpm 470
	}
1050 jpm 471
 
2688 mathias 472
	/**
3638 delphine 473
	 * Découpe un fihcier csv/tsv
2688 mathias 474
	 */
3638 delphine 475
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
2328 jpm 476
		$header = null;
477
		$data = array();
3638 delphine 478
		if (($handle = fopen($fichier, "r")) !== FALSE) {
2328 jpm 479
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
480
				if (!$header) {
481
					$header = $row;
482
				} else {
483
					$data[] = array_combine($header, $row);
484
				}
485
			}
486
			fclose($handle);
487
		}
488
		return $data;
489
	}
490
 
2688 mathias 491
	/**
492
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
493
	 * @param array $array
494
	 * @param boolean $show_keys
495
	 * @return une portion de JSON représentant le tableau
496
	 */
497
	protected function array2js($array,$show_keys) {
1536 jpm 498
		$tableauJs = '{}';
499
		if (!empty($array)) {
500
			$total = count($array) - 1;
501
			$i = 0;
502
			$dimensions = array();
503
			foreach ($array as $key => $value) {
504
				if (is_array($value)) {
505
					$dimensions[$i] = array2js($value,$show_keys);
506
					if ($show_keys) {
3638 delphine 507
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 508
					}
509
				} else {
3638 delphine 510
					$dimensions[$i] = '\"'.addslashes($value).'\"';
1536 jpm 511
					if ($show_keys) {
3638 delphine 512
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 513
					}
1526 jpm 514
				}
1536 jpm 515
				if ($i == 0) {
516
					$dimensions[$i] = '{'.$dimensions[$i];
1526 jpm 517
				}
1536 jpm 518
				if ($i == $total) {
519
					$dimensions[$i].= '}';
520
				}
521
				$i++;
1526 jpm 522
			}
1536 jpm 523
			$tableauJs = implode(',', $dimensions);
1526 jpm 524
		}
1536 jpm 525
		return $tableauJs;
1526 jpm 526
	}
2906 aurel 527
}
3638 delphine 528
?>