Subversion Repositories eFlore/Applications.cel

Rev

Rev 3667 | 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
 
3730 idir 68
		if ( !empty( $_POST ) ) { //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];
3360 idir 169
			// En prévision d'un service permettant la suppression/modification champs supp
170
			$retour['donnees']['widget']['chpSupp'] = $this->rechercherChampsSupp();
3226 idir 171
 
3233 idir 172
			$urltype     = $this->cel_url_tpl .'?esttype=1';
173
			$jsontype    = $this->getDao()->consulter( $urltype );
174
			$tableautype = (array) json_decode( $jsontype, true );
175
			$retour['donnees']['type'] = $tableautype;
176
		}//print_r($retour['donnees']);
3226 idir 177
 
3233 idir 178
		return $retour;
179
	}
3376 idir 180
 
3233 idir 181
	private function traiterParametres() {
182
		$parametres_flux = '?';
3281 delphine 183
		$criteres        = array( 'projet', 'langue', 'titre' );
3226 idir 184
 
3233 idir 185
		foreach( $this->parametres as $nom_critere => $valeur_critere ) {
186
			if ( in_array( $nom_critere, $criteres ) ) {
187
				$valeur_critere   = str_replace( ' ', '%20', $valeur_critere );
188
				$parametres_flux .= $nom_critere . '=' . $valeur_critere . '&';
189
			}
190
		}
3226 idir 191
 
3233 idir 192
		$parametres_flux = ( $parametres_flux === '?' ) ? '' : rtrim( $parametres_flux, '&' );
3226 idir 193
 
3233 idir 194
		return $parametres_flux;
195
	}
3226 idir 196
 
3233 idir 197
	private function traiterParametresModif() {
198
		$parametres_modif = array();
3226 idir 199
 
3233 idir 200
		foreach ( $_POST as $id => $parametres ) {
201
			if ($parametres !== '' ) {
3361 idir 202
				$parametres_modif[$id] = addslashes($parametres);
3282 delphine 203
			} else {
3358 idir 204
				$parametres_modif[$id] = ' ';
3233 idir 205
			}
206
		}
207
		return $parametres_modif;
208
	}
3226 idir 209
 
3233 idir 210
	private function traiterDonneesFiles() {
211
		$return = array();
212
		$transmettre_donnees = false;
213
		$files_names = array();
214
		$help_files_names = array();
215
		$error =
216
			"<div class=\"message-echec container\">Echec du téléchargement : ".
3358 idir 217
			"L\'extention de l\'image pour " . $nom . " n\'est pas bonne".
3376 idir 218
			", formats acceptés : png, gif, jpg, jpeg, csv, ou tsv.".
3233 idir 219
			"</div>";
3241 idir 220
		$image_projet_langue = ( $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
221
		$dossier_url = __DIR__ . '/squelettes/img/images_projets/' . $_POST['projet'] . $image_projet_langue . '/';
3226 idir 222
 
3233 idir 223
		foreach ( array_keys( $_FILES ) as $file ) {
224
			if ( $_FILES[$file]['name'] !== '' ) {
225
				$extension = $this->obtenirExtension( $_FILES[$file] );
3226 idir 226
 
3233 idir 227
				if ( $extension ) {
228
					$transmettre_donnees = true;
3226 idir 229
 
3358 idir 230
					if ( strstr( $file, 'help-') ) {
231
						// Pas besoin de $return :
232
						// Type déjà transmis dans le json des champs supp
3235 idir 233
						$real_file_key = str_replace( 'help-', '', $file );
234
						$help_files_names[$real_file_key] = $real_file_key . '.' . $extension;
235
					} else {
236
						$return[$file] = $_FILES[$file]['type'];
3358 idir 237
						$files_names[$file] = $file .'.' . $extension;
3233 idir 238
					}
239
				} else {
3376 idir 240
					echo $error;
3233 idir 241
				}
242
			}
243
		}
3226 idir 244
 
3233 idir 245
		if ( $transmettre_donnees ) {
246
			if( !is_dir( $dossier_url ) ) {
247
				mkdir( $dossier_url, 0755 );
248
			}
249
			// Téléversements
250
			if ( count( $files_names ) > 0 ) {
251
				foreach ( array_keys( $files_names ) as $file ) {
252
					$this->televerser( $file, $files_names[ $file ], $dossier_url );
253
				}
254
			}
255
			if ( count( $help_files_names ) > 0 ) {
256
				foreach ( array_keys( $help_files_names ) as $file ) {
257
					$this->televerser( 'help-' . $file, $help_files_names[ $file ], $dossier_url );
258
				}
259
			}
260
		}
261
		return $return;
262
	}
3226 idir 263
 
3233 idir 264
	private function televerser( $file, $full_name, $dossier_url ) {
3358 idir 265
		$taille_maxi  = 5242880;
266
		$taille       = filesize( $_FILES[$file]['tmp_name'] );
267
		$extension    = $this->obtenirExtension( $_FILES[$file] );
268
		$file_name    = str_replace( '.' . $extension, '', $full_name );
269
		$file_exists  = file_exists( $dossier_url . $full_name );
270
		$ex_file_name = $full_name;
3226 idir 271
 
3358 idir 272
		// verifier l'existance d'un fichier avec une extention différente
273
		// ex: logo.png vers logo.jpg
274
		if ( !$file_exists ) {
275
			switch ( $extension ) {
276
				case 'png':
277
					$ex_file_name = $file_name . '.jpg';
278
					break;
279
				case 'csv':
280
					$ex_file_name = $file_name . '.tsv';
281
					break;
282
				case 'tsv':
283
					$ex_file_name = $file_name . '.csv';
284
					break;
285
				case 'jpg':
286
				default:
287
					$ex_file_name = $file_name . '.png';
288
					break;
289
			}
290
			$file_exists = file_exists( $dossier_url . $ex_file_name );
291
		}
292
 
3233 idir 293
		//Début des vérifications de sécurité...
3358 idir 294
		if ( $file_exists ) {
295
			if ( $this->parametres['mode'] === 'modification' ) {
3233 idir 296
				// Le fichier existe déjà, c'est normal si on est en mode modification
3358 idir 297
				unlink( $dossier_url . $ex_file_name );
3233 idir 298
			} else {
299
				$erreur =
300
					"<div class=\"message-echec container\">Echec du téléchargement : ".
301
						"Un fichier pour \"" . $file_name.
302
						"\", existe déjà dans un projet nommé \"" . $_POST['projet'] . "\".".
303
						"<br>Vérifiez que le nom du projet n'est pas déjà pris, ".
304
						"ou qu'un fichier \"" . $full_name . "\" n'ait pas déjà été téléchargé pour ce projet.".
305
					"</div>";
306
			}
307
		}
3226 idir 308
 
3233 idir 309
		if ( !$extension ) {
310
			//Si le format n'est pas bon
311
			$erreur =
312
				"<div class=\"message-echec container\">".
313
					"Echec du téléchargement pour ".
314
					"\"" . $file_name . "\" ".
3376 idir 315
					", formats acceptés : png, gif, jpg, jpeg, csv, ou tsv".
3233 idir 316
				"</div>";
317
		}
3226 idir 318
 
3233 idir 319
		if ( $taille > $taille_maxi ) {
320
			$erreur =
321
				"<div class=\"message-echec container\">".
322
					"Echec du téléchargement pour ".
323
					"\"" . $file_name . "\" ".
324
					": Max 5Mo".
325
				"</div>";
326
		}
3226 idir 327
 
3233 idir 328
		if ( isset( $erreur ) ) {
329
			echo $erreur;
330
		} else {
3358 idir 331
			$dest_file = $dossier_url . $this->remove_accents( $full_name );
332
			if ( !move_uploaded_file( $_FILES[$file]['tmp_name'], $dest_file ) ) {
3233 idir 333
			// move_uploaded_file() renvoie false si l'upload a échoué
334
				echo
335
					"<div class=\"message-echec container\">".
336
						"Erreur du téléchargement pour ".
337
						"\"" . $file_name . "\"".
338
					"</div>";
3358 idir 339
			} else {
340
				chmod($dest_file, 0666);
3233 idir 341
			}
342
		}
343
	}
3226 idir 344
 
3233 idir 345
	private function obtenirExtension( $files ) {
346
		$type = exif_imagetype( $files['tmp_name'] );
3358 idir 347
 
3233 idir 348
		//une vérif pas mal pour les types image
349
		if ( $type == ( IMAGETYPE_PNG || IMAGETYPE_JPEG || IMAGETYPE_GIF ) ) {
3358 idir 350
			switch ( $type ) {
351
				case '1' :
352
					$format = 'gif';
353
					break;
354
			 	case '2' :
355
					$format = 'jpg';
356
					break;
357
			 	case '3' :
358
					$format = 'png';
359
					break;
360
				default :
361
					break;
362
			}
363
		} elseif ( str_replace( '.csv' , '', $files['name'] ) && substr( strrchr($files['type'], '/' ), 1 ) === 'csv' ) {
364
			// Pas trouvé mieux pour csv :
365
			// Les fonctions qui pourraient utiliser $_FILES[file]["tmp_path"] me répondent "text/plain"...
366
			$format = 'csv';
3376 idir 367
		} elseif ( str_replace( '.tsv' , '', $files['name'] ) && substr( strrchr($files['type'], '/' ), 1 ) === 'tab-separated-values' ) {
3358 idir 368
			$format = 'tsv';
369
		} else {
370
			return false;
371
		}
3233 idir 372
		return $format;
373
	}
3376 idir 374
 
3360 idir 375
	// En prévision d'un service permettant la suppression/modification champs supp
376
	/* Recherche si un projet a des champs de saisie supplémentaire */
377
	private function rechercherChampsSupp() {
378
		$retour = array();
379
		$projet = $this->parametres['projet'];
380
		$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
381
		$json = $this->getDao()->consulter($url);
382
		$retour = (array) json_decode($json, true);
3226 idir 383
 
3360 idir 384
		foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
385
 
386
			$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
387
			$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
388
			$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
389
 
390
			if ( isset( $chsup['fieldValues'] ) ) {
391
				$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
392
 
393
				if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
394
					foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
395
						// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
396
						$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] ) ) ) : '';
397
					}
398
				}
399
			}
400
			$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
401
		}
402
		return $retour;
403
	}
3122 delphine 404
}