New file |
0,0 → 1,329 |
<?php |
/** |
* Web service particulier pour photoflora, qui ne doit être installé sur tela botanica |
* mais sur photoflora.free.fr |
* 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) |
* |
* 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_JSON = 'application/json'; |
const MIME_XML = 'text/xml'; |
|
//TODO déplacer ceci dans des parametres de config |
private $efph_url_photo = 'http://photoflora.free.fr/photos/٪s/max/%s'; |
private $efph_url_photo_bb = 'http://photoflorabb.free.fr/max/bb%s'; |
private $efph_url_photo_jlt = 'http://photoflorajlt.free.fr/max/jlt%s'; |
|
private $efph_url_photo_bb_min = 'http://photoflora.free.fr/photos/bb/min/bb%s'; |
private $efph_url_photo_jlt_min = 'http://photoflora.free.fr/photos/jlt/min/jlt%s'; |
|
private $parametres = array(); |
private $ressources = array(); |
private $Bdd; |
|
private $format = 'min'; |
private $retour_mime = 'application/json'; |
private $nbreImages = '0'; |
|
public function __construct(Bdd $bdd = null, Array $config = null) { |
$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; |
// TODO: décommenter lors de la mise en prod |
//$photographies = $this->getImagesPourNumTax($ressources[0]); |
//TODO commenter lors de la mise en prod |
$photographies = $this->getResultatTest(); |
$this->nbreImages = count($photographies); |
|
if($this->retour_mime == self::MIME_JSON) { |
$photographies_formatees = $this->formaterRetourJson($photographies); |
$resultat = $photographies_formatees; |
$entete = $this->construireEntete(); |
return array('entete' => $entete, 'resultats' => $resultat); |
} elseif ($this->retour_mime == self::MIME_XML) { |
$photographies_formatees = $this->formaterRetourXml($photographies); |
header('Content-Type: '.self::MIME_XML); |
echo $photographies_formatees; |
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 = ''; |
// on récupère un num tax en fait |
if ($masqueNn = $this->parametres['masque.nn']) { |
$masqueEntete = "nn=$masqueNn"; |
} |
return $masqueEntete; |
} |
|
private function definirValeurParDefautDesParametres() { |
if (isset($this->parametres['retour']) == false) { |
$this->parametres['retour'] = self::MIME_JSON; |
} |
if (isset($this->parametres['retour.format']) == false) { |
$this->parametres['retour.format'] = 'min'; |
} |
if (isset($this->parametres['navigation.depart']) == false) { |
$this->parametres['navigation.depart'] = 0; |
} |
if (isset($this->parametres['navigation.limite']) == false) { |
$this->parametres['navigation.limite'] = 100; |
} |
} |
|
//TODO utiliser le num nom ? |
// en attendant on triche sur le paramètre du service, à changer lorsque l'on connaitra le format de la bdd |
public function getImagesPourNumTax($nt) { |
$requetes_taxon = 'SELECT photos.*, taxons.Combinaison, photographes.Nom, photographes.Prenom, photographes.Initiales, photographes.Mail '. |
'FROM photos, photographes, taxons '. |
'WHERE photos.NumTaxon = '.$this->Bdd->proteger($nt).' '. |
'AND photos.Auteur = photographes.ID '. |
'AND photos.NumTaxon = taxons.NumTaxon '. |
'ORDER BY photos.support'; |
$resultat = $this->Bdd->recupererTous($requetes_taxon); |
return $resultat; |
} |
|
private function formaterRetourJson($photographies) { |
$resultat = array(); |
foreach ($photographies as $photo) { |
|
$image = array(); |
$url = $this->getUrlPhotoPourInitiales($photo['Initiales'], $photo['NumPhoto']); |
$id = str_replace(array('.jpg','.jpeg'),'',$photo['NumPhoto']); |
// Post-traitement des valeurs |
$image['station'] = preg_replace('/^[ ]*:[ ]*/', '', $photo['lieu']); |
$image['date'] = $photo['Date']; |
$image['auteur'] = $photo['Prenom'].' '.$photo['Nom']; |
$image['determination.nom_sci'] = $photo['Objet']; |
$image['determination.nom_sci.code'] = "bdtfx.".$this->parametres['masque.nn']; |
$image['binaire.href'] = $url; |
|
// TODO: comment remplir ces champs ci ? voir la base de données |
/** "determination": "nom_sci [Dét. : auteur]", |
* "determination.nom_sci": "nom_sci", |
* "determination.nom_sci.code": "bdtfx.num_nom" |
*/ |
|
$resultat[$id] = $image; |
} |
|
return $resultat; |
} |
|
// TODO: garder ancien web service pour retour xml ou bien fusionner les deux ? |
private function formaterRetourXml($photographies) { |
// Formatage du xml |
$xml = '<?xml version="1.0" encoding="utf-8"?>'."\n"; |
$xml .= '<rdf:RDF'."\n"; |
$xml .= ' xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n"; |
$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']); |
|
// 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"; |
$xml .= ' dc:title="'.$photo['Combinaison'].'"'."\n"; |
$xml .= ' dc:description="'.$photo['Objet'].'"'."\n"; |
$xml .= ' dc:creator="'.$photo['Prenom'].' '.$photo['Nom'].'"'."\n"; |
// $xml .= ' dc:contributor="Daniel MATHIEU (Détermination)"'."\n"; |
$xml .= ' dc:publisher="Photoflora"'."\n"; |
$xml .= ' dc:type="'.$this->donnerTxtSupport($photo['Support']).'"'."\n"; |
$xml .= ' dc:format="'.$this->donnerTypeMime($photo['NumPhoto']).'"'."\n"; |
$xml .= ' dcterms:spatial="'.$photo['lieu'].'"'."\n"; |
$xml .= ' dcterms:created="'.$photo['Date'].'"'."\n"; |
// $xml .= ' dcterms:dateSubmitted="2006-10-18 08:32:00"'."\n"; |
$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) { |
// Gestion des urls des photos |
$url = ''; |
if ($initiales == 'bb') { |
$base_url = ($this->format == 'max') ? $this->efph_url_photo_bb : $this->efph_url_photo_bb_min; |
$url = sprintf($base_url, $num_photo); |
} else if ($initiales == 'jlt') { |
$base_url = ($this->format == 'max') ? $this->efph_url_photo_jlt : $this->efph_url_photo_jlt_min; |
$url = sprintf($base_url, $num_photo); |
} else { |
$url = sprintf($this->efph_url_photo, $initiales, $num_photo); |
} |
|
return $url; |
} |
|
private function getResultatTest() { |
$photographies = array(); |
$photographies[] = array('Initiales' => 'bb', |
'NumPhoto' => '047230.jpg', |
'lieu' => 'Ristolas - Hautes Alpes (05) [France]', |
'Combinaison' => '', |
'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.', |
'Prenom' => 'Benoit', |
'Nom' => 'BOCK', |
'Support' => 'Photographie numérique', |
'Date' => 'Mai 2006'); |
|
return $photographies; |
} |
|
/** |
* Fonction remplaçant les caractères posant problème dans le xml |
* |
* @param string le texte à nettoyer |
* @return string le texte nettoyé |
*/ |
function nettoyerXml($xml) { |
// Remplacement des esperluettes |
$xml = str_replace(' & ', ' & ', $xml); |
// Remplacement du caractère spécial de fin de ligne : VT |
$xml = preg_replace('//', "\n", $xml); |
return $xml; |
} |
|
/** |
* Fonction fournissant les intitulés des types de support des images |
* |
* @param integer identifiant du support |
* @return string le texte correspondant au type de support |
*/ |
function donnerTxtSupport($support) { |
switch ($support) { |
case '0': |
$support = 'Photographie numérique (6 éﻯgapixels)'; |
break; |
case '1': |
$support = 'Diapositive'; |
break; |
case '10': |
$support = 'Scan de la flore de Coste'; |
break; |
case '11': |
$support = 'Scan de plante fraiche'; |
break; |
default: |
$support = 'Erreur code support : prévenir eflore_remarques@tela-botanica.org'; |
} |
return $support; |
} |
|
/** |
* Fonction fournissant les types MIME des fichiers images |
* |
* @param string le nom du fichier |
* @return string le texte du type MIME du fichier |
*/ |
function donnerTypeMime($fichier) { |
if (preg_match('/\.(\w+)$/', $fichier, $match)) { |
switch (strtolower($match[1])) { |
case 'jpeg': |
case 'jpg': |
$type = 'image/jpeg'; |
break; |
case 'png': |
$type = 'image/png'; |
break; |
default: |
$type = 'Erreur Mime : péﻯvenir eflore_remarques@tela-botanica.org'; |
} |
} else { |
$type = 'Erreur Mime : prévenir eflore_remarques@tela-botanica.org'; |
} |
return $type; |
} |
|
/** |
* Fonction fournissant une date au format Mysql |
* |
* @param string la date composé du nom du mois en français et de l'année sous 4 chiffres |
* @return string la date dans le format Mysql |
*/ |
function donnerDate($chaine) { |
if (preg_match('/^(\w+) (\d{4})$/',$chaine, $match)) { |
$mois = $match[1]; |
$annee = $match[2]; |
switch (strtolower($mois)) { |
case 'janvier' : |
$mois_sortie = '01'; |
break; |
case 'février' : |
$mois_sortie = '02'; |
break; |
case 'mars' : |
$mois_sortie = '03'; |
break; |
case 'avril' : |
$mois_sortie = '04'; |
break; |
case 'mai' : |
$mois_sortie = '05'; |
break; |
case 'juin' : |
$mois_sortie = '06'; |
break; |
case 'juillet' : |
$mois_sortie = '07'; |
break; |
case 'aout' : |
case 'aoﻝt' : |
$mois_sortie = '08'; |
break; |
case 'septembre' : |
$mois_sortie = '09'; |
break; |
case 'octobre' : |
$mois_sortie = '10'; |
break; |
case 'novembre' : |
$mois_sortie = '11'; |
break; |
case 'decembre' : |
$mois_sortie = '12'; |
break; |
} |
return $annee.'-'.$mois_sortie.'-01 01:01:01'; |
} else { |
return '1970-01-01 01:01:01'; |
} |
} |
} |
?> |