Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 1617 → Rev 1618

/trunk/services/modules/0.1/observations/ListeObservations.php
53,35 → 53,35
 
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
$this->conteneur->chargerConfiguration('config_observations.ini');
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_departements_bruts.ini');
$this->conteneur->chargerConfiguration('config_observations.ini');
$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
$this->conteneur->chargerConfiguration('config_mapping_commentaires.ini');
$this->navigation = $conteneur->getNavigation();
$this->masque = $conteneur->getMasque();
$this->gestionBdd = $conteneur->getGestionBdd();
$this->bdd = $this->gestionBdd->getBdd();
}
 
static function reformateObservation($obs, $url_pattern = '') {
$obs = array_map('array_filter', $obs);
$obs_merged = array();
foreach($obs as $o) {
$id = $o['id_observation'];
 
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
if(!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
if(!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
 
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
if(!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
$obs_merged['"' . $id . '"']['images'][] = $image;
}
return $obs_merged;
$obs = array_map('array_filter', $obs);
$obs_merged = array();
foreach($obs as $o) {
$id = $o['id_observation'];
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
if(!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
if(!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
if(!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
$obs_merged['"' . $id . '"']['images'][] = $image;
}
return $obs_merged;
}
 
/**
92,73 → 92,73
* @param array $parametres les paramètres situés après le ? dans l'url
**/
public function consulter($ressources, $parametres) {
// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
 
// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
// toutes les images, mais nous voulons $limite observations uniques.
$req['groupby'][] = 'vdi.id_observation';
 
$db = $this->bdd;
 
// filtrage de l'INPUT
$params = DelTk::requestFilterParams($parametres, DelTk::$parametres_autorises, $this->conteneur);
 
$params['masque.tag'] = DelTk::buildTagsAST(@$parametres['masque.tag'], 'OR', ',');
 
// ... et paramètres par défaut
$params = array_merge(DelTk::$default_params, $params);
 
// création des contraintes (masques)
DelTk::sqlAddConstraint($params, $db, $req);
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
 
// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
$idobs_tab = self::getIdObs($params, $req, $db);
// idobs est une liste (toujours ordonnée) des id d'observations recherchées
$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
 
if($idobs) {
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
 
// 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 = self::getInfos($idobs, $db);
 
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
 
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
// modifie $observations
$this->configurer();
$this->chargerDeterminations($observations);
 
// 5) restauration de l'ordre souhaité initialement
$observations = self::sortArrayByArray($observations, $idobs);
} else {
$observations = array();
$total = 0;
}
 
// 6) JSON output
$resultat = new ResultatService();
$resultat->corps = array('entete' => DelTk::makeJSONHeader($total, $params, Config::get('url_service')),
'resultats' => $observations);
return $resultat;
// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
// toutes les images, mais nous voulons $limite observations uniques.
$req['groupby'][] = 'vdi.id_observation';
$db = $this->bdd;
// filtrage de l'INPUT
$params = DelTk::requestFilterParams($parametres, DelTk::$parametres_autorises, $this->conteneur);
$params['masque.tag'] = DelTk::buildTagsAST(@$parametres['masque.tag'], 'OR', ',');
// ... et paramètres par défaut
$params = array_merge(DelTk::$default_params, $params);
// création des contraintes (masques)
DelTk::sqlAddConstraint($params, $db, $req);
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
$idobs_tab = self::getIdObs($params, $req, $db);
// idobs est une liste (toujours ordonnée) des id d'observations recherchées
$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
if($idobs) {
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
// 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 = self::getInfos($idobs, $db);
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
// modifie $observations
$this->configurer();
$this->chargerDeterminations($observations);
// 5) restauration de l'ordre souhaité initialement
$observations = self::sortArrayByArray($observations, $idobs);
} else {
$observations = array();
$total = 0;
}
// 6) JSON output
$resultat = new ResultatService();
$resultat->corps = array('entete' => DelTk::makeJSONHeader($total, $params, Config::get('url_service')),
'resultats' => $observations);
return $resultat;
}
 
static function sortArrayByArray($array, $orderArray) {
$ordered = array();
foreach($orderArray as $key) {
if(array_key_exists('"' . $key . '"', $array)) {
$ordered['"' . $key . '"'] = $array['"' . $key . '"'];
unset($array['"' . $key . '"']);
}
}
return $ordered + $array;
$ordered = array();
foreach($orderArray as $key) {
if(array_key_exists('"' . $key . '"', $array)) {
$ordered['"' . $key . '"'] = $array['"' . $key . '"'];
unset($array['"' . $key . '"']);
}
}
return $ordered + $array;
}
 
// SQL helpers