2,35 → 2,34 |
/** |
* Web service particulier pour photoflora, qui ne doitpas être installé sur tela botanica |
* mais sur photoflora.free.fr |
* Une redirection htaccess est à faire, redirigeant /service:eflore:0.1/photoflora/image |
* Une redirection htaccess est à faire, redirigeant /service:eflore:0.1/photoflora/image |
* vers le site photoflora à l'adresse ou seront installé les services web et le minimum |
* nécessaire pour les faire fonctionner (framework + base de code eflore-projet ou peut-être moins) |
* |
* nécessaire pour les faire fonctionner (framework + base de code eflore-projet ou peut-être moins) |
* |
* La table des metadonnées est, elle, stockée sur Tela Botanica |
* Le service est dans le même dépot que les autres par souci de commodité |
* |
* |
*/ |
class Images { |
|
|
const MIME_JPEG = 'image/jpeg'; |
const MIME_PNG = 'image/png'; |
const MIME_JSON = 'application/json'; |
const MIME_XML = 'text/xml'; |
|
|
//TODO déplacer ceci dans des parametres de config |
const BDD_PF = 'photoflora'; |
private $efph_url_photo = 'http://photoflora.free.fr/photos/%s/max/%s'; |
private $efph_url_photo_bb = 'http://photoflorabb.free.fr/max/%s'; |
private $efph_url_photo_jlt = 'http://photoflorajlt.free.fr/max/%s'; |
|
|
private $efph_url_photo_min = 'http://photoflora.free.fr/photos/%s/min/%s'; |
private $efph_url_photo_bb_min = 'http://photoflora.free.fr/photos/bb/min/%s'; |
private $efph_url_photo_jlt_min = 'http://photoflora.free.fr/photos/jlt/min/%s'; |
|
|
private $parametres = array(); |
private $ressources = array(); |
private $Bdd; |
|
|
private $format = 'min'; |
private $retour_mime = 'application/json'; |
private $nbreImages = '0'; |
39,14 → 38,14 |
$this->config = is_null($config) ? Config::get('Images') : $config; |
$this->Bdd = is_null($bdd) ? new Bdd() : $bdd; |
} |
|
|
public function consulter($ressources, $parametres) { |
|
|
$this->parametres = $parametres; |
$this->ressources = $ressources; |
|
|
$this->definirValeurParDefautDesParametres(); |
|
|
$this->format = (isset($this->parametres['retour.format']) && $this->parametres['retour.format'] != '') ? $this->parametres['retour.format'] : $this->format; |
$this->retour_mime = (isset($this->parametres['retour']) && $this->parametres['retour'] != '') ? $this->parametres['retour'] : $this->retour_mime; |
$photographies = $this->getResultatTest(); |
70,18 → 69,18 |
exit; |
} |
} |
|
|
private function construireEntete() { |
$entete = array('masque' => '', 'depart' => 0, 'limite' => 100, 'total' => 0); |
|
|
$entete['masque'] = $this->recupererMasque(); |
$entete['depart'] = (int) $this->parametres['navigation.depart']; |
$entete['limite'] = (int) $this->parametres['navigation.limite']; |
$entete['total'] = $this->nbreImages; |
|
|
return $entete; |
} |
|
|
private function recupererMasque() { |
$masqueEntete = ''; |
foreach ($this->parametres as $param => $cle) { |
94,7 → 93,7 |
$masqueEntete = rtrim($masqueEntete,','); |
return $masqueEntete; |
} |
|
|
private function definirValeurParDefautDesParametres() { |
if (isset($this->parametres['retour']) == false) { |
$this->parametres['retour'] = self::MIME_JSON; |
109,7 → 108,7 |
$this->parametres['navigation.limite'] = 100; |
} |
} |
|
|
public function obtenirPremiereImage() { |
$this->parametres['navigation.depart'] = 0; |
$this->parametres['navigation.limite'] = 1; |
120,54 → 119,53 |
throw new Exception($message, $code); |
} else { |
return $images[0]; |
} |
} |
} |
|
public function obtenirImages() { |
//TODO: tri par date, mais les dates dans la bdd photoflora sont des chaines en entités HTML |
// donc un tri dessus n'a pas de sens |
$requete = 'SELECT photos.*, taxons.NumTaxon, taxons.NumNomen, taxons.Combinaison, photographes.Nom, '. |
' photographes.Prenom, photographes.Initiales, photographes.Mail '. |
'FROM '.self::BDD_PF.'.photos, '.self::BDD_PF.'.photographes, '.self::BDD_PF.'.taxons '. |
'WHERE '. |
'photos.Auteur = photographes.ID '. |
'AND photos.NumTaxon = taxons.NumTaxon '. |
$this->construireWhereNumNom().' '. |
$this->construireWhereNumTax().' '. |
$this->construireWhereNomSci().' '. |
$this->construireWhereAuteur().' '. |
'ORDER BY photos.support LIMIT '.$this->parametres['navigation.depart'].','.$this->parametres['navigation.limite']; |
$resultat = $this->Bdd->recupererTous($requete); |
$requete = 'SELECT photos.*,taxons.NumTaxon, taxons.NumNomen, taxons.Combinaison, photographes.Nom, photographes.Prenom, photographes.Initiales, photographes.Mail '. |
'FROM '.self::BDD_PF.'.photos, '.self::BDD_PF.'.photographes, '.self::BDD_PF.'.taxons '. |
'WHERE '. |
'photos.Auteur = photographes.ID '. |
'AND photos.NumTaxon = taxons.NumTaxon '. |
$this->construireWhereNumNom().' '. |
$this->construireWhereNumTax().' '. |
$this->construireWhereNomSci().' '. |
$this->construireWhereAuteur().' '. |
'ORDER BY photos.support LIMIT '.$this->parametres['navigation.depart'].','.$this->parametres['navigation.limite']; |
$resultat = $this->Bdd->recupererTous($requete); |
return $resultat; |
} |
|
|
private function construireWhereNumNom() { |
return (isset($this->parametres['masque.nn'])) ? 'AND taxons.NumNomen = '.$this->Bdd->proteger($this->parametres['masque.nn']).' ' : ''; |
} |
|
|
private function construireWhereNumTax() { |
return (isset($this->parametres['masque.nt'])) ? 'AND taxons.NumTaxon = '.$this->Bdd->proteger($this->parametres['masque.nt']).' ' : ''; |
} |
|
|
private function construireWhereNomSci() { |
return (isset($this->parametres['masque.ns'])) ? 'AND taxons.Combinaison LIKE '.$this->Bdd->proteger($this->parametres['masque.ns'].'%').' ' : ''; |
} |
|
|
private function construireWhereAuteur() { |
$requete_auteur = ''; |
if (isset($this->parametres['masque.auteur'])) { |
$auteur_like = $this->Bdd->proteger($this->parametres['masque.auteur'].'%'); |
$requete_auteur = 'AND photos.auteur = '. |
'(SELECT id FROM '.self::BDD_PF.'.photographes '. |
'WHERE '. |
'Nom LIKE '.$auteur_like.' OR '. |
'Prenom LIKE '.$auteur_like.' OR '. |
'Initiales LIKE '.$auteur_like.' OR '. |
'Mail LIKE '.$auteur_like.') '; |
} |
'(SELECT id FROM '.self::BDD_PF.'.photographes '. |
'WHERE '. |
'Nom LIKE '.$auteur_like.' OR '. |
'Prenom LIKE '.$auteur_like.' OR '. |
'Initiales LIKE '.$auteur_like.' OR '. |
'Mail LIKE '.$auteur_like.') '; |
} |
return $requete_auteur; |
} |
|
|
private function formaterRetourImageBinaire($photo) { |
$image = ''; |
$chemin = $url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto'], $this->format); |
179,57 → 177,42 |
} |
return $image; |
} |
|
private function formaterRetourJson($photographies) { |
|
private function formaterRetourJson($photographies) { |
$resultat = array(); |
if (is_array($photographies)) { |
if(is_array($photographies)) { |
foreach ($photographies as $photo) { |
|
$image = array(); |
$url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto'], $this->format); |
$urlmax = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto'], 'max'); |
$id = str_replace(array('.jpg','.jpeg', '.png'), '', $photo['NumPhoto']); |
|
$id = str_replace(array('.jpg','.jpeg'),'',$photo['NumPhoto']); |
// Post-traitement des valeurs |
$image['station'] = $this->formaterChaineEncodeeBddPhotoflora($photo['lieu']); |
$image['date'] = $this->donnerDate($this->formaterChaineEncodeeBddPhotoflora($photo['Date'])); |
$image['mime'] = $this->extraireMime($photo['NumPhoto']); |
$image['auteur.libelle'] = $this->formaterChaineEncodeeBddPhotoflora($photo['Prenom'].' '.$photo['Nom']); |
$image['binaire.href'] = $url; |
$image['auteur'] = $this->formaterChaineEncodeeBddPhotoflora($photo['Prenom'].' '.$photo['Nom']); |
$image['determination'] = $photo['Combinaison'].' ['.$photo['Prenom'].' '.$photo['Nom'].']'; |
$image['determination.nom_sci'] = $photo['Combinaison']; |
$image['determination.nom_sci.code'] = "bdtfx.".$photo['NumNomen']; |
$image['binaire.href'] = $url; |
$image['binaire.hrefmax'] = $urlmax; |
$image['determination.libelle'] = $photo['Combinaison'].' ['.$photo['Prenom'].' '.$photo['Nom'].']'; |
$image['determination.nom_sci.libelle'] = $photo['Combinaison']; |
$image['determination.nom_sci.code'] = "bdtfx.".$photo['NumNomen']; |
$image['station.libelle'] = $this->formaterStation($photo['lieu']); |
|
|
$resultat[$id] = $image; |
} |
} |
|
return $resultat; |
} |
|
private function extraireMime($fichierImg) { |
$mime = ''; |
if (strpos($fichierImg, '.jpg') || strpos($fichierImg, '.jpeg')) { |
$mime = self::MIME_JPEG; |
} else if (strpos($fichierImg, '.png')) { |
$mime = self::MIME_PNG; |
} |
return $mime; |
} |
|
private function formaterStation($station) { |
$station = $this->formaterChaineEncodeeBddPhotoflora($station); |
$station = preg_replace('/^ : /', '', $station); |
return $station; |
} |
|
|
private function callBackReplace($m) { |
return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); |
} |
|
|
private function formaterChaineEncodeeBddPhotoflora($chaine) { |
return $chaine = preg_replace_callback("/(&#[0-9]+;)/", array($this, 'callBackReplace'), $chaine); |
return $chaine = preg_replace_callback("/(&#[0-9]+;)/", array($this, 'callBackReplace') |
, $chaine); |
} |
|
|
// TODO: garder ancien web service pour retour xml ou bien fusionner les deux ? |
private function formaterRetourXml($photographies) { |
// Formatage du xml |
239,12 → 222,12 |
$xml .= ' xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n"; |
$xml .= ' xmlns:dcterms="http://purl.org/dc/terms">'."\n"; |
foreach ($photographies as $photo) { |
|
|
$url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto'], $this->format); |
|
|
// Post-traitement des valeurs |
$photo['lieu'] = preg_replace('/^[ ]*:[ ]*/', '', $photo['lieu']); |
|
|
// Gestion du XML |
$xml .= ' <rdf:Description about="'.$url.'"'."\n"; |
$xml .= ' dc:identifier="'.preg_replace('/\.\w+$/', '', $photo['NumPhoto']).'"'."\n"; |
261,10 → 244,10 |
$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"; |
} |
$xml .= '</rdf:RDF>'."\n"; |
|
|
return $xml; |
} |
|
|
private function getUrlPhotoPourInitiales($initiales, $num_photo, $format) { |
// Gestion des urls des photos |
$url = ''; |
278,14 → 261,14 |
$base_url = ($format == 'max') ? $this->efph_url_photo : $this->efph_url_photo_min; |
$url = sprintf($base_url, $initiales, $num_photo); |
} |
|
|
return $url; |
} |
|
|
private function getResultatTest() { |
$photographies = array(); |
$photographies[] = array('Initiales' => 'bb', |
'NumPhoto' => 'bb047230.jpg', |
'NumPhoto' => 'bb047230.jpg', |
'NumNomen' => '182', |
'lieu' => 'Ristolas - Hautes Alpes (05) [France]', |
'Combinaison' => '', |
294,10 → 277,10 |
'Nom' => 'BOCK', |
'Support' => 'Photographie numérique', |
'Date' => 'Mai 2006'); |
|
|
return $photographies; |
} |
|
|
/** |
* Fonction remplaçant les caractères posant problème dans le xml |
* |
311,7 → 294,7 |
$xml = preg_replace('//', "\n", $xml); |
return $xml; |
} |
|
|
/** |
* Fonction fournissant les intitulés des types de support des images |
* |
337,7 → 320,7 |
} |
return $support; |
} |
|
|
/** |
* Fonction fournissant les types MIME des fichiers images |
* |
362,7 → 345,7 |
} |
return $type; |
} |
|
|
/** |
* Fonction fournissant une date au format Mysql |
* |