Subversion Repositories eFlore/Applications.cel

Rev

Rev 1001 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1001 Rev 1002
1
<?php
1
<?php
2
Class CelEfloreImages extends Cel {
2
class CelEfloreImages extends Cel {
3
	
3
	
-
 
4
	private $formats_supportes = array('image/jpeg');
-
 
5
	private $format_retour_demande = 'image/jpeg';
-
 
6
	private $format_image_demande = 'M';
-
 
7
	private $num_nom_demande = null;
-
 
8
	private $ref_tax_demande = 'bdtfx';
-
 
9
	
4
	private $formats_supportes = array('image/jpeg');
10
	private $pattern_ref_tax_nn_composes = '/(([a-zA-Z]:((([0-9])+,)*([0-9])+));)*([a-zA-Z]:((([0-9])+,)*([0-9])+))*/i';
5
	
11
	
6
	function getElement($uid) {
12
	public function getElement($uid) {
7
		return getRessource();
13
		return getRessource();
8
	}
14
	}
9
	
15
	
-
 
16
	public function getRessource() {
-
 
17
		//TODO masque.nn = bdtfx:num_nom
-
 
18
		//TODO voir quels paramètres sont à passer en attributs de classe
-
 
19
		$parametres = $this->recupererParametresBruts();		
-
 
20
		$parametres = array_merge($parametres);
-
 
21
	
-
 
22
		try {
-
 
23
			$this->verifierErreurs($parametres);
-
 
24
			$this->affecterParametres($parametres);
-
 
25
			$id_image_a_renvoyer = $this->obtenirImageAuHasardPourNumNom($this->ref_tax_demande, $this->num_nom_demande);
-
 
26
			$this->traiterRetour($id_image_a_renvoyer);
-
 
27
		} catch (Exception $e) {
-
 
28
			$header = $this->renvoyerHeaderAssocie($e->getCode());
-
 
29
			$message = $e->getMessage();
-
 
30
			
-
 
31
			header($header);
-
 
32
			$this->envoyerTexteSimple($message);
-
 
33
		}
10
	function getRessource(){
34
	}
-
 
35
	
11
	
36
	private function envoyerTexteSimple($chaine) {
-
 
37
		header("Content-type: text/plain");
12
		$parametres = $this->recupererParametresBruts();
38
		echo $chaine;
13
		$header = '';
-
 
14
	
39
	}
15
		if (!$erreurs = $this->parametresOntErreurs($parametres)) {
40
	
16
		
41
	private function traiterRetour($id_image_a_renvoyer) {
-
 
42
		switch($this->format_retour_demande) {
-
 
43
			case 'image/jpeg':
17
			$num_nom = $parametres['masque.nn'];
44
				$this->renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, $this->format_image_demande);
-
 
45
			break;
-
 
46
			
-
 
47
			default:
18
			$retour = isset($parametres['retour']) ? $parametres['retour'] : 'image/jpeg';
48
				$this->renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, 'image/jpeg');
19
			$format = isset($parametres['retour.format']) ? $parametres['retour.format'] : 'M';
49
			break;
-
 
50
		}
20
			
51
	}
21
			$id_image_a_renvoyer = $this->obtenirImageAuHasardPourNumNom($num_nom);
52
	
22
				
53
	private function renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, $format = 'M') {
23
			$header = $id_image_a_renvoyer ? "HTTP/1.0 200 OK" : "HTTP/1.0 404 Not Found";
54
		if ($this->estUnFormatDejaCree($format)) {
24
			$erreurs = $id_image_a_renvoyer ? false : 'Aucune image ne corespond au numéro numenclatural '.$num_nom."\n";
-
 
25
		} else {
-
 
26
			$header = "HTTP/1.0 400 Bad Request";		
-
 
27
		}
-
 
28
		
-
 
29
		header($header);
55
			$this->renvoyerImageExistante($id_image_a_renvoyer, $format);
30
		
56
		} else {
-
 
57
			$this->renvoyerImageGeneree($id_image_a_renvoyer, $format);
-
 
58
		}
-
 
59
	}
-
 
60
	
31
		$erreurs ? $this->renvoyerTexteSimple($erreurs) : $this->renvoyerImageExistanteOuGeneree($id_image_a_renvoyer, $format);
61
	private function renvoyerImageExistante($id_image, $format = 'M') {
-
 
62
		$generateur_image = new ImageRecreation($this->config);
32
		exit;
63
		$chemin = $generateur_image->functionObtenirCheminImagePourFormat($id_image, $format);
-
 
64
		if(file_exists($chemin)) {
-
 
65
			header("HTTP/1.0 200 OK");
33
	}
66
			header("Content-type: image/jpeg");
34
	
67
			echo file_get_contents($chemin);  
35
	private function renvoyerTexteSimple($erreurs) {
-
 
36
		header("Content-type: text/plain");
68
		} else {
-
 
69
			throw new Exception("L\'image demandée est introuvable sur le serveur", "404");
-
 
70
		}
37
		echo $erreurs;
-
 
38
	}
71
	}
39
	
-
 
40
	private function renvoyerImageExistanteOuGeneree($id_image, $format = 'M') {
-
 
41
		
72
	
42
		$generateur_image = new ImageRecreation($this->config);
73
	private function renvoyerImageGeneree($id_image, $format = 'M') {
43
		
-
 
44
		header("Content-type: image/jpeg");
-
 
45
		if ($this->estUnFormatDejaCree($format)) {
-
 
46
			$nom = $generateur_image->convertirIdBddVersNomFichier($id_image, $format);
74
		$generateur_image = new ImageRecreation($this->config);
-
 
75
		$infos_image = $generateur_image->obtenirImageEtInfosPourId($id_image);
-
 
76
		$image_a_renvoyer = $generateur_image->creerMiniatureImageSelonFormat($infos_image, $format);
47
			$dossier = $generateur_image->obtenirDossierPourFormat($id_image, $format);
77
		
48
			$chemin_image =  $dossier.'/'.$nom;
78
		if($image_a_renvoyer) {
49
			echo file_get_contents($chemin_image);
79
			header("HTTP/1.0 200 OK");
50
		} else {
80
			header("Content-type: image/jpeg");
51
			$infos_image = $generateur_image->obtenirImageEtInfosPourId($id_image);
81
			imagejpeg($image_a_renvoyer);
52
			$image_a_renvoyer = $generateur_image->creerMiniatureImageSelonFormat($infos_image, $format);
82
		} else {
53
			imagejpeg($image_a_renvoyer);
83
			throw new Exception("Problème lors de la génération de la miniature", "500");
54
		}
84
		}
55
	}
85
	}
56
	
86
	
57
	private function obtenirImageAuHasardPourNumNom($numero_nomenclatural) {
-
 
-
 
87
	private function obtenirImageAuHasardPourNumNom($ref_tax, $num_nom) {
-
 
88
		//TODO: modifier la requete lors du passage à la nouvelle base de données pour faire quelques chose
58
 
89
		// du numéro nomenclatural
59
		$requete = 	'SELECT  cim.ci_id_image as id_image '.
90
		$requete = 	'SELECT  cim.ci_id_image as id_image '.
60
					'FROM cel_obs_images AS coi '.
91
						'FROM cel_obs_images AS coi '.
61
					'LEFT JOIN cel_inventory AS ci '.
92
						'LEFT JOIN cel_inventory AS ci '.
62
						'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
93
							'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
63
					'LEFT JOIN cel_images AS cim '.
94
						'LEFT JOIN cel_images AS cim '.
64
						'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.  
95
							'ON (coi.coi_ce_image = cim.ci_id_image AND coi.coi_ce_utilisateur = cim.ci_ce_utilisateur) '.  
65
					'WHERE ci.transmission = 1 '.
96
						'WHERE ci.transmission = 1 '.
66
					'	AND num_nom_sel = '.$this->proteger($numero_nomenclatural).
97
						'	AND num_nom_sel = '.$this->proteger($num_nom).
67
					'	AND ci.identifiant = cim.ci_ce_utilisateur ';
98
						'	AND ci.identifiant = cim.ci_ce_utilisateur ';
68
		
99
			
-
 
100
		$resultat_images = $this->executerRequete($requete);
69
		$resultat_images = $this->executerRequete($requete);
101
 
-
 
102
		if (!is_array($resultat_images) || count($resultat_images) <= 0) {
-
 
103
			$erreur = 'Aucune image ne correspond au numéro numenclatural '.$ref_tax.':'.$num_nom."\n";
-
 
104
			throw new Exception("404");	
-
 
105
		}
70
		$id_image_hasard = (is_array($resultat_images) && count($resultat_images) > 0) ? $resultat_images[array_rand($resultat_images)]['id_image'] : false;
106
		
71
		
107
		$id_image_hasard = $resultat_images[array_rand($resultat_images)]['id_image'];
72
		return $id_image_hasard;
108
		return $id_image_hasard;
73
	}
-
 
74
	
-
 
75
	private function nettoyerParametres(Array $parametres) {
-
 
76
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
-
 
77
		if (isset($parametres) && count($parametres) > 0) {
-
 
78
			foreach ($parametres as $cle => $valeur) {
-
 
79
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
-
 
80
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
-
 
81
			}
-
 
82
		}
-
 
83
		return $parametres;
-
 
84
	}
109
	}
85
	
110
		
86
	private function recupererParametresBruts() {
111
	private function recupererParametresBruts() {
87
		$parametres_bruts = array();
112
		$parametres_bruts = array();
88
		if (!empty($_SERVER['QUERY_STRING'])) {
113
		if (!empty($_SERVER['QUERY_STRING'])) {
89
			$paires = explode('&', $_SERVER['QUERY_STRING']);
114
			$paires = explode('&', $_SERVER['QUERY_STRING']);
90
			foreach ($paires as $paire) {
115
			foreach ($paires as $paire) {
91
				$nv = explode('=', $paire);
116
				$nv = explode('=', $paire);
92
				$nom = urldecode($nv[0]);
117
				$nom = urldecode($nv[0]);
93
				$valeur = urldecode($nv[1]);
118
				$valeur = urldecode($nv[1]);
94
				$parametres_bruts[$nom] = $valeur;
119
				$parametres_bruts[$nom] = $valeur;
95
			}
120
			}
96
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
121
			$parametres_bruts = $this->nettoyerParametres($parametres_bruts);
97
		}
122
		}
98
		return $parametres_bruts;
123
		return $parametres_bruts;
99
	}
124
	}
-
 
125
	
-
 
126
	private function nettoyerParametres(Array $parametres) {
-
 
127
		// Pas besoin d'utiliser urldecode car déjà fait par php pour les clés et valeur de $_GET
-
 
128
		if (isset($parametres) && count($parametres) > 0) {
-
 
129
			foreach ($parametres as $cle => $valeur) {
-
 
130
				$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
-
 
131
				$parametres[$cle] = strip_tags(str_replace($verifier, '', $valeur));
-
 
132
			}
-
 
133
		}
-
 
134
		return $parametres;
-
 
135
	}
100
	
136
	
101
	private function parametresOntErreurs($parametres) {
137
	private function verifierErreurs($parametres) {
-
 
138
		$erreurs = false;
102
		$erreurs = false;
139
		
103
		if (!isset($parametres['masque.nn'])) {
140
		if (!isset($parametres['masque.nn'])) {
104
			$erreurs .= 'Le paramètre masque.nn est obligatoire '."\n";
141
			$erreurs .= 'Le paramètre masque.nn est obligatoire '."\n";
105
		} else {
142
		} else {
106
			if (!is_numeric($parametres['masque.nn'])) {
143
			if(!preg_match($this->pattern_ref_tax_nn_composes, $parametres['masque.nn'])) {
107
				$erreurs .= 'Le paramètre masque.nn est mal formé '."\n";
144
				$erreurs .= 'Le paramètre masque.nn est mal formé '."\n";
108
			}
145
			}
109
		}
146
		}
110
		
147
		
111
		if (isset($parametres['retour']) && !$this->retourEstSupporte($parametres['retour'])) {
148
		if (isset($parametres['retour']) && !$this->retourEstSupporte($parametres['retour'])) {
112
			$erreurs .= 'Le type de retour '.$parametres['retour'].' n\'est pas supporté  '."\n";
149
			$erreurs .= 'Le type de retour '.$parametres['retour'].' n\'est pas supporté  '."\n";
113
		}
150
		}
114
		
151
		
115
		if (isset($parametres['retour.format']) && !$this->formatEstSupporte($parametres['retour.format'])) {
152
		if (isset($parametres['retour.format']) && !$this->formatEstSupporte($parametres['retour.format'])) {
116
			$erreurs .= 'Le type de format '.$parametres['retour.format'].' n\'est pas supporté  '."\n";
153
			$erreurs .= 'Le type de format '.$parametres['retour.format'].' n\'est pas supporté  '."\n";
117
		}
154
		}
118
		
155
		
-
 
156
		if($erreurs != '') {
-
 
157
			throw new Exception($erreurs, "400");
-
 
158
		}
-
 
159
	}
-
 
160
	
-
 
161
	private function affecterParametres($parametres) {
-
 
162
		// cette fonction est appelée en considérant que les vérifications d'erreurs ont été passées 
-
 
163
		// avec succès
-
 
164
		$this->analyserMasqueNumNom($parametres['masque.nn']);
-
 
165
		if(isset($parametres['retour'])) {
-
 
166
			$this->format_retour_demande =  $parametres['retour'] ;
-
 
167
		}
-
 
168
		if(isset($parametres['retour.format'])) {
-
 
169
			$this->format_image_demande = $parametres['retour.format'];
-
 
170
		}
-
 
171
	}
-
 
172
	
-
 
173
	private function analyserMasqueNumNom($masque_num_nom) {
-
 
174
		// cette fonction est appelée en considérant que le masque num nom est valide
-
 
175
		//
-
 
176
		// cas du numero sans référentiel : ref tax par defaut
-
 
177
		if(is_numeric($masque_num_nom)) {
-
 
178
			$this->num_nom_demande = $masque_num_nom;
-
 
179
		} else {
-
 
180
			// ceci contient potentiellement des formes ref_tax1:nn1,nn2;ref_tax2:nn3,nn4
-
 
181
			$composants_masques = explode(';', $masque_num_nom);
-
 
182
			if (count($composants_masques) > 0) {
-
 
183
				foreach($composants_masques as $composant_ref_nn) {
-
 
184
					$ref_nn = explode(':', $composant_ref_nn);
-
 
185
					$this->ref_tax_demande[$composant_ref_nn[0]] = explode(',', $composant_ref_nn[1]);
-
 
186
				}
-
 
187
			}
119
		return $erreurs;
188
		}
120
	}
189
	}
121
	
190
	
122
	private function getFormats() {
191
	private function getFormats() {
123
		$formats = array();
192
		$formats = array();
124
		
193
		
125
		foreach ($this->config['cel_db'] as $param_config => $valeur) {
194
		foreach ($this->config['cel_db'] as $param_config => $valeur) {
126
			if (substr_count($param_config,'format_') != 0) {
195
			if (substr_count($param_config,'format_') != 0) {
127
				$formats[$param_config] = $valeur;
196
				$formats[$param_config] = $valeur;
128
			}
197
			}
129
		}
198
		}
130
		
199
		
131
		return $formats;
200
		return $formats;
132
	}
201
	}
133
	
202
	
134
	private function retourEstSupporte($retour = 'image/jpeg') {
203
	private function retourEstSupporte($retour = 'image/jpeg') {
135
		return in_array($retour, $this->formats_supportes);
204
		return in_array($retour, $this->formats_supportes);
136
	}
205
	}
137
	
206
	
138
	private function formatEstSupporte($format = 'M') {
207
	private function formatEstSupporte($format = 'M') {
139
		
208
		
140
		$format_supporte = true;
209
		$format_supporte = true;
141
		
210
		
142
		// cas du format déjà existant (S, M, L etc...)
211
		// cas du format déjà existant (S, M, L etc...)
143
		$format_supporte = $this->estUnFormatDejaCree($format);
212
		$format_supporte = $this->estUnFormatDejaCree($format);
144
		
213
		
145
		//TODO: décommenter les lignes suivantes lorsque les formats "à la demande" seront implémentés
214
		//TODO: décommenter les lignes suivantes lorsque les formats "à la demande" seront implémentés
146
		// cas du coté maximal de l'image demandé
215
		// cas du coté maximal de l'image demandé
147
		//$format_supporte = is_numeric($format) ? true : false;
216
		//$format_supporte = is_numeric($format) ? true : false;
148
		// cas du format exact demande Lxl
217
		// cas du format exact demande Lxl
149
		//$format_supporte = preg_match('/[0-9]*x[0-9]*/', $format) ? true : false;
218
		//$format_supporte = preg_match('/[0-9]*x[0-9]*/', $format) ? true : false;
150
 
219
 
151
		return $format_supporte;
220
		return $format_supporte;
152
	}
221
	}
153
	
222
	
154
	private function estUnFormatDejaCree($format = 'M') {
223
	private function estUnFormatDejaCree($format = 'M') {
155
		$formats = $this->getFormats();
224
		$formats = $this->getFormats();
156
		$format_supporte = isset($formats['format_'.$format]) ? true : false;
225
		$format_supporte = isset($formats['format_'.$format]) ? true : false;
157
 
226
 
158
		return $format_supporte;
227
		return $format_supporte;
159
	}	
228
	}	
-
 
229
	
-
 
230
	private function renvoyerHeaderAssocie($code) {
-
 
231
		switch ($code) {
-
 
232
			
-
 
233
			case '500':
-
 
234
				$header = "HTTP/1.0 500 Internal Server Error";
-
 
235
			break;
-
 
236
			
-
 
237
			case '404':
-
 
238
				$header = "HTTP/1.0 404 Not Found";
-
 
239
			break;
-
 
240
			
-
 
241
			case '400':
-
 
242
				$header = "HTTP/1.0 400 Bad Request";
-
 
243
			break;
-
 
244
				
-
 
245
			case '200':
-
 
246
				$header = "HTTP/1.0 200 OK";
-
 
247
			break;
-
 
248
			
-
 
249
			default:
-
 
250
			break;
-
 
251
		}
-
 
252
	}
160
}
253
}
161
?>
254
?>