Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 701 → Rev 702

/trunk/services/modules/0.1/del/Images.php
1,6 → 1,4
<?php
// VOIR IMAGE RECREATION L 294
 
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.1.1 |
25,54 → 23,63
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: effi_cel.action.php,v 1.9 2007-11-06 10:54:03 jp_milcent Exp $
/**
* Gestion des des images dans la base de donnée de Détermination en Ligne (DEL)
*
*
*@package del
*@subpackage images
//Auteur original :
*@author Grégoire Duché <gregoire@tela-botanica.org>
*@copyright Tela-Botanica 2000-2012
*@version $Revision: 1.9 $ $Date: 2007-11-06 10:54:03 $
* 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 $
// +------------------------------------------------------------------------------------------------------+
*/
class Images extends Commun {
//Paramètres
private $config;
private $schemaBdd;
private $depart = 0;
private $limite = 1;
private $format = 'json';
private $total;
private $idImage;
private $config;
private $limite = 10;
private $total; // Le nombre total d'images
private $masque = array(); //Enregistrer les paramètres du masque
private $auteurIds = array(); // La liste des identifiants des auteurs pour retrouver leur nom dans la base
private $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) {
// Gestion des configuration du script
// TODO : gérer les erreurs de config
// 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);
$this->compterImages();
$this->UrlNavigation = new Url($this->config['url_service']);
// Lancement du service
$liaisons = $this->chargerLiaisons();
$images = $this->chargerImage($liaisons);
$this->chargerAuteurs($images);
$this->chargerVotes($images);
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$this->compterImages();
$entete = $this->getEntete();
$resultats = $this->chargerImages($this->idImage);
$this->formaterImages($resultats);
$this->chargerObservations($resultats);
$this->chargerVotes($resultats);
$resultat->corps = array('entete' => $entete, 'resultats' => $resultats);
$resultat->corps = array('entete' => $this->getEntete(), 'resultats' => $images);
return $resultat;
}
/*-------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
--------------------------------------------------------------------------------*/
/**
* Récupérer l'id de l'image depuis les paramètres
* 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;
85,11 → 92,73
$this->limite = $this->parametres['navigation.limite'];
}
if (isset($this->parametres['masque.id'])) {
$idImage = $this->parametres['masque.id'];
$this->idImage = $idImage;
foreach ($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();
if (isset($this->masque['famille'])) {
$where[] = " famille = '".$this->masque['famille']."' ";
}
if (isset($this->masque['genre'])) {
$where[] = " genre = '".$this->masque['genre']."' ";
}
if (isset($this->masque['espece'])) {
$where[] = " nom_sel = '".$this->masque['espece']."' ";
}
if (isset($this->masque['ns'])) {
$where[] = " nom_sel_nn = '".$this->masque['ns']."' ";
}
// TODO : voir la définition du webservice et la gestion nn et ns
/*if (isset($this->masque['nn'])) {
$where[] = " nn = '".$this->masque['nn']."' ";
}*/
// TODO : voir la liaision avec auteur : sur id ?
if (isset($this->masque['auteur'])) {
$where[] = " ce_utilisateur = '".$this->masque['auteur']."' ";
}
// TODO : date de quoi ?
/*if (isset($this->masque['date'])) {
$where[] = " date = '".$this->masque['date']."' ";
}*/
//TODO : ???
/*if (isset($this->masque['commune'])) {
$where[] = " commune = '".$this->masque['commune']."' ";
}*/
//TODO : ???
/*if (isset($this->masque['departement'])) {
$where[] = " departement = '".$this->masque['departement']."' ";
}*/
if (isset($this->masque['tag'])) {
$where[] = " mots_cles_texte = '".$this->masque['tag']."' ";
}
return 'WHERE '.implode('AND', $where);
}
/**
96,14 → 165,147
* Compter le nombre total d'images dans la base pour affichage dans entete.
* */
private function compterImages() {
//TODO : gérer le nom de la base par fichier de config
//TODO : gérer les erreurs de connexion à la bdd
$requeteNbImages = 'SELECT COUNT(*) AS nb FROM del.del_image ';
$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 ';
$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'auteur pour n'effectuer qu'une seule requête par la suite
$this->auteursIds[$liaison['ce_utilisateur']] = true;
// 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;
}
/**
* Récupère les auteurs utilisés dans la sous-liste, effectue une requête, et met à jour
* les résultats
* @param $images le tableau d'images récupéré et mis en forme
* */
private function chargerAuteurs(&$images) {
if (sizeof($this->auteursIds) > 0) {
$auteursIds = array_keys($this->auteursIds);
$chaineAuteursIds = implode(',', $auteursIds);
$requeteAuteurs = 'SELECT * FROM '.$this->schemaBdd.'.del_utilisateur '.
'WHERE id_utilisateur IN ('.$chaineAuteursIds.')';
$resultatAuteurs = $this->getBdd()->recupererTous($requeteAuteurs);
$auteurs = array();
foreach ($resultatAuteurs as $auteur) {
$id = $auteur['id_utilisateur'];
$auteurs[$id]['nom'] = $auteur['nom'];
$auteurs[$id]['prenom'] = $auteur['prenom'];
}
foreach ($images as &$image) {
$idAuteur = $image['observation']['auteur.id'];
$image['observation']['auteur.nom'] = $auteurs["$idAuteur"]['nom'];
$image['observation']['auteur.prenom'] = $auteurs["$idAuteur"]['prenom'];
}
}
}
/**
* 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);
$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 : voir la définition du webservice ! La date n'est pas présent dans la base
//$date = $vote[''];
//TODO : voir la définition du webservice : ne devrait pas être "valeur" ?
$votes[$idImage]['vote'] = $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();
$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'];
//$this->chargerAuteur($observation);
return $observation;
}
/**
* Créer l'entête en fonction des paramètres donnés
* */
private function getEntete() {
134,16 → 336,17
$departSuivant = $departActuel - $limite;
$url = null;
if ($departSuivant > 0) {
if ($departActuel > 0) {
$parametres = array();
if ($this->idImage != null) {
$parametres['masque.id'] = $this->idImage;
}
$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;
152,18 → 355,19
$url = null;
if ($departSuivant < $this->total) {
$parametres = array();
if ($this->idImage != null) {
$parametres['masque.id'] = $this->idImage;
}
$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);
$parametres = array('navigation.depart' => $depart, 'navigation.limite' => $limite);
if ($parametresAdditionnels != null) {
$parametres = array_merge($parametres, $parametresAdditionnels);
173,93 → 377,7
return $url;
}
/**
* Chargement depuis la bdd d'une ou plusieurs images
* */
private function chargerImages($imageId = null) {
//TODO : gérer le nom de la base par fichier de config
$requeteImages = 'SELECT * FROM del.del_image';
if ($imageId != null) {
$requeteImages .= ' WHERE id_image = '.$this->getBdd()->proteger($imageId);
}
$requeteImages .= $this->getLimite();
return $this->getBdd()->recupererTous($requeteImages);
}
/**
* 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 les observations pour chaque image
* */
private function chargerObservations(&$images) {
$i = 0;
foreach ($images as $image) {
$idImage = $image['id_image'];
$requeteLiaison = 'SELECT ce_observation as idObs '.
'FROM del.del_obs_images WHERE ce_image = '.$this->getBdd()->proteger($idImage);
$resultatLiaison = $this->getBdd()->recupererTous($requeteLiaison);
$observations = array();
foreach ($resultatLiaison as $liaison) {
$idObs = $liaison['idObs'];
$requeteObservation = 'SELECT * FROM del.del_observation '.
'WHERE id_observation = '.$this->getBdd()->proteger($idObs);
$resultatObservation = $this->getBdd()->recuperer($requeteObservation);
$observations[] = $this->formaterObservation($resultatObservation);
}
$images[$i]['observations'] = $observations;
$i++;
}
}
/**
* Charger les votes pour chaque image
* */
private function chargerVotes(&$images) {
$i = 0;
foreach ($images as $image) {
$idImage = $image['id_image'];
$requeteVotes = 'SELECT * FROM del.del_vote_image WHERE ce_image = '.$this->getBdd()->proteger($idImage);
$votes = $this->getBdd()->recupererTous($requeteVotes);
$images[$i]['votes'] = $votes;
$i++;
}
}
/**
* Formater les résultats des images de la requête pour retour
* */
private function formaterImages(&$resultats) {
$images = array();
foreach ($resultats as $ligne) {
$image = array();
$image['id_image'] = $ligne['id_image'];
$image['date'] = $ligne['date_prise_de_vue'];
// TODO : gérer le lien vers tela à partir de l'identifiant
$image['binaire.href'] = $this->formaterLienImage($ligne['id_image']);
$image['hauteur'] = $ligne['hauteur'];
$image['largeur'] = $ligne['largeur'];
// Votes et observations sont mis à jour plus a posteriori dans l'application
$image['votes'] = array();
$image['observations'] = array();
$images[] = $image;
}
$resultats = $images;
}
/**
* Formater le lien de l'image en fonction du fichier de config et de l'identifiant de l'image
* */
private function formaterLienImage($idImage) {
268,40 → 386,6
$urlImage = str_replace('%s', $idImage, $url);
return $urlImage;
}
/**
* Formater les résultats de la requête observation pour retour
* */
private function formaterObservation(&$observation) {
$retour = array();
$retour['id_observation'] = $observation['id_observation'];
$retour['date_observation'] = $observation['date_observation'];
$retour['date_transmission'] = $observation['date_transmission'];
$retour['determination.famille'] = $observation['famille'];
$retour['determination.ns'] = $observation['nom_sel'];
$retour['determination.nn'] = $observation['nom_sel_nn'];
$retour['determination.nt'] = $observation['nt'];
$retour['id_zone_geo'] = $observation['ce_zone_geo'];
$retour['zone_geo'] = $observation['zone_geo'];
$retour['lieudit'] = $observation['lieudit'];
$retour['station'] = $observation['station'];
$retour['milieu'] = $observation['milieu'];
$retour['auteur.id'] = $observation['ce_utilisateur'];
$this->chargerAuteur($retour);
return $retour;
}
/**
* Récupérer le nom et prénom de l'auteur dans la table utilisateurs
* */
private function chargerAuteur(&$retour) {
$idAuteur = $retour['auteur.id'];
$requeteAuteur = 'SELECT * FROM del.del_utilisateur WHERE id_utilisateur = '.$this->getBdd()->proteger($idAuteur);
$resultatAuteur = $this->getBdd()->recuperer($requeteAuteur);
$retour['auteur.nom'] = $resultatAuteur['nom'];
$retour['auteur.prenom'] = $resultatAuteur['prenom'];
}
 
/**
* Récupérer le masque depuis les paramètres