Subversion Repositories eFlore/Applications.cel

Rev

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