Subversion Repositories eFlore/Applications.cel

Rev

Rev 3350 | Rev 3425 | 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
3286 idir 95
				$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?'. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
3271 idir 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);
3286 idir 105
				$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
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);
3377 idir 153
		if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
154
			// si on trouve ":" dans referentiel, referentiel = première partie
155
			$tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
3228 delphine 156
		}
3377 idir 157
		$tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
3278 delphine 158
		if (isset($tableau['motscles'])) {
159
		    $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
160
		}
3239 idir 161
		$tableau['chpSupp'] = $tab;
3240 idir 162
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
3330 idir 163
		$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
3228 delphine 164
		return $tableau;
165
	}
3239 idir 166
 
3228 delphine 167
	/* Recherche si un projet a des champs de saisie supplémentaire */
168
	private function rechercherChampsSupp() {
169
		$retour = array();
3239 idir 170
		$projet = $this->parametres['projet'];
171
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
3228 delphine 172
		$json = $this->getDao()->consulter($url);
173
		$retour = (array) json_decode($json, true);
3249 idir 174
 
3239 idir 175
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
176
 
3249 idir 177
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
178
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
179
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
3239 idir 180
 
181
			if ( isset( $chsup['fieldValues'] ) ) {
3350 idir 182
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
3239 idir 183
 
184
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
3347 idir 185
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
3228 delphine 186
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
3350 idir 187
						$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] ) ) ) : '';
3228 delphine 188
					}
189
				}
190
			}
3239 idir 191
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
3228 delphine 192
		}
193
		return $retour;
194
	}
3239 idir 195
 
3228 delphine 196
	// remplace certains parametres définis en bd par les parametres définis dans l'url
197
	private function traiterParametres($estProjetDefini, $tableau) {
3278 delphine 198
		$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
3228 delphine 199
		$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
200
		foreach($this->parametres as $nom_critere => $valeur_critere) {
3249 idir 201
			if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
3228 delphine 202
				$tableau[$nom_critere] = $valeur_critere;
203
			} else if (in_array($nom_critere, $criteres)) {
204
				$tableau[$nom_critere] = $valeur_critere;
205
			}
206
		}
207
		return $tableau;
208
	}
3239 idir 209
 
210
	private function rechercherInfosEspeces( $infos_projets ) { //print_r($infos_projets);exit;
211
		$retour = array();
212
		$referentiel = $infos_projets['referentiel'];
3228 delphine 213
		$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
3260 idir 214
		$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
215
		$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
3228 delphine 216
		$retour['ns_referentiel'] = $referentiel;
3239 idir 217
 
218
		if ( isset( $infos_projets['type_especes'] ) ) {
219
 
220
			switch ( $infos_projets['type_especes'] ) {
3249 idir 221
				case 'fixe' :
3377 idir 222
					$info_taxon = explode(':', $referentiel);
223
					if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
224
						$retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
225
					}
3228 delphine 226
					break;
3257 delphine 227
				case 'referentiel' : break;
3249 idir 228
				case 'liste' :
3256 idir 229
					$retour['taxons'] = $this->recupererListeNomsSci();
3239 idir 230
					break;
3228 delphine 231
			}
3377 idir 232
		} else if ( isset( $referentiel ) ) {
3239 idir 233
			if ( isset($infos_projets['num_nom'] ) ) {
3377 idir 234
				$retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
3228 delphine 235
			}
236
		}
237
		return $retour;
238
	}
3239 idir 239
 
3228 delphine 240
	/**
241
	 * Consulte un webservice pour obtenir des informations sur le taxon dont le
242
	 * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
243
	 * et non le taxon?)
244
	 * @param string|int $num_nom
245
	 * @return array
246
	 */
3239 idir 247
	protected function chargerInfosTaxon( $referentiel, $num_nom ) {
248
		$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
249
		$infos = json_decode( file_get_contents( $url_service_infos ) );
3228 delphine 250
		// trop de champs injectés dans les infos espèces peuvent
251
		// faire planter javascript
3330 idir 252
		$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
3228 delphine 253
		$resultat = array();
254
		$retour = array();
3239 idir 255
		if ( isset( $infos ) && !empty( $infos ) ) {
256
			$infos = (array) $infos;
3249 idir 257
			if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
3239 idir 258
				$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
3249 idir 259
				$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
3228 delphine 260
				$retour['espece_imposee'] = true;
261
				$retour['nn_espece_defaut'] = $nnEspeceImposee;
262
				$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
3239 idir 263
				$retour['infos_espece'] = $this->array2js( $resultat, true );
3228 delphine 264
			}
265
		}
266
		return $retour;
267
	}
3120 delphine 268
 
3239 idir 269
	protected function getReferentielImpose() {
270
		$referentiel_impose = true;
3249 idir 271
		if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
3239 idir 272
			$this->ns_referentiel = $_GET['referentiel'];
273
		} else if (isset($this->configProjet['referentiel'])) {
274
			$this->ns_referentiel = $this->configProjet['referentiel'];
275
		} else if (isset($this->configMission['referentiel'])) {
276
			$this->ns_referentiel = $this->configMission['referentiel'];
277
		} else {
278
			$referentiel_impose = false;
279
		}
280
		return $referentiel_impose;
281
	}
3231 delphine 282
 
3228 delphine 283
	/**
3377 idir 284
	 * Trie par nom français les taxons lus dans le fichier csv/tsv
3228 delphine 285
	 */
286
	protected function recupererListeNomsSci() {
287
		$taxons = $this->recupererListeTaxon();
288
		if (is_array($taxons)) {
289
			$taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
290
		}
291
		return $taxons;
292
	}
3239 idir 293
 
3228 delphine 294
	/**
295
	 * @TODO documenter
296
	 * @return array
297
	 */
298
	protected function recupererListeNoms() {
299
		$taxons = $this->recupererListeTaxon();
300
		$nomsAAfficher = array();
301
		$nomsSpeciaux = array();
302
		if (is_array($taxons)) {
303
			foreach ($taxons as $taxon) {
304
				$nomSciTitle = $taxon['nom_ret'].
305
				($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
306
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
307
				$nomFrTitle = $taxon['nom_sel'].
308
				($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
309
				($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
3239 idir 310
 
3228 delphine 311
				if ($taxon['groupe'] == 'special') {
312
					$nomsSpeciaux[] = array(
313
							'num_nom' => $taxon['num_nom_sel'],
314
							'nom_a_afficher' => $taxon['nom_fr'],
315
							'nom_a_sauver' => $taxon['nom_sel'],
316
							'nom_title' => $nomSciTitle,
317
							'nom_type' => 'nom-special');
318
				} else {
319
					$nomsAAfficher[] = array(
320
							'num_nom' => $taxon['num_nom_sel'],
321
							'nom_a_afficher' => $taxon['nom_sel'],
322
							'nom_a_sauver' => $taxon['nom_sel'],
323
							'nom_title' => $nomSciTitle,
324
							'nom_type' => 'nom-sci');
325
					$nomsAAfficher[] = array(
326
							'num_nom' => $taxon['num_nom_sel'],
327
							'nom_a_afficher' => $taxon['nom_fr'],
328
							'nom_a_sauver' => $taxon['nom_fr'],
329
							'nom_title' => $nomFrTitle,
330
							'nom_type' => 'nom-fr');
331
				}
332
			}
333
			$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
334
			$nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
335
		}
336
		return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
337
	}
3239 idir 338
 
3228 delphine 339
	/**
3377 idir 340
	 * Lit une liste de taxons depuis un fichier csv ou tsv fourni
3228 delphine 341
	 */
342
	protected function recupererListeTaxon() {
343
		$taxons = array();
3256 idir 344
		$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
345
		$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
3377 idir 346
		$chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . 'especes.';
3257 delphine 347
 
3377 idir 348
		if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
349
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
350
		} else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
351
			$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
3228 delphine 352
		} else {
3377 idir 353
			$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_taxon'.";
3228 delphine 354
		}
355
		return $taxons;
356
	}
3239 idir 357
 
3228 delphine 358
	/**
3377 idir 359
	 * Découpe un fihcier csv/tsv
3228 delphine 360
	 */
3256 idir 361
	protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
3228 delphine 362
		$header = null;
363
		$data = array();
3256 idir 364
		if (($handle = fopen($fichier, "r")) !== FALSE) {
3228 delphine 365
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
366
				if (!$header) {
367
					$header = $row;
368
				} else {
369
					$data[] = array_combine($header, $row);
370
				}
371
			}
372
			fclose($handle);
373
		}
374
		return $data;
375
	}
3239 idir 376
 
3228 delphine 377
	/**
378
	 * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
379
	 * @param array $array
380
	 * @param boolean $show_keys
381
	 * @return une portion de JSON représentant le tableau
382
	 */
383
	protected function array2js($array,$show_keys) {
384
		$tableauJs = '{}';
385
		if (!empty($array)) {
386
			$total = count($array) - 1;
387
			$i = 0;
388
			$dimensions = array();
389
			foreach ($array as $key => $value) {
390
				if (is_array($value)) {
391
					$dimensions[$i] = array2js($value,$show_keys);
392
					if ($show_keys) {
3260 idir 393
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
3228 delphine 394
					}
395
				} else {
3260 idir 396
					$dimensions[$i] = '\"'.addslashes($value).'\"';
3228 delphine 397
					if ($show_keys) {
3260 idir 398
						$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
3228 delphine 399
					}
400
				}
401
				if ($i == 0) {
402
					$dimensions[$i] = '{'.$dimensions[$i];
403
				}
404
				if ($i == $total) {
405
					$dimensions[$i].= '}';
406
				}
407
				$i++;
408
			}
409
			$tableauJs = implode(',', $dimensions);
410
		}
411
		return $tableauJs;
412
	}
3120 delphine 413
}
3239 idir 414
?>