Subversion Repositories eFlore/Applications.cel

Rev

Rev 3897 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3164 idir 1
 <?php
3122 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
 *
3164 idir 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)
3122 delphine 22
 */
23
class Manager extends WidgetCommun {
24
 
3233 idir 25
	const DS = DIRECTORY_SEPARATOR;
26
	const SERVICE_DEFAUT = 'manager';
27
	private $cel_url_tpl = null;
28
	/** Si spécifié, on ajoute une barre de navigation inter-applications */
29
	private $bar;
30
	//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
31
	private $parametres_autorises = array(
32
		'projet' => 'projet',
33
		'type' => 'type',
34
		'langue' => 'langue',
35
		'order' => 'order'
36
	);
3376 idir 37
 
3233 idir 38
	/**
39
	 * Méthode appelée par défaut pour charger ce widget.
40
	 */
41
	public function executer() {
42
		$retour = null;
3164 idir 43
 
3233 idir 44
		// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
45
		unset( $this->parametres['callback'] );
46
		extract( $this->parametres );
47
		$this->bar = ( isset( $bar ) ) ? $bar : false;
3164 idir 48
 
3233 idir 49
		$framework = dirname( __FILE__ ) . '/framework.php';
3164 idir 50
 
3233 idir 51
		if ( !file_exists( $framework ) ) {
52
			$e = 'Veuillez paramêtrer l\'emplacement et la version du Framework dans le fichier $framework';
53
			trigger_error( $e, E_USER_ERROR );
54
		} else {
55
			// Inclusion du Framework
56
			require_once $framework;
57
			// Ajout d'information concernant cette application
58
			Framework::setCheminAppli( __FILE__ );// Obligatoire
59
			Framework::setInfoAppli( Config::get( 'info' ) );// Optionnel
60
		}
3164 idir 61
 
3233 idir 62
		if ( !isset( $mode ) ) {
63
			$mode = self::SERVICE_DEFAUT;
64
		}
3164 idir 65
 
3233 idir 66
		$this->cel_url_tpl = $this->config['manager']['celUrlTpl'];
3166 idir 67
 
3745 delphine 68
		if ( $_POST !== array() ) { //print_r($_POST);
3233 idir 69
			$this->parametres['projet'] = $_POST['projet'];
70
			$this->parametres['langue'] = $_POST['langue'];
3164 idir 71
 
3233 idir 72
			if ( $mode === 'modification' ) {
73
				$parametres = $this->traiterParametresModif();
3358 idir 74
				$donnees    = array_merge( $parametres, $this->traiterDonneesFiles() );
75
				$json       = $this->getDao()->modifier( $this->cel_url_tpl, $donnees );
3233 idir 76
			} else {
77
				$donnees = array_merge( $_POST, $this->traiterDonneesFiles() );
3358 idir 78
				$json    = $this->getDao()->ajouter( $this->cel_url_tpl, $donnees );
79
				$mode    = $this->parametres['mode'] = 'modification';
3233 idir 80
			}
81
		}
3226 idir 82
 
3233 idir 83
		$methode = $this->traiterNomMethodeExecuter( $mode );
84
		if ( method_exists( $this, $methode ) ) {
85
			$retour = $this->$methode();
86
		} else {
3226 idir 87
 
3233 idir 88
			$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
89
		}
3226 idir 90
 
3233 idir 91
		$contenu = '';
92
		if ( is_null( $retour ) ) {
93
			$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
3226 idir 94
 
3233 idir 95
		} else {
3226 idir 96
 
3233 idir 97
			if ( isset( $retour['donnees'] ) ) {
3376 idir 98
				$retour['donnees']['params']        = '&projet=' . $_POST['projet'] . '&langue=' . $_POST['langue'];
99
				$retour['donnees']['prod']          = ( $this->config['parametres']['modeServeur'] === 'prod' );
100
				$retour['donnees']['bar']           = $this->bar;
101
				$retour['donnees']['url_base']      = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], '' );
3359 idir 102
				$retour['donnees']['chemin_images'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['dossierTmp'] );
3376 idir 103
				$retour['donnees']['mode']          = $mode;
3233 idir 104
				$squelette = dirname( __FILE__ ) . self::DS . 'squelettes' . self::DS . $retour['squelette'] . '.tpl.html';
105
				$contenu   = $this->traiterSquelettePhp( $squelette, $retour['donnees'] );
106
			} else {
107
				$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
108
			}
109
		}
110
		$this->envoyer($contenu);
111
	}
3226 idir 112
 
3233 idir 113
	private function executerManager() {
114
		$params = array();
115
		$retour['squelette'] = 'manager';
3226 idir 116
 
3233 idir 117
		foreach ( $this->parametres_autorises as $id => $pa ) {
118
			if ( isset( $this->parametres[$pa] ) ) {
119
				$params[] = $pa . '=' . $this->parametres[$pa];
120
			}
121
		}
3226 idir 122
 
3233 idir 123
		$param = implode( $params, '&' );
124
		$url   = $this->cel_url_tpl;
3226 idir 125
 
3233 idir 126
		if ( $param !== '' ) {
127
			$url .= '?' . $param;
128
		}
3226 idir 129
 
3233 idir 130
		$json = $this->getDao()->consulter( $url );
3241 idir 131
		$retour['donnees']['widget']        = (array) json_decode( $json, true );
132
		$retour['donnees']['widgetUrlTpl']  = $this->config['manager']['widgetUrlTpl'];
3226 idir 133
 
3233 idir 134
		return $retour;
135
	}
3226 idir 136
 
3233 idir 137
	private function executerCreation() {
138
		//https://api.tela-botanica.org/service:cel:NomsChampsEtendus/cle
139
		$jsonlangue    = $this->getDao()->consulter( $this->config['manager']['languesUrl'] );
140
		$tableaulangue = (array) json_decode( $jsonlangue, true );
141
		$retour['squelette']          = 'creation';
142
		$retour['donnees']['langues'] = $tableaulangue['resultat'] ;
143
		$retour['donnees']['widget']  = array();
3226 idir 144
 
3233 idir 145
		if ( isset( $this->parametres['projet'] ) ) {
146
			$url     = $this->cel_url_tpl . '?projet=' . $this->parametres['projet'];
147
			$json    = $this->getDao()->consulter( $url );
148
			$tableau = (array) json_decode( $json, true );
149
			$retour['donnees']['widget'] = $tableau[0];
150
		}
3226 idir 151
 
3233 idir 152
		$urltype     = $this->cel_url_tpl . '?esttype=1';
153
		$jsontype    = $this->getDao()->consulter( $urltype );
154
		$tableautype = (array) json_decode( $jsontype, true );
155
		$retour['donnees']['type'] = $tableautype;
3226 idir 156
 
3233 idir 157
		return $retour;
158
	}
3226 idir 159
 
3233 idir 160
	private function executerModification() {
161
		$retour = array();
162
		if ( isset( $this->parametres['projet'] ) ) {
3226 idir 163
 
3233 idir 164
			$url     = $this->cel_url_tpl . '?projet=' . $this->parametres['projet'] . '&langue=' . $this->parametres['langue'];
165
			$json    = $this->getDao()->consulter( $url );
166
			$tableau = (array) json_decode( $json, true );
167
			$retour['squelette']         = 'creation';
168
			$retour['donnees']['widget'] = $tableau[0];
3897 delphine 169
			// obtenir un tableau de coordonnées+zoom expoitable
170
			if (isset($retour['donnees']['widget']['localisation'])) {
171
				$retour['donnees']['widget']['tableau-localisation'] = $this->traiterLocalisation($retour['donnees']['widget']['localisation']);
172
			}
3360 idir 173
			// En prévision d'un service permettant la suppression/modification champs supp
174
			$retour['donnees']['widget']['chpSupp'] = $this->rechercherChampsSupp();
3226 idir 175
 
3233 idir 176
			$urltype     = $this->cel_url_tpl .'?esttype=1';
177
			$jsontype    = $this->getDao()->consulter( $urltype );
178
			$tableautype = (array) json_decode( $jsontype, true );
179
			$retour['donnees']['type'] = $tableautype;
180
		}//print_r($retour['donnees']);
3226 idir 181
 
3233 idir 182
		return $retour;
183
	}
3376 idir 184
 
3233 idir 185
	private function traiterParametres() {
186
		$parametres_flux = '?';
3281 delphine 187
		$criteres        = array( 'projet', 'langue', 'titre' );
3226 idir 188
 
3233 idir 189
		foreach( $this->parametres as $nom_critere => $valeur_critere ) {
190
			if ( in_array( $nom_critere, $criteres ) ) {
191
				$valeur_critere   = str_replace( ' ', '%20', $valeur_critere );
192
				$parametres_flux .= $nom_critere . '=' . $valeur_critere . '&';
193
			}
194
		}
3226 idir 195
 
3233 idir 196
		$parametres_flux = ( $parametres_flux === '?' ) ? '' : rtrim( $parametres_flux, '&' );
3226 idir 197
 
3233 idir 198
		return $parametres_flux;
199
	}
3226 idir 200
 
3233 idir 201
	private function traiterParametresModif() {
202
		$parametres_modif = array();
3226 idir 203
 
3233 idir 204
		foreach ( $_POST as $id => $parametres ) {
205
			if ($parametres !== '' ) {
3361 idir 206
				$parametres_modif[$id] = addslashes($parametres);
3282 delphine 207
			} else {
3358 idir 208
				$parametres_modif[$id] = ' ';
3233 idir 209
			}
210
		}
211
		return $parametres_modif;
212
	}
3226 idir 213
 
3897 delphine 214
	private function traiterLocalisation( $infos_localisation ) {
215
		$infos = explode(';', $infos_localisation);
216
		$tableauTmp = array();
217
		$retour = array();
218
		foreach ($infos as $info) {
219
			$tableauTmp = explode(':', $info);
220
			$retour[$tableauTmp[0]] = $tableauTmp[1];
221
		}
222
		return $retour;
223
	}
224
 
3233 idir 225
	private function traiterDonneesFiles() {
226
		$return = array();
227
		$transmettre_donnees = false;
228
		$files_names = array();
229
		$help_files_names = array();
230
		$error =
231
			"<div class=\"message-echec container\">Echec du téléchargement : ".
3358 idir 232
			"L\'extention de l\'image pour " . $nom . " n\'est pas bonne".
3376 idir 233
			", formats acceptés : png, gif, jpg, jpeg, csv, ou tsv.".
3233 idir 234
			"</div>";
3241 idir 235
		$image_projet_langue = ( $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
236
		$dossier_url = __DIR__ . '/squelettes/img/images_projets/' . $_POST['projet'] . $image_projet_langue . '/';
3226 idir 237
 
3233 idir 238
		foreach ( array_keys( $_FILES ) as $file ) {
239
			if ( $_FILES[$file]['name'] !== '' ) {
240
				$extension = $this->obtenirExtension( $_FILES[$file] );
3226 idir 241
 
3233 idir 242
				if ( $extension ) {
243
					$transmettre_donnees = true;
3226 idir 244
 
3358 idir 245
					if ( strstr( $file, 'help-') ) {
246
						// Pas besoin de $return :
247
						// Type déjà transmis dans le json des champs supp
3235 idir 248
						$real_file_key = str_replace( 'help-', '', $file );
249
						$help_files_names[$real_file_key] = $real_file_key . '.' . $extension;
250
					} else {
251
						$return[$file] = $_FILES[$file]['type'];
3358 idir 252
						$files_names[$file] = $file .'.' . $extension;
3233 idir 253
					}
254
				} else {
3376 idir 255
					echo $error;
3233 idir 256
				}
257
			}
258
		}
3226 idir 259
 
3233 idir 260
		if ( $transmettre_donnees ) {
261
			if( !is_dir( $dossier_url ) ) {
262
				mkdir( $dossier_url, 0755 );
263
			}
264
			// Téléversements
265
			if ( count( $files_names ) > 0 ) {
266
				foreach ( array_keys( $files_names ) as $file ) {
267
					$this->televerser( $file, $files_names[ $file ], $dossier_url );
268
				}
269
			}
270
			if ( count( $help_files_names ) > 0 ) {
271
				foreach ( array_keys( $help_files_names ) as $file ) {
272
					$this->televerser( 'help-' . $file, $help_files_names[ $file ], $dossier_url );
273
				}
274
			}
275
		}
276
		return $return;
277
	}
3226 idir 278
 
3233 idir 279
	private function televerser( $file, $full_name, $dossier_url ) {
3358 idir 280
		$taille_maxi  = 5242880;
281
		$taille       = filesize( $_FILES[$file]['tmp_name'] );
282
		$extension    = $this->obtenirExtension( $_FILES[$file] );
283
		$file_name    = str_replace( '.' . $extension, '', $full_name );
284
		$file_exists  = file_exists( $dossier_url . $full_name );
285
		$ex_file_name = $full_name;
3226 idir 286
 
3358 idir 287
		// verifier l'existance d'un fichier avec une extention différente
288
		// ex: logo.png vers logo.jpg
289
		if ( !$file_exists ) {
290
			switch ( $extension ) {
291
				case 'png':
292
					$ex_file_name = $file_name . '.jpg';
293
					break;
294
				case 'csv':
295
					$ex_file_name = $file_name . '.tsv';
296
					break;
297
				case 'tsv':
298
					$ex_file_name = $file_name . '.csv';
299
					break;
300
				case 'jpg':
301
				default:
302
					$ex_file_name = $file_name . '.png';
303
					break;
304
			}
305
			$file_exists = file_exists( $dossier_url . $ex_file_name );
306
		}
307
 
3233 idir 308
		//Début des vérifications de sécurité...
3358 idir 309
		if ( $file_exists ) {
310
			if ( $this->parametres['mode'] === 'modification' ) {
3233 idir 311
				// Le fichier existe déjà, c'est normal si on est en mode modification
3358 idir 312
				unlink( $dossier_url . $ex_file_name );
3233 idir 313
			} else {
314
				$erreur =
315
					"<div class=\"message-echec container\">Echec du téléchargement : ".
316
						"Un fichier pour \"" . $file_name.
317
						"\", existe déjà dans un projet nommé \"" . $_POST['projet'] . "\".".
318
						"<br>Vérifiez que le nom du projet n'est pas déjà pris, ".
319
						"ou qu'un fichier \"" . $full_name . "\" n'ait pas déjà été téléchargé pour ce projet.".
320
					"</div>";
321
			}
322
		}
3226 idir 323
 
3233 idir 324
		if ( !$extension ) {
325
			//Si le format n'est pas bon
326
			$erreur =
327
				"<div class=\"message-echec container\">".
328
					"Echec du téléchargement pour ".
329
					"\"" . $file_name . "\" ".
3376 idir 330
					", formats acceptés : png, gif, jpg, jpeg, csv, ou tsv".
3233 idir 331
				"</div>";
332
		}
3226 idir 333
 
3233 idir 334
		if ( $taille > $taille_maxi ) {
335
			$erreur =
336
				"<div class=\"message-echec container\">".
337
					"Echec du téléchargement pour ".
338
					"\"" . $file_name . "\" ".
339
					": Max 5Mo".
340
				"</div>";
341
		}
3226 idir 342
 
3233 idir 343
		if ( isset( $erreur ) ) {
344
			echo $erreur;
345
		} else {
3358 idir 346
			$dest_file = $dossier_url . $this->remove_accents( $full_name );
347
			if ( !move_uploaded_file( $_FILES[$file]['tmp_name'], $dest_file ) ) {
3233 idir 348
			// move_uploaded_file() renvoie false si l'upload a échoué
349
				echo
350
					"<div class=\"message-echec container\">".
351
						"Erreur du téléchargement pour ".
352
						"\"" . $file_name . "\"".
353
					"</div>";
3358 idir 354
			} else {
355
				chmod($dest_file, 0666);
3233 idir 356
			}
357
		}
358
	}
3226 idir 359
 
3233 idir 360
	private function obtenirExtension( $files ) {
361
		$type = exif_imagetype( $files['tmp_name'] );
3358 idir 362
 
3233 idir 363
		//une vérif pas mal pour les types image
364
		if ( $type == ( IMAGETYPE_PNG || IMAGETYPE_JPEG || IMAGETYPE_GIF ) ) {
3358 idir 365
			switch ( $type ) {
366
				case '1' :
367
					$format = 'gif';
368
					break;
369
			 	case '2' :
370
					$format = 'jpg';
371
					break;
372
			 	case '3' :
373
					$format = 'png';
374
					break;
375
				default :
376
					break;
377
			}
378
		} elseif ( str_replace( '.csv' , '', $files['name'] ) && substr( strrchr($files['type'], '/' ), 1 ) === 'csv' ) {
379
			// Pas trouvé mieux pour csv :
380
			// Les fonctions qui pourraient utiliser $_FILES[file]["tmp_path"] me répondent "text/plain"...
381
			$format = 'csv';
3376 idir 382
		} elseif ( str_replace( '.tsv' , '', $files['name'] ) && substr( strrchr($files['type'], '/' ), 1 ) === 'tab-separated-values' ) {
3358 idir 383
			$format = 'tsv';
384
		} else {
385
			return false;
386
		}
3233 idir 387
		return $format;
388
	}
3376 idir 389
 
3360 idir 390
	// En prévision d'un service permettant la suppression/modification champs supp
391
	/* Recherche si un projet a des champs de saisie supplémentaire */
392
	private function rechercherChampsSupp() {
393
		$retour = array();
394
		$projet = $this->parametres['projet'];
395
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
396
		$json = $this->getDao()->consulter($url);
397
		$retour = (array) json_decode($json, true);
3226 idir 398
 
3360 idir 399
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
400
 
401
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
402
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
403
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
404
 
405
			if ( isset( $chsup['fieldValues'] ) ) {
406
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
407
 
408
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
409
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
410
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
411
						$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] ) ) ) : '';
412
					}
413
				}
414
			}
415
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
3897 delphine 416
			$retour[$projet]['champs-supp'][$key]['is_visible'] = intval( $chsup['is_visible'] );
3360 idir 417
		}
3897 delphine 418
		// renvoyer un json exploitable par le sccript js
419
		$retour[$projet]['champs-supp-json'] = json_encode($retour[$projet]['champs-supp']);
3360 idir 420
		return $retour;
421
	}
3122 delphine 422
}