Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 310 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
307 aurelien 1
<?php
2
/**
3
* Web service particulier pour photoflora, qui ne doit être installé sur tela botanica
4
* mais sur photoflora.free.fr
5
* Une redirection htaccess est à faire, redirigeant /service:eflore:0.1/photoflora/image
6
* vers le site photoflora à l'adresse ou seront installé les services web et le minimum
7
* nécessaire pour les faire fonctionner (framework + base de code eflore-projet ou peut être moins)
8
*
9
* La table des metadonnées est, elle, stockée sur Tela Botanica
10
* Le service est dans le même dépot que les autres par souci de commodité
11
*
12
*/
13
class Images {
14
 
15
	const MIME_JPEG = 'image/jpeg';
16
	const MIME_JSON = 'application/json';
17
	const MIME_XML = 'text/xml';
18
 
19
	//TODO déplacer ceci dans des parametres de config
20
	private $efph_url_photo = 'http://photoflora.free.fr/photos/٪s/max/%s';
21
	private $efph_url_photo_bb = 'http://photoflorabb.free.fr/max/bb%s';
22
	private $efph_url_photo_jlt = 'http://photoflorajlt.free.fr/max/jlt%s';
23
 
24
	private $efph_url_photo_bb_min = 'http://photoflora.free.fr/photos/bb/min/bb%s';
25
	private $efph_url_photo_jlt_min = 'http://photoflora.free.fr/photos/jlt/min/jlt%s';
26
 
27
	private $parametres = array();
28
	private $ressources = array();
29
	private $Bdd;
30
 
31
	private $format = 'min';
32
	private $retour_mime = 'application/json';
33
	private $nbreImages = '0';
34
 
35
	public function __construct(Bdd $bdd = null, Array $config = null) {
36
		$this->config = is_null($config) ? Config::get('Images') : $config;
37
		$this->Bdd = is_null($bdd) ? new Bdd() : $bdd;
38
	}
39
 
40
	public function consulter($ressources, $parametres) {
41
 
42
		$this->parametres = $parametres;
43
		$this->ressources = $ressources;
44
 
45
		$this->definirValeurParDefautDesParametres();
46
 
47
		$this->format = (isset($this->parametres['retour.format']) && $this->parametres['retour.format'] != '') ?  $this->parametres['retour.format'] : $this->format;
48
		$this->retour_mime = (isset($this->parametres['retour']) && $this->parametres['retour'] != '') ?  $this->parametres['retour'] : $this->retour_mime;
49
		// TODO: décommenter lors de la mise en prod
50
		//$photographies = $this->getImagesPourNumTax($ressources[0]);
51
		//TODO commenter lors de la mise en prod
52
		$photographies = $this->getResultatTest();
53
		$this->nbreImages = count($photographies);
54
 
55
		if($this->retour_mime == self::MIME_JSON) {
56
			$photographies_formatees = $this->formaterRetourJson($photographies);
57
			$resultat = $photographies_formatees;
58
			$entete = $this->construireEntete();
59
			return array('entete' => $entete, 'resultats' => $resultat);
60
		} elseif ($this->retour_mime == self::MIME_XML) {
61
			$photographies_formatees = $this->formaterRetourXml($photographies);
62
			header('Content-Type: '.self::MIME_XML);
63
			echo $photographies_formatees;
64
			exit;
65
		}
66
	}
67
 
68
	private function construireEntete() {
69
		$entete = array('masque' => '', 'depart' => 0, 'limite' => 100, 'total' => 0);
70
 
71
		$entete['masque'] = $this->recupererMasque();
72
		$entete['depart'] = (int) $this->parametres['navigation.depart'];
73
		$entete['limite'] = (int) $this->parametres['navigation.limite'];
74
		$entete['total'] = $this->nbreImages;
75
 
76
		return $entete;
77
	}
78
 
79
	private function recupererMasque() {
80
		$masqueEntete = '';
81
		// on récupère un num tax en fait
82
		if ($masqueNn = $this->parametres['masque.nn']) {
83
			$masqueEntete = "nn=$masqueNn";
84
		}
85
		return $masqueEntete;
86
	}
87
 
88
	private function definirValeurParDefautDesParametres() {
89
		if (isset($this->parametres['retour']) == false) {
90
			$this->parametres['retour'] = self::MIME_JSON;
91
		}
92
		if (isset($this->parametres['retour.format']) == false) {
93
			$this->parametres['retour.format'] = 'min';
94
		}
95
		if (isset($this->parametres['navigation.depart']) == false) {
96
			$this->parametres['navigation.depart'] = 0;
97
		}
98
		if (isset($this->parametres['navigation.limite']) == false) {
99
			$this->parametres['navigation.limite'] = 100;
100
		}
101
	}
102
 
103
	//TODO utiliser le num nom ?
104
	// en attendant on triche sur le paramètre du service, à changer lorsque l'on connaitra le format de la bdd
105
	public function getImagesPourNumTax($nt) {
106
		$requetes_taxon = 	'SELECT photos.*, taxons.Combinaison, photographes.Nom, photographes.Prenom, photographes.Initiales, photographes.Mail '.
107
								'FROM photos, photographes, taxons '.
108
								'WHERE photos.NumTaxon = '.$this->Bdd->proteger($nt).' '.
109
								'AND photos.Auteur = photographes.ID '.
110
								'AND photos.NumTaxon = taxons.NumTaxon '.
111
								'ORDER BY photos.support';
112
		$resultat = $this->Bdd->recupererTous($requetes_taxon);
113
		return $resultat;
114
	}
115
 
116
	private function formaterRetourJson($photographies) {
117
		$resultat = array();
118
		foreach ($photographies as $photo) {
119
 
120
			$image = array();
121
			$url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto']);
122
			$id = str_replace(array('.jpg','.jpeg'),'',$photo['NumPhoto']);
123
			// Post-traitement des valeurs
124
			$image['station'] = preg_replace('/^[ ]*:[ ]*/', '', $photo['lieu']);
125
			$image['date'] = $photo['Date'];
126
			$image['auteur'] = $photo['Prenom'].' '.$photo['Nom'];
127
			$image['determination.nom_sci'] = $photo['Objet'];
128
			$image['determination.nom_sci.code'] = "bdtfx.".$this->parametres['masque.nn'];
129
			$image['binaire.href'] = $url;
130
 
131
			// TODO: comment remplir ces champs ci ? voir la base de données
132
			/**    "determination": "nom_sci [Dét. : auteur]",
133
			 *     "determination.nom_sci": "nom_sci",
134
			 *     "determination.nom_sci.code": "bdtfx.num_nom"
135
			*/
136
 
137
			$resultat[$id] = $image;
138
		}
139
 
140
		return $resultat;
141
	}
142
 
143
	// TODO: garder ancien web service pour retour xml ou bien fusionner les deux ?
144
	private function formaterRetourXml($photographies) {
145
		// Formatage du xml
146
		$xml = '<?xml version="1.0" encoding="utf-8"?>'."\n";
147
		$xml .= '<rdf:RDF'."\n";
148
		$xml .= '	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n";
149
		$xml .= '	xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n";
150
		$xml .= '	xmlns:dcterms="http://purl.org/dc/terms">'."\n";
151
		foreach ($photographies as $photo) {
152
 
153
			$url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto']);
154
 
155
			// Post-traitement des valeurs
156
			$photo['lieu'] = preg_replace('/^[ ]*:[ ]*/', '', $photo['lieu']);
157
 
158
			// Gestion du XML
159
			$xml .= '	<rdf:Description about="'.$url.'"'."\n";
160
			$xml .= '		dc:identifier="'.preg_replace('/\.\w+$/', '', $photo['NumPhoto']).'"'."\n";
161
			$xml .= '		dc:title="'.$photo['Combinaison'].'"'."\n";
162
			$xml .= '		dc:description="'.$photo['Objet'].'"'."\n";
163
			$xml .= '		dc:creator="'.$photo['Prenom'].' '.$photo['Nom'].'"'."\n";
164
			//	$xml .= '		dc:contributor="Daniel MATHIEU (Détermination)"'."\n";
165
			$xml .= '		dc:publisher="Photoflora"'."\n";
166
			$xml .= '		dc:type="'.$this->donnerTxtSupport($photo['Support']).'"'."\n";
167
			$xml .= '		dc:format="'.$this->donnerTypeMime($photo['NumPhoto']).'"'."\n";
168
			$xml .= '		dcterms:spatial="'.$photo['lieu'].'"'."\n";
169
			$xml .= '		dcterms:created="'.$photo['Date'].'"'."\n";
170
			//	$xml .= '		dcterms:dateSubmitted="2006-10-18 08:32:00"'."\n";
171
			$xml .= '		dcterms:licence="Utilisation des photos non autorisée sans accord avec le gestionnaire du site et sous certaines conditions - Tous droits réservés - All rights reserved"/>'."\n";
172
		}
173
		$xml .= '</rdf:RDF>'."\n";
174
 
175
		return $xml;
176
	}
177
 
178
	private function getUrlPhotoPourInitiales($initiales, $num_photo) {
179
		// Gestion des urls des photos
180
		$url = '';
181
		if ($initiales == 'bb') {
182
			$base_url = ($this->format == 'max') ? $this->efph_url_photo_bb : $this->efph_url_photo_bb_min;
183
			$url = sprintf($base_url, $num_photo);
184
		} else if ($initiales == 'jlt') {
185
			$base_url = ($this->format == 'max') ? $this->efph_url_photo_jlt : $this->efph_url_photo_jlt_min;
186
			$url = sprintf($base_url, $num_photo);
187
		} else {
188
			$url = sprintf($this->efph_url_photo, $initiales, $num_photo);
189
		}
190
 
191
		return $url;
192
	}
193
 
194
	private function getResultatTest() {
195
		$photographies = array();
196
		$photographies[] = array('Initiales' => 'bb',
197
				'NumPhoto' => '047230.jpg',
198
				'lieu' => 'Ristolas - Hautes Alpes (05) [France]',
199
				'Combinaison' => '',
200
				'Objet' => 'Vue générale, en fleur cv Musik - Canon EOS 350D DIGITAL - Expo : 1/160 sec. - Ouv. : f8 - ISO : 100 - flash : non - foc. : 60 - pix. : 8 Mp.',
201
				'Prenom' => 'Benoit',
202
				'Nom' => 'BOCK',
203
				'Support' => 'Photographie numérique',
204
				'Date' => 'Mai 2006');
205
 
206
		return $photographies;
207
	}
208
 
209
	/**
210
	* Fonction remplaçant les caractères posant problème dans le xml
211
	*
212
	* @param string le texte à nettoyer
213
	* @return string le texte nettoyé
214
	*/
215
	function nettoyerXml($xml) {
216
		// Remplacement des esperluettes
217
		$xml = str_replace(' & ', ' &#38; ', $xml);
218
		// Remplacement du caractère spécial de fin de ligne : VT
219
		$xml = preg_replace('//', "\n", $xml);
220
		return $xml;
221
	}
222
 
223
	/**
224
	 * Fonction fournissant les intitulés des types de support des images
225
	 *
226
	 * @param integer identifiant du support
227
	 * @return string le texte correspondant au type de support
228
	 */
229
	function donnerTxtSupport($support) {
230
		switch ($support) {
231
			case '0':
232
				$support = 'Photographie num&#233;rique (6 éﻯgapixels)';
233
				break;
234
			case '1':
235
				$support = 'Diapositive';
236
				break;
237
			case '10':
238
				$support = 'Scan de la flore de Coste';
239
				break;
240
			case '11':
241
				$support = 'Scan de plante fraiche';
242
				break;
243
			default:
244
				$support = 'Erreur code support : pr&#233;venir eflore_remarques@tela-botanica.org';
245
		}
246
		return $support;
247
	}
248
 
249
	/**
250
	 * Fonction fournissant les types MIME des fichiers images
251
	 *
252
	 * @param string le nom du fichier
253
	 * @return string le texte du type MIME du fichier
254
	 */
255
	function donnerTypeMime($fichier) {
256
		if (preg_match('/\.(\w+)$/', $fichier, $match)) {
257
			switch (strtolower($match[1])) {
258
				case 'jpeg':
259
				case 'jpg':
260
					$type = 'image/jpeg';
261
					break;
262
				case 'png':
263
					$type = 'image/png';
264
					break;
265
				default:
266
					$type = 'Erreur Mime : péﻯvenir eflore_remarques@tela-botanica.org';
267
			}
268
		} else {
269
			$type = 'Erreur Mime : prévenir eflore_remarques@tela-botanica.org';
270
		}
271
		return $type;
272
	}
273
 
274
	/**
275
	 * Fonction fournissant une date au format Mysql
276
	 *
277
	 * @param string la date composé du nom du mois en français et de l'année sous 4 chiffres
278
	 * @return string la date dans le format Mysql
279
	 */
280
	function donnerDate($chaine) {
281
		if (preg_match('/^(\w+) (\d{4})$/',$chaine, $match)) {
282
			$mois = $match[1];
283
			$annee = $match[2];
284
			switch (strtolower($mois)) {
285
				case 'janvier' :
286
					$mois_sortie = '01';
287
					break;
288
				case 'février' :
289
					$mois_sortie = '02';
290
					break;
291
				case 'mars' :
292
					$mois_sortie = '03';
293
					break;
294
				case 'avril' :
295
					$mois_sortie = '04';
296
					break;
297
				case 'mai' :
298
					$mois_sortie = '05';
299
					break;
300
				case 'juin' :
301
					$mois_sortie = '06';
302
					break;
303
				case 'juillet' :
304
					$mois_sortie = '07';
305
					break;
306
				case 'aout' :
307
				case 'aoﻝt' :
308
					$mois_sortie = '08';
309
					break;
310
				case 'septembre' :
311
					$mois_sortie = '09';
312
					break;
313
				case 'octobre' :
314
					$mois_sortie = '10';
315
					break;
316
				case 'novembre' :
317
					$mois_sortie = '11';
318
					break;
319
				case 'decembre' :
320
					$mois_sortie = '12';
321
					break;
322
			}
323
			return $annee.'-'.$mois_sortie.'-01 01:01:01';
324
		} else {
325
			return '1970-01-01 01:01:01';
326
		}
327
	}
328
}
329
?>