1,5 → 1,4 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Le web service image récupère toutes les données de la table del_obs_images |
* pour retourner une liste d'images associée à la détermination la plus probable |
8,11 → 7,11 |
* @category php 5.2 |
* @package del |
* @subpackage images |
* @author Raphaël Droz <raphael@tela-botanica.org> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id: Bdd.php 403 2012-02-22 14:35:20Z aperonnet $ |
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images |
*/ |
|
48,25 → 47,46 |
* @param array $parametres les paramètres situés après le ? dans l'url |
* */ |
public function consulter($ressources, $parametres) { |
$this->initialiserRessourcesEtParametres($ressources, $parametres); |
// initialiserRessourcesEtParametres() |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
|
if(!isset($parametres['masque.protocole'])) { |
$this->parametres['masque.protocole'] = $this->protocole_defaut; |
} |
if(!isset($parametres['masque.valeur_vote_min'])) { |
$this->parametres['masque.valeur_vote_min'] = $this->valeur_vote_min_defaut; |
} |
|
// Gestion des configuration du script |
$this->configurer(); |
$this->verifierConfiguration(); |
// configurer(); |
$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque'); |
$this->mappingObservation = $this->conteneur->getParametre('mapping_observation'); |
$this->mappingVotes = $this->conteneur->getParametre('mapping_votes'); |
|
// verifierConfiguration() |
if(! $this->conteneur->getParametre('protocoles_possibles')) { |
throw new Exception("Erreur lors de la configuration : \n- le fichier de configuration ne contient pas le parametre protocoles_possibles ou celui-ci est vide ;", RestServeur::HTTP_CODE_ERREUR); |
} |
|
$this->verifierParametres(); |
|
$this->initialiserTri(); |
// initialiserTri() |
$this->tri = isset($this->parametres['tri']) ? $this->parametres['tri'] : $this->tri; |
$this->directionTri = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : $this->directionTri; |
|
|
// Lancement du service |
$liaisons = $this->chargerLiaisons2(); |
$liaisons = $this->chargerLiaisons(); |
$images = array(); |
$total = 0; |
if(!empty($liaisons)) { |
$total = $this->compterImages(); |
|
if($liaisons) { |
$compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre'); |
$total = (int) $compte['nbre']; |
|
$images = $this->chargerImage($liaisons); |
$images = $this->chargerPropositionPlusProbable($images); |
} else { |
$images = $liaisons; |
} |
|
$this->navigation->setTotal($total); |
78,18 → 98,6 |
return $resultat; |
} |
|
private function initialiserRessourcesEtParametres($ressources, $parametres) { |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
|
if(!isset($parametres['masque.protocole'])) { |
$this->parametres['masque.protocole'] = $this->protocole_defaut; |
} |
if(!isset($parametres['masque.valeur_vote_min'])) { |
$this->parametres['masque.valeur_vote_min'] = $this->valeur_vote_min_defaut; |
} |
} |
|
private function verifierParametres() { |
$erreurs = array(); |
$tableau_protocoles = explode(',',$this->conteneur->getParametre('protocoles_possibles')); |
110,97 → 118,14 |
} |
|
if (!empty($erreurs)) { |
$e = 'Erreur lors de l\'analyse des parametres du service : '."\n"; |
$e .= implode("\n", $erreurs); |
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); |
throw new Exception("Erreur lors de l\'analyse des parametres du service : \n" . implode("\n", $erreurs), RestServeur::HTTP_CODE_ERREUR); |
} |
} |
|
private function initialiserTri() { |
$this->tri = isset($this->parametres['tri']) ? $this->parametres['tri'] : $this->tri; |
$this->directionTri = isset($this->parametres['ordre']) ? $this->parametres['ordre'] : $this->directionTri; |
} |
/*------------------------------------------------------------------------------- |
CONFIGURATION DU SERVICE |
--------------------------------------------------------------------------------*/ |
/** |
* Configuration du service en fonction du fichier de config config_del.ini |
* */ |
public function configurer() { |
$this->mappingFiltre = $this->conteneur->getParametre('mapping_masque'); |
$this->mappingObservation = $this->conteneur->getParametre('mapping_observation'); |
$this->mappingVotes = $this->conteneur->getParametre('mapping_votes'); |
} |
|
/** |
* Vérifier que le service est bien configuré |
* */ |
public function verifierConfiguration() { |
|
$erreurs = array(); |
$tris_possibles = $this->conteneur->getParametre('protocoles_possibles'); |
if (empty($tris_possibles)) { |
$erreurs[] = '- le fichier de configuration ne contient pas le parametre protocoles_possibles ou celui-ci est vide ;'; |
} |
//TODO: ajouter des vérifications si le web service s'étoffe |
|
if (!empty($erreurs)) { |
$e = 'Erreur lors de la configuration : '."\n"; |
$e .= implode("\n", $erreurs); |
throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); |
} |
} |
|
private function remplacerParJokerCaractere($valeurMasque) { |
return str_replace(array('-',' '), '_', $valeurMasque); |
} |
//TODO: déplacer les fonctions ci dessus et dessous dans une classe |
// utilitaire |
function supprimerAccents($str, $charset='utf-8') |
{ |
$str = htmlentities($str, ENT_NOQUOTES, $charset); |
|
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); |
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ' |
$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères |
|
return $str; |
} |
|
/*------------------------------------------------------------------------------- |
CHARGEMENT DES IMAGES |
--------------------------------------------------------------------------------*/ |
/** |
* Chargement depuis la bdd de toutes les liaisons entre images et observations |
* */ |
private function chargerLiaisons() { |
|
$champs = array('dob.id_observation as id_observation', 'dob.nom_referentiel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo', |
'lieudit', 'station', 'milieu', 'date_observation', 'dob.mots_cles_texte as mots_cles_texte', 'dob.commentaire as commentaire', |
'di.mots_cles_texte as mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur', |
'prenom', 'nom', 'courriel', 'dob.nom_utilisateur', 'dob.prenom_utilisateur', 'dob.courriel_utilisateur', 'nom_original'); |
|
$requeteLiaisons = 'SELECT SQL_CALC_FOUND_ROWS '.implode(', ',$champs).', '. |
'AVG(dvote.valeur) as moyenne_votes '. |
'FROM '.$this->gestionBdd->formaterTable('del_obs_image', 'doi'). |
'INNER JOIN del_image di '. |
'ON doi.id_image = di.id_image '. |
'INNER JOIN del_observation dob '. |
'ON doi.id_observation = dob.id_observation '. |
'LEFT JOIN del_utilisateur du '. |
'ON du.id_utilisateur = di.ce_utilisateur '. |
'LEFT JOIN del_image_vote dvote '. |
'ON doi.id_image = dvote.ce_image '. |
($this->parametres['masque.protocole'] != null ? 'AND dvote.ce_protocole = '.$this->parametres['masque.protocole'].' ' : ' '); |
$requeteLiaisons .= 'GROUP BY dvote.ce_image '. |
($this->parametres['masque.valeur_vote_min'] != null && $this->parametres['masque.valeur_vote_min'] != 0 ? 'HAVING AVG(dvote.valeur) >= '.$this->parametres['masque.valeur_vote_min'].' ' : ' '). |
'ORDER BY moyenne_votes'; |
$requeteLiaisons .= $this->gestionBdd->getLimitSql(); |
|
return $this->bdd->recupererTous($requeteLiaisons); |
} |
|
private function chargerLiaisons2() { |
$champs = array('di.id_observation as id_observation', 'nom_referentiel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille', 'ce_zone_geo', 'zone_geo', |
'lieudit', 'station', 'milieu', 'date_observation', 'di.mots_cles_texte as mots_cles_texte', 'di.commentaire as commentaire', |
'di.i_mots_cles_texte AS mots_cles_texte_image ', 'date_transmission', 'di.id_image as id_image', 'di.ce_utilisateur as ce_utilisateur', |
222,7 → 147,7 |
|
implode(', ',$champs), |
implode(' AND ', $where), |
intval($this->parametres['navigation.depart']), |
intval(@$this->parametres['navigation.depart']), |
$limite, |
__FILE__, __LINE__); |
|
232,30 → 157,7 |
return $this->bdd->recupererTous($requeteLiaisons); |
} |
|
private function doitJoindreTableVotes() { |
return ($this->tri == 'votes'); |
} |
|
private function getTri() { |
$order = ''; |
if($this->doitJoindreTableVotes()) { |
$order = ' GROUP BY dvote.ce_image, dob.id_observation ORDER BY total_votes '.$this->directionTri.', date_transmission desc '; |
} else { |
$order = ' ORDER BY '.$this->tri.' '.$this->directionTri.' '; |
} |
return $order; |
} |
|
/** |
* Compter le nombre total d'images dans la base pour affichage dans entete. |
* */ |
private function compterImages() { |
$requete = 'SELECT FOUND_ROWS() AS nbre '; |
$resultats = $this->bdd->recuperer($requete); |
return (int) $resultats['nbre']; |
} |
|
/** |
* Retourner un tableau d'images formaté en fonction des liaisons trouvées |
* @param $liaisons les liaisons de la table del_obs_images |
* */ |
279,7 → 181,7 |
'id_image' => $idImage, |
'id_observation' => $idObs, |
'auteur.intitule' => $liaison['prenom'].' '.$liaison['nom'], |
'binaire.href' => $this->formaterLienImage($idImage), |
'binaire.href' => sprintf($this->conteneur->getParametre('url_images'), $idImage), |
'determination.famille' => $liaison['famille'], |
'determination.referentiel' => $liaison['nom_referentiel'], |
'determination.ns' => $liaison['nom_ret'], |
295,35 → 197,24 |
} |
|
/** |
* Charger les votes pour chaque image |
* */ |
* Charger les votes pour chaque image |
**/ |
private function chargerPropositionPlusProbable($images) { |
$this->obsIds = array(368594); |
$resultatsPropositions = $this->bdd->recupererTous(sprintf( |
'SELECT * FROM del_commentaire WHERE ce_observation IN (%s) AND nom_sel IS NOT NULL', |
implode(',', $this->obsIds))); |
|
$resultatsVotes = $this->bdd->recupererTous(sprintf( |
'SELECT ce_proposition, valeur, ce_utilisateur FROM del_commentaire_vote WHERE ce_proposition IN'. |
' ( SELECT id_commentaire FROM del_commentaire WHERE ce_observation IN (%s) AND nom_sel IS NOT NULL )'. |
' ORDER BY ce_proposition', |
implode(',', $this->obsIds))); |
|
$resultatsMotsCles = $this->bdd->recupererTous(sprintf( |
'SELECT tag, ce_image FROM del_image_tag WHERE ce_image IN (%s) AND actif = 1', |
implode(',', array_keys($this->indexImagesIds)))); |
|
|
$requetePropositions = 'SELECT * FROM '. |
'del_commentaire '. |
'WHERE ce_observation IN ('.implode(',', $this->obsIds).') '. |
'AND nom_sel IS NOT NULL '; |
|
$requeteVotes = 'SELECT ce_proposition, valeur, ce_utilisateur '. |
'FROM del_commentaire_vote '. |
'WHERE ce_proposition IN ('. |
'SELECT id_commentaire FROM '. |
'del_commentaire '. |
'WHERE ce_observation IN ('.implode(',', $this->obsIds).') '. |
'AND nom_sel IS NOT NULL'. |
') '. |
'ORDER BY ce_proposition'; |
|
$requeteMotsCles = 'SELECT tag, ce_image '. |
'FROM del_image_tag '. |
'WHERE ce_image IN ('.implode(',', array_keys($this->indexImagesIds)).') '. |
'AND actif = 1 '; |
|
$resultatsPropositions = $this->bdd->recupererTous($requetePropositions); |
$resultatsVotes = $this->bdd->recupererTous($requeteVotes); |
$resultatsMotsCles = $this->bdd->recupererTous($requeteMotsCles); |
|
$propositions = array(); |
$votes = array(); |
|
374,7 → 265,7 |
} |
|
if(isset($images[$id]['determination.nn'])) { |
$images[$id]['url_fiche_eflore'] = $this->formaterUrlFicheEflore($images[$id]['determination.nn']); |
$images[$id]['url_fiche_eflore'] = sprintf($this->conteneur->getParametre('url_fiche_eflore'), $images[$id]['determination.nn']); // formaterUrlFicheEflore |
} |
} |
|
400,63 → 291,22 |
* @return string la chaine filtrée |
* */ |
private function formaterMotsClesCel($chaineMotCleCel) { |
$tabMotsClesCel = explode(',', $chaineMotCleCel); |
$chaineMotsClesAffiches = $this->conteneur->getParametre('mots_cles_cel_affiches'); |
$tabMotsClesAffiches = explode(',',$chaineMotsClesAffiches); |
|
return implode(',', array_intersect($tabMotsClesAffiches, $tabMotsClesCel)); |
return implode(',', array_intersect( |
explode(',', $this->conteneur->getParametre('mots_cles_cel_affiches')), // $tabMotsClesAffiches |
explode(',', $chaineMotCleCel))); // $tabMotsClesCel |
} |
|
/** |
* Formater une observation depuis une ligne liaison |
* @param $liaison liaison issue de la recherche |
* @return $observation l'observation mise en forme |
* */ |
private function formaterObservation($liaison) { |
$observation = array(); |
|
foreach ($this->mappingObservation as $nomOriginal => $nomFinal) { |
$observation[$nomFinal] = $liaison[$nomOriginal]; |
} |
|
return $observation; |
} |
|
/** |
* Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image |
* */ |
private function formaterLienImage($idImage) { |
$idImage = sprintf('%09s', $idImage); |
$url = $this->conteneur->getParametre('url_images'); |
$urlImage = str_replace('%s', $idImage, $url); |
return $urlImage; |
} |
|
private function formaterLieu($image) { |
if(! $image['ce_zone_geo']) return ''; |
|
$lieu = $image['zone_geo']; |
if($image['ce_zone_geo'] != '') { |
$id_zone_geo = $image['ce_zone_geo']; |
if(strpos($image['ce_zone_geo'], 'INSEE-C:') === 0) { |
$id_zone_geo = str_replace('INSEE-C:', '', $image['ce_zone_geo']); |
$id_zone_geo = (strlen($id_zone_geo) >= 5) ? substr($id_zone_geo, 0, 2) : $id_zone_geo; |
} |
$id_zone_geo = $image['ce_zone_geo']; |
if(strpos($image['ce_zone_geo'], 'INSEE-C:') === 0) { |
$id_zone_geo = str_replace('INSEE-C:', '', $image['ce_zone_geo']); |
$id_zone_geo = strlen($id_zone_geo) >= 5 ? substr($id_zone_geo, 0, 2) : $id_zone_geo; |
} |
|
$lieu .= ' ('.$id_zone_geo.')'; |
} |
return $lieu; |
return $lieu . ' ('.$id_zone_geo.')'; |
} |
|
private function formaterUrlFicheEflore($num_nom) { |
$url = $this->conteneur->getParametre('url_fiche_eflore'); |
return sprintf($url, $num_nom); |
} |
|
private function proteger($valeur) { |
if (is_array($valeur)) { |
return $this->bdd->protegerTableau($valeur); |
} else { |
return $this->bdd->proteger($valeur); |
} |
} |
} |
?> |