Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1880 → Rev 1881

/trunk/services/modules/0.1/observations/ListeObservationsWidget.php
File deleted
\ No newline at end of file
/trunk/services/modules/0.1/observations/ListeObservations.php
25,10 → 25,15
private $navigation;
private $filtrage;
private $sql;
 
private $mappings = array();
private $paramsFiltres = array();
 
private $idsObsOrdonnees = array();
private $infosObs = array();
private $infosObsOrdonnee = array();
 
 
public function __construct(Conteneur $conteneur) {
$this->conteneur = $conteneur;
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
50,32 → 55,28
$this->sql->ajouterConstrainteAppliObs();
$this->sql->definirOrdreSqlAppliObs();
 
$idObs = $this->getIdObs();
$this->idsObsOrdonnees = $this->getIdObs();
$this->navigation->setTotal($this->sql->getTotalLignesTrouvees());
 
// Ce n'est pas la peine de continuer s'il n'y a pas eu de résultats
$resultat = new ResultatService();
$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => array());
if (count($idObs) > 0) {
if (count($this->idsObsOrdonnees) > 0) {
 
// 2) récupération des données nécessaires pour ces observations (obs + images)
// ici les champs récupérés sont issus de self::$sql_fields_liaisons mais sans préfixes
// car tout provient de v_del_image
$obs_unfmt = $this->getInfos($idObs);
$this->infosObs = $this->getInfosObs();
 
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
$observations = $this->formaterObservations($obs_unfmt);
$this->infosObsOrdonnees = $this->formaterObservations();
 
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
// modifie $observations
$this->chargerDeterminations($observations, $idObs);
// 4) Ajouter commentaires + votes à $this->infosObsOrdonnees
$this->chargerDeterminations();
 
// 5) restauration de l'ordre souhaité initialement
$observations = $this->ordonnerObservations($observations, $idObs);
 
$resultat->corps = array(
'entete' => $this->navigation->getEntete(),
'resultats' => $observations);
//'resultats' => array_values($this->infosObsOrdonnees));
// TODO : renvoyer un vrai tableau et non un objet
'resultats' => $this->infosObsOrdonnees);
}
return $resultat;
}
114,8 → 115,8
* Après avoir récupérer seulement les ids dans une première requête, nous récupérons maintenant les infos.
* Le web service est ainsi 3 fois plus rapide.
*/
private function getInfos($idObs) {
$idsObsConcat = implode(',', $idObs);
private function getInfosObs() {
$idsObsConcat = implode(',', $this->idsObsOrdonnees);
$requete = "SELECT id_observation, nom_sel AS `determination.ns`, nt AS `determination.nt`, ".
'nom_sel_nn AS `determination.nn`, famille AS `determination.famille`, '.
'nom_referentiel AS `determination.referentiel`, ce_zone_geo AS id_zone_geo, '.
136,17 → 137,16
* il nous faut maintenant récupérer qu'une seule fois les données d'observations et y intégrer les données
* des images.
*/
private function formaterObservations($observations) {
$observations = array_map('array_filter', $observations);
$obsFormatees = array();
private function formaterObservations() {
$observations = array_map('array_filter', $this->infosObs);
$obsFormatees = array_flip($this->idsObsOrdonnees);// Permet de garder l'ordre de sortie !
foreach ($observations as $obs) {
$this->nettoyerAuteur($obs);
 
$id = $obs['id_observation'];
$obsFormatees[$id] = $obs;
 
$image = $this->extraireInfosImage($obs);
 
$id = 'idx-'.$obs['id_observation'];
if (!isset($obsFormatees[$id])) {
$obsFormatees[$id] = $obs;
}
$obsFormatees[$id]['images'][] = $image;
}
return $obsFormatees;
173,23 → 173,12
return $image;
}
 
private function ordonnerObservations($observations, $ordreDesObs) {
$obsOrdonnees = array();
foreach ($ordreDesObs as $id) {
if (array_key_exists("idx-$id", $observations)) {
$obsOrdonnees["idx-$id"] = $observations["idx-$id"];
unset($observations["idx-$id"]);
}
}
return $obsOrdonnees + $observations;
}
 
/**
* Récupérer toutes les déterminations et le nombre de commentaire au total
* @param array $observations la liste des observations à mettre à jour
*/
private function chargerDeterminations(&$observations, $idObs) {
$idObsConcat = implode(',', $idObs);
private function chargerDeterminations() {
$idObsConcat = implode(',', $this->idsObsOrdonnees);
$requete = 'SELECT * '.
'FROM del_commentaire AS dc '.
'WHERE dc.nom_sel IS NOT NULL '.
203,7 → 192,7
$idComment = $proposition['id_commentaire'];
$comment = $this->formaterDetermination($idComment, $proposition);
if ($comment) {
$observations["idx-$idObs"]['commentaires'][$idComment] = $comment;
$this->infosObsOrdonnees[$idObs]['commentaires'][$idComment] = $comment;
}
}
}
/trunk/services/modules/0.1/observations/ObservationDetails.php
43,7 → 43,6
$this->idObs = $ressources[0];
$this->protocole = isset($parametres['protocole']) && is_numeric($parametres['protocole']) ? intval($parametres['protocole']) : null;
 
// 1) récupération de l'observation (et de ses images (v_del_image est une vue utilisant des INNER JOIN))
$infos = $this->getInfosObservationEtImages();
if (! $infos) {
$message = "Aucune observation ne possède d'identifiant '{$this->idObs}'.";
50,8 → 49,9
throw new Exception($message, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
}
$this->formaterObservation($infos);
//var_dump($this->observation);
 
// 3) charge les données de votes et protocoles associés aux images
 
if ($this->observation['images']) {
$idsImages = array_keys($this->observation['images']);
$votes = $this->sql->getVotesDesImages($idsImages, $this->protocole);
76,40 → 76,36
}
 
private function getInfosObservationEtImages() {
$obsChamps = $this->sql->getAliasDesChamps($this->mappings['observations'], null, 'dob');
$imgChamps = $this->sql->getAliasDesChamps($this->mappings['images'], null, 'dob');
$obsChamps = $this->sql->getAliasDesChamps($this->mappings['observations'], null, 'do');
$imgChamps = $this->sql->getAliasDesChamps($this->mappings['images'], null, 'di');
 
// champs de l'annuaire (del_utilisateur): id_utilisateur prenom, nom, courriel
$annuaireChamps = implode(', ', array(
"IFNULL(du.prenom, prenom_utilisateur) AS `auteur.prenom`",
"IFNULL(du.nom, nom_utilisateur) AS `auteur.nom`",
"IFNULL(du.courriel, courriel_utilisateur) AS `auteur.courriel`"));
"IFNULL(du.prenom, do.prenom_utilisateur) AS `auteur.prenom`",
"IFNULL(du.nom, do.nom_utilisateur) AS `auteur.nom`",
"IFNULL(du.courriel, do.courriel_utilisateur) AS `auteur.courriel`"));
 
$requete = "SELECT $obsChamps, $imgChamps, $annuaireChamps ".
"FROM v_del_image as dob ".
"LEFT JOIN del_utilisateur AS du ".
" ON CAST(du.id_utilisateur AS CHAR) = CAST(dob.ce_utilisateur AS CHAR) ".
"WHERE dob.id_observation = {$this->idObs} ".
"FROM del_observation AS do ".
" LEFT JOIN del_image AS di ON (do.id_observation = di.ce_observation) ".
" LEFT JOIN del_utilisateur AS du ON (do.ce_utilisateur = du.id_utilisateur) ".
"WHERE do.id_observation = {$this->idObs} ".
'-- '.__FILE__.':'.__LINE__;
//var_dump($requete);
return $this->bdd->recupererTous($requete);
//Debug::printr($requete);
return $this->bdd->recuperer($requete);
}
 
private function formaterObservation($infos) {
$infos = array_filter($infos);
 
$image = array_intersect_key($infos, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$urlImgTpl = $this->conteneur->getParametre('cel_img_url_tpl');
$imageFormat = 'XL';
$image['binaire.href'] = sprintf($urlImgTpl, $image['id_image'], $imageFormat);
unset($infos['id_image'], $infos['date'], $infos['hauteur'], $infos['largeur'], $infos['nom_original']);
 
$infos = array_map('array_filter', $infos);
foreach ($infos as $info) {
$image = array_intersect_key($info, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($urlImgTpl, $image['id_image'], $imageFormat);
unset($info['id_image'], $info['date'], $info['hauteur'], $info['largeur'], $info['nom_original']);
 
if (!isset($this->observation)) {
$this->observation = $info;
}
$this->observation['images'][$image['id_image']] = $image;
}
$this->observation = $infos;
$this->observation['images'][$image['id_image']] = $image;
}
 
private function getCommentaires() {
164,7 → 160,7
}
 
private function nettoyerAuteur() {
if (!is_numeric($this->observation['auteur.id'])) {
if (!isset($this->observation['auteur.id']) || !is_numeric($this->observation['auteur.id'])) {
$this->observation['auteur.id'] = '0';
}
if (!isset($this->observation['auteur.nom'])) {