Rev 1641 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** 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* avec la possibilité de ne renvoyer que les images les mieux notées pour un protocole donné** @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* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images*/class Changements {private $indexImagesIds = array();private $conteneur;private $navigation;private $masque;private $gestionBdd;private $bdd;private $parametres = array();private $ressources = array();private $date_defaut = '1900-01-01';public function __construct(Conteneur $conteneur = null) {/* restore_exception_handler(); *//* restore_error_handler(); *//* ini_set("display_errors", "1"); */$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;$this->conteneur->chargerConfiguration('config_plantnet.ini');$this->navigation = $conteneur->getNavigation();$this->masque = $conteneur->getMasque();$this->gestionBdd = $conteneur->getGestionBdd();$this->bdd = $this->gestionBdd->getBdd();}/*** Méthode principale de la classe.* Lance la récupération des images dans la base et les place dans un objet ResultatService* pour l'afficher.* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)* @param array $parametres les paramètres situés après le ? dans l'url* */public function consulter($ressources, $parametres) {// initialiserRessourcesEtParametres()$this->ressources = $ressources;$this->parametres = $parametres;if(!isset($parametres['date'])) {$this->parametres['date'] = $this->date_defaut;}// Lancement du service$liaisons = $this->chargerLiaisons();$images = array();$total = 0;if($liaisons) {$compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');$total = (int) $compte['nbre'];//$images = $this->chargerImages($liaisons);$obs = $this->regrouperObs($liaisons);//$images = $this->chargerPropositionPlusProbable($obs);}$this->navigation->setTotal($total);// Mettre en forme le résultat et l'envoyer pour affichage$resultat = new ResultatService();//$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $images);$resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);return $resultat;}/*-------------------------------------------------------------------------------CHARGEMENT DES IMAGES--------------------------------------------------------------------------------*/private function chargerLiaisons() {$date_debut = $this->parametres['date'];$limite = @min(intval($this->parametres['navigation.limite']), 1000);$limite = $limite ? $limite : 10; // 0 => 10$depart = intval(@$this->parametres['navigation.depart']);$requete_sql ='select SQL_CALC_FOUND_ROWS vdi.id_observation, vdi.id_image, '.'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.'vdi.ce_zone_geo, vdi.zone_geo, vdi.lieudit, vdi.station, vdi.milieu, '.'vdi.date_observation, vdi.date_transmission, '.'vdi.mots_cles_texte as mots_cles_texte, '.'vdi.i_mots_cles_texte as mots_cles_texte_image, '.'vdi.ce_utilisateur as ce_utilisateur, '.'vdi.prenom_utilisateur, vdi.courriel_utilisateur, vdi.nom_utilisateur, vdi.nom_original as nom_image, '.'GROUP_CONCAT(del_image_vote.valeur) as votes, GROUP_CONCAT(DISTINCT tag) as tags, '.'GREATEST(vdi.date_creation, vdi.date_modification, MAX(del_image_tag.date), '.'MAX(del_image_tag.date_modification), MAX(del_image_vote.date), '.'IFNULL(MAX(del_commentaire.date),0), IFNULL(MAX(del_commentaire_vote.date),0)) as modif_date '.'from v_del_image as vdi '.'left join del_image_vote on del_image_vote.ce_image=id_image '.'left join del_image_tag on del_image_tag.ce_image=id_image '.'left join del_commentaire on del_commentaire.ce_observation=id_observation '.'left join del_commentaire_vote on del_commentaire_vote.ce_proposition=del_commentaire.id_commentaire '.'where ce_protocole=3 and actif=1 '.'group by id_image, id_observation '.'having MAX(vdi.date_creation) >= '.$date_debut.' or '.' MAX(vdi.date_modification) >= '.$date_debut.' or '.' MAX(del_image_tag.date) >= '.$date_debut.' or '.' MAX(del_image_tag.date_modification) >= '.$date_debut.' or '.' MAX(del_image_vote.date) >= '.$date_debut.' or '.' MAX(del_commentaire.date) >= '.$date_debut.' or '.' MAX(del_commentaire_vote.date) >= '.$date_debut.' '.'order by modif_date DESC '.'limit '.$depart.', '.$limite.' -- '.__FILE__.':'.__LINE__;return $this->bdd->recupererTous($requete_sql);// GROUP BY (très couteux) car multiples observations associées à une image// eg: 16150,16185,16245,16246,118995,129989}/*** Retourner un tableau d'images formaté en fonction des liaisons trouvées* @param $liaisons les liaisons de la table del_obs_images* */private function regrouperObs(&$liaisons) {// regroupe les observations$obs = array();foreach ($liaisons as $img) {$idobs = $img['id_observation'];if (!isset($obs[$idobs])) {$obs[$idobs] = array();}$obs[$idobs]['id_observation'] = $idobs;if (!isset($obs[$idobs]['images'])) {$obs[$idobs]['images'] = array();}$obs[$idobs]['images'][] = $img['id_image'];}return $obs;/* $images = array(); *//* foreach ($liaisons as $liaison) { *//* if($liaison['ce_utilisateur'] == 0) { *//* $liaison['prenom'] = $liaison['prenom_utilisateur']; *//* $liaison['nom'] = $liaison['nom_utilisateur']; *//* } *//* $idObs = $liaison['id_observation']; *//* $idImage = $liaison['id_image']; *//* // On enregistre l'ID de l'obs pour n'effectuer qu'une seule requête par la suite *//* $this->obsIds[] = $idObs; *//* $index = $liaison['id_image'].'-'.$liaison['id_observation']; *//* $this->indexImagesIds[$idImage] = $index; *//* $images[$index] = array( *//* 'id_image' => $idImage, *//* 'id_observation' => $idObs, *//* 'auteur.intitule' => $liaison['prenom'].' '.$liaison['nom'], *//* 'binaire.href' => sprintf($this->conteneur->getParametre('url_images'), $idImage), *//* 'determination.famille' => $liaison['famille'], *//* 'determination.referentiel' => $liaison['nom_referentiel'], *//* 'determination.ns' => $liaison['nom_ret'], *//* 'determination.nn' => $liaison['nom_ret_nn'], *//* 'determination.nt' => $liaison['nt'], *//* 'date_observation' => $liaison['date_observation'], *//* 'localite' => $this->formaterLieu($liaison), *//* 'mots_cles_image_cel' => $this->formaterMotsClesCel($liaison['mots_cles_texte_image']), *//* 'mots_cles_image_del' => "" *//* ); *//* } *//* return $images; */}/*** Charger les votes pour chaque image**/private function chargerPropositionPlusProbable(&$images) {$resultatsPropositions = $this->bdd->recupererTous(sprintf('SELECT * FROM del_commentaire WHERE ce_observation IN (%s) AND nom_sel IS NOT NULL',implode(',', $this->obsIds)));// !! attention la requete est reexecuté$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)));$votes = array(); // map ce_proposition -> score// calcul des votes// un vote identifié a un facteur de 3foreach($resultatsVotes as $vote) {if(!isset($votes[$vote['ce_proposition']])) {$votes[$vote['ce_proposition']] = 0;}$valeur = ($vote['valeur'] == 1) ? 1 : -1;$votes[$vote['ce_proposition']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;}// calcul des propositions$propositions = array();foreach($resultatsPropositions as $proposition) {$id_proposition = $proposition['id_commentaire'];$id_obs = $proposition['ce_observation'];// une proposition sans vote a un score de -1if(isset($votes[$id_proposition])) {$score = $votes[$id_proposition];} else {$score = -1;}// on garde la proposition avec le plus grand score$proposition['valeur'] = $score;if(!isset($propositions[$id_obs])) {$propositions[$id_obs] = $proposition;} else {$score_ancienne_proposition = $propositions[$id_obs]['valeur'];$propositions[$id_obs] = ($score >= $score_ancienne_proposition) ? $proposition : $propositions[$id_obs];}}foreach ($images as $id => $image) {if ($this->doitRemplacerObservationParProposition($propositions, $image)) {$id_obs = $image['id_observation'];$images[$id]['determination.famille'] = $propositions[$id_obs]['famille'];$images[$id]['determination.ns'] = $propositions[$id_obs]['nom_sel'];$images[$id]['determination.nn'] = $propositions[$id_obs]['nom_sel_nn'];$images[$id]['determination.nt'] = $propositions[$id_obs]['nt'];}if(isset($images[$id]['determination.nn'])) {$images[$id]['url_fiche_eflore'] = sprintf($this->conteneur->getParametre('url_fiche_eflore'), $images[$id]['determination.nn']); // formaterUrlFicheEflore}}return $images;}private function doitRemplacerObservationParProposition($propositions, $image) {return ((isset($propositions[$image['id_observation']]) &&$propositions[$image['id_observation']] != null &&$propositions[$image['id_observation']]['nom_sel_nn'] != 0) &&($propositions[$image['id_observation']]['valeur'] > 0 ||$image['determination.nn'] == 0));}/*-------------------------------------------------------------------------------FORMATER ET METTRE EN FORME--------------------------------------------------------------------------------*//*** Formater les mots clés du cel en n'affichant que ceux faisant partie* d'une liste définie dans le fichier de configuration* @param $chaineMotCleCel la chaine de mots clés du cel* @return string la chaine filtrée* */private function formaterMotsClesCel($chaineMotCleCel) {return implode(',', array_intersect(explode(',', $this->conteneur->getParametre('mots_cles_cel_affiches')), // $tabMotsClesAffichesexplode(',', $chaineMotCleCel))); // $tabMotsClesCel}private function formaterLieu($image) {if(! $image['ce_zone_geo']) return '';$lieu = $image['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;}return $lieu . ' ('.$id_zone_geo.')';}}