Subversion Repositories eFlore/Applications.cel

Rev

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