Rev 705 | Blame | Last modification | View Log | RSS feed
<?php/*vim: set expandtab tabstop=4 shiftwidth=4: */// +------------------------------------------------------------------------------------------------------+// | PHP version 5.1.1 |// +------------------------------------------------------------------------------------------------------+// | Copyright (C) 2011 Tela Botanica (accueil@tela-botanica.org) |// +------------------------------------------------------------------------------------------------------+// | This file is part of DEL. |// | |// | DEL is free software; you can redistribute it and/or modify |// | it under the terms of the GNU General Public License as published by |// | the Free Software Foundation; either version 2 of the License, or |// | (at your option) any later version. |// | |// | DEL is distributed in the hope that it will be useful, |// | but WITHOUT ANY WARRANTY; without even the implied warranty of |// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |// | GNU General Public License for more details. |// | |// | You should have received a copy of the GNU General Public License |// | along with Del; if not, write to the Free Software |// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |// +------------------------------------------------------------------------------------------------------+// CVS : $Id: effi_cel.action.php,v 1.9 2007-11-06 10:54:03 jp_milcent Exp $/*** 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 à une observation** @package del* @subpackage images* @author Grégoire Duché <gregoire@tela-botanica.org>* @copyright Tela-Botanica 2000-2012* @version $Revision: 1.9 $ $Date: 2007-11-06 10:54:03 $// +------------------------------------------------------------------------------------------------------+*/// TODO : conteneur, n'étendra plus rien// Le contenu viendra du constructeurclass Images extends Commun {private $config;private $schemaBdd;private $depart = 0;private $limite = 10;private $total; // Le nombre total d'imagesprivate $masque = array(); //Enregistrer les paramètres du masqueprivate $imageIds = array();/*** 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 $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)* @param $parametres les paramètres situés après le ? dans l'url* */public function consulter($ressources, $parametres) {//TODO : enlever les appels par référence// Gestion des configuration du script// TODO : gérer les erreurs de config// voir les paramètres par défaut// vérifier les valeurs (voir try catch JP)// TODO : voir la classe Conteneur$this->config = Config::get('images');$this->schemaBdd = $this->config['schemaBdd'];$this->UrlNavigation = new Url($this->config['url_service']);$this->chargerParametres($parametres);// TODO : voir CEL ou CHORODEP eflore ou CARTOPOINT pour calc find rows$this->compterImages();// Lancement du service// TODO : changer le résultat par id => objetImage$liaisons = $this->chargerLiaisons();$images = $this->chargerImage($liaisons);//TODO : gérer un retour de chargervote plutot que référence$this->chargerVotes($images);// Mettre en forme le résultat et l'envoyer pour affichage$resultat = new ResultatService();$resultat->corps = array('entete' => $this->getEntete(), 'resultats' => $images);return $resultat;}/*-------------------------------------------------------------------------------CONFIGURATION DU SERVICE--------------------------------------------------------------------------------*//*** Gestion des paramètres de l'application pour stockage dans variable de classe* @param $parametres les paramètres tels que passés à la méthode consulter* */public function chargerParametres($parametres) {$this->parametres = $parametres;if (isset($this->parametres['navigation.depart'])) {$this->depart = $this->parametres['navigation.depart'];}if (isset($this->parametres['navigation.limite'])) {$this->limite = $this->parametres['navigation.limite'];}// TODO : voir méthode gérer Masque pour gérer les spécificités de chaque paramètreforeach ($parametres as $id => $parametre) {if (strpos($id, 'masque.') === 0) {$champ = substr($id, 7, strlen($id));$this->masque[$champ] = $parametre;}}}/*** Créer la chaine de limite de requête en fonction des paramètres donnés* */private function getLimite() {return ' LIMIT '.$this->depart.', '.$this->limite;}/*** Charger la clause WHERE en fonction des paramètres de masque* */private function chargerClauseWhere() {$where = array();// TODO : factoriser ci-dessousif (isset($this->masque['famille'])) {$where[] = " famille = ".$this->getBdd()->proteger($this->masque['famille']);}if (isset($this->masque['genre'])) {$where[] = " genre = ".$this->getBdd()->proteger($this->masque['genre']);}if (isset($this->masque['espece'])) {$where[] = " nom_sel = ".$this->getBdd()->proteger($this->masque['espece']);}if (isset($this->masque['ns'])) {$where[] = " nom_sel = ".$this->getBdd()->proteger($this->masque['ns']);}if (isset($this->masque['nn'])) {$where[] = " nom_sel_nn = ".$this->getBdd()->proteger($this->masque['nn']);}if (isset($this->masque['auteur'])) {$auteurId = $this->masque['auteur'];if (is_numeric($auteurId)) {$where[] = " ce_utilisateur = ".$this->masque['auteur'];} else {if (strpos($auteurId, '@') === false) {// TODO : bug sur nom/prenom// TODO : j'ai utilisé implode car ça évite de faire un rtrim à la fin// mais comme je ne peux pas protéger chaque valeur d'un tableau, ca alourdit le code.// quid ?// TODO : voir méthode pour protéger les valeurs d'un tableau (cel.php, services web du cel ...)$nomPrenom = explode(' ', $auteurId);foreach ($nomPrenom as &$valeur) {$valeur = $this->getBdd()->proteger($valeur);}$chaineNomPrenom = implode(', ', $nomPrenom);$where[] = '((nom IN ('.$chaineNomPrenom.')) OR (prenom IN ('.$chaineNomPrenom.')))';} else {$where[] = " courriel LIKE ".$this->getBdd()->proteger($this->masque['auteur'].'%')." ";}}}//TODO : gérer le format de la date ?// rechercher sur LIKE DATE % ?// TODO : recherche sur JOUR MOIS ou ANNEEif (isset($this->masque['date'])) {$where[] = " date_observation = ".$this->getBdd()->proteger($this->masque['date']);}if (isset($this->masque['commune'])) {$where[] = " zone_geo LIKE ".$this->getBdd()->proteger($this->masque['commune']);}if (isset($this->masque['departement'])) {$dept = $this->masque['departement'];if (is_numeric($dept)) {$where[] = " ce_zone_geo LIKE ".$this->getBdd()->proteger('INSEE-C:'.$this->masque['departement'].'%');} else {//TODO : que faire si le département n'est pas numérique ?// TODO : modifier le modèle pour intégrer les zones geos !}}if (isset($this->masque['tag'])) {$where[] = " mots_cles_texte LIKE ".$this->getBdd()->proteger($this->masque['tag']);}if (!empty($where)) {return ' WHERE '.implode('AND', $where);} else {return;}}/*** Compter le nombre total d'images dans la base pour affichage dans entete.* */private function compterImages() {// TODO : n'est pas la bonne requête// voir dans les services web eflore$requeteNbImages = 'SELECT COUNT(*) AS nb '.'FROM '.$this->schemaBdd.'.del_image ';$resultatNbImages = $this->getBdd()->recuperer($requeteNbImages);$this->total = $resultatNbImages['nb'];}/*-------------------------------------------------------------------------------CHARGEMENT DES IMAGES--------------------------------------------------------------------------------*//*** Chargement depuis la bdd de toutes les liaisons entre images et observations* */private function chargerLiaisons() {$requeteLiaisons = 'SELECT * '.'FROM '.$this->schemaBdd.'.del_obs_images doi '.'INNER JOIN del_image di '.'ON doi.ce_image = di.id_image '.'INNER JOIN del_observation dob '.'ON doi.ce_observation = dob.id_observation '.'INNER JOIN del_utilisateur du '.'ON du.id_utilisateur = doi.ce_utilisateur';$requeteLiaisons .= $this->chargerClauseWhere();$requeteLiaisons .= $this->getLimite();return $this->getBdd()->recupererTous($requeteLiaisons);}/*** Retourner un tableau d'images formaté en fonction des liaisons trouvées* @param $liaisons les liaisons de la table del_obs_images* */private function chargerImage($liaisons) {$images = array();foreach ($liaisons as $liaison) {$idImage = $liaison['ce_image'];// On enregistre l'ID de l'image pour n'effectuer qu'une seule requête par la suite$this->imageIds[] = $idImage;$images[] = array('id_image' => $idImage, 'date' => $liaison['date_prise_de_vue'], 'binaire.href' => $this->formaterLienImage($idImage),'hauteur' => $liaison['hauteur'], 'largeur' => $liaison['largeur'], 'votes' => array(), 'observation' => $this->formaterObservation($liaison));}return $images;}/*** Charger les votes pour chaque image* */private function chargerVotes(&$images) {if (sizeof($this->imageIds) > 0) {$chaineImageIds = implode(',', $this->imageIds);$requeteVotes = 'SELECT * FROM '.$this->schemaBdd.'.del_vote_image '.'WHERE ce_image IN ('.$chaineImageIds.')';$resultatsVotes = $this->getBdd()->recupererTous($requeteVotes);//TODO : faire une méthode formater vote$votes = array();foreach ($resultatsVotes as $vote) {$idImage = $vote['ce_image'];$id = $vote['id_vote_image'];$id_protocole = $vote['ce_protocole'];$auteur_id = $vote['ce_utilisateur'];$valeur = $vote['valeur_vote'];//TODO : ajouter la date au modèle//$date = $vote[''];$votes[$idImage]['valeur'] = $valeur;$votes[$idImage]['protocole'] = $id_protocole;$votes[$idImage]['auteur_id'] = $auteur_id;}foreach ($images as &$image) {if (isset($votes[$image['id_image']])) {$image['votes'] = $votes[$image['id_image']];}}}}/*-------------------------------------------------------------------------------FORMATER ET METTRE EN FORME--------------------------------------------------------------------------------*//*** Formater une observation depuis une ligne liaison* @param $liaison liaison issue de la recherche* */private function formaterObservation($liaison) {$observation = array();// TODO : faire un tableau de correspondance clé-valeur$observation['id_observation'] = $liaison['id_observation'];$observation['date_observation'] = $liaison['date_observation'];$observation['date_transmission'] = $liaison['date_transmission'];$observation['determination.famille'] = $liaison['famille'];$observation['determination.ns'] = $liaison['nom_sel'];$observation['determination.nn'] = $liaison['nom_sel_nn'];$observation['determination.nt'] = $liaison['nt'];$observation['id_zone_geo'] = $liaison['ce_zone_geo'];$observation['zone_geo'] = $liaison['zone_geo'];$observation['lieudit'] = $liaison['lieudit'];$observation['station'] = $liaison['station'];$observation['milieu'] = $liaison['milieu'];$observation['auteur.id'] = $liaison['ce_utilisateur'];$observation['auteur.nom'] = $liaison['nom'];$observation['auteur.prenom'] = $liaison['prenom'];return $observation;}/*** Créer l'entête en fonction des paramètres donnés* */private function getEntete() {$entete = array();$entete['masque'] = $this->recupererMasque();$entete['depart'] = $this->depart;$entete['limite'] = $this->limite;$entete['total'] = $this->total;$lienPrecedent = $this->recupererHrefPrecedent();if ($lienPrecedent != null) {$entete['entete.precedent'] = $lienPrecedent;}$lienSuivant = $this->recupererHrefSuivant();if ($lienSuivant) {$entete['entete.suivant'] = $lienSuivant;}return $entete;}/*** Récupérer le lien pour afficher les images précédentes en fonction des paramètres* */private function recupererHrefPrecedent() {$departActuel = $this->depart;$limite = $this->limite;$departSuivant = $departActuel - $limite;$url = null;if ($departActuel > 0) {$parametres = array();$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);}return $url;}/*** Récupérer le lien pour afficher les images suivantes en fonction des paramètres* */private function recupererHrefSuivant() {$departActuel = $this->depart;$limite = $this->limite;$departSuivant = $departActuel + $limite;$url = null;if ($departSuivant < $this->total) {$parametres = array();$url = $this->obtenirUrlNavigation($departSuivant, $limite, $parametres);}return $url;}/*** Récupérer l'url de navigation en concaténant d'éventuels paramètres* @param $depart l'entier de départ de la recherche* @param $limite le nombre de résultats à retourner* @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels* */private function obtenirUrlNavigation($depart, $limite, $parametresAdditionnels) {$parametres = array('navigation.depart' => $depart, 'navigation.limite' => $limite);if ($parametresAdditionnels != null) {$parametres = array_merge($parametres, $parametresAdditionnels);}$this->UrlNavigation->setRequete($parametres);$url = $this->UrlNavigation->getURL();return $url;}/*** 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->config['url_images'];$urlImage = str_replace('%s', $idImage, $url);return $urlImage;}/*** Récupérer le masque depuis les paramètres* */private function recupererMasque() {$masqueEntete = '';foreach ($this->parametres as $param => $cle) {if ($param == 'masque') {$masqueEntete = 'masque='.$cle.',';} elseif (substr($param, 0, 7) == 'masque.') {$masqueEntete .= substr($param, 7).'='.$cle.',';}}$masqueEntete = rtrim($masqueEntete,',');return $masqueEntete;}}?>