Line 42... |
Line 42... |
42 |
'nom_sel_nn AS `determination.nn`', 'famille AS `determination.famille`',
|
42 |
'nom_sel_nn AS `determination.nn`', 'famille AS `determination.famille`',
|
43 |
'nom_referentiel AS `determination.referentiel`',
|
43 |
'nom_referentiel AS `determination.referentiel`',
|
44 |
'ce_zone_geo AS id_zone_geo', 'zone_geo', 'lieudit',
|
44 |
'ce_zone_geo AS id_zone_geo', 'zone_geo', 'lieudit',
|
45 |
'station', 'milieu', 'date_observation', 'mots_cles_texte', 'date_transmission',
|
45 |
'station', 'milieu', 'date_observation', 'mots_cles_texte', 'date_transmission',
|
46 |
'ce_utilisateur AS `auteur.id`', 'prenom_utilisateur AS `auteur.prenom`',
|
46 |
'ce_utilisateur AS `auteur.id`', 'prenom_utilisateur AS `auteur.prenom`',
|
47 |
'nom_utilisateur AS `auteur.nom`', 'courriel_utilisateur AS observateur',
|
47 |
'nom_utilisateur AS `auteur.nom`', 'courriel_utilisateur AS `auteur.courriel` ',
|
48 |
'commentaire'),
|
48 |
'commentaire'),
|
49 |
'di' => array('id_image', 'date_prise_de_vue AS `date`', 'hauteur',/* 'largeur','nom_original' // apparemment inutilisés */),
|
49 |
'di' => array('id_image', 'date_prise_de_vue AS `date`', 'hauteur',/* 'largeur','nom_original' // apparemment inutilisés */),
|
50 |
'du' => array('prenom', 'nom', 'courriel'),
|
50 |
'du' => array('prenom', 'nom', 'courriel'),
|
51 |
'dc' => array('commentaire')
|
51 |
'dc' => array('commentaire')
|
52 |
);
|
52 |
);
|
Line 67... |
Line 67... |
67 |
static function reformateObservation($obs, $url_pattern = '') {
|
67 |
static function reformateObservation($obs, $url_pattern = '') {
|
68 |
$obs = array_map('array_filter', $obs);
|
68 |
$obs = array_map('array_filter', $obs);
|
69 |
$obs_merged = array();
|
69 |
$obs_merged = array();
|
70 |
foreach($obs as $o) {
|
70 |
foreach($obs as $o) {
|
71 |
$id = $o['id_observation'];
|
71 |
$id = $o['id_observation'];
|
72 |
|
72 |
|
73 |
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
|
73 |
// car auteur.id peut être un email, un hash, ou un annuaire_tela.U_ID
|
74 |
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
|
74 |
// mais dans les deux premiers cas SELECT courriel AS observateur fait déjà l'affaire
|
75 |
if(!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
|
75 |
if(!isset($o['auteur.id']) || !is_numeric($o['auteur.id'])) $o['auteur.id'] = "0";
|
76 |
if(!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
|
76 |
if(!isset($o['auteur.nom'])) $o['auteur.nom'] = '[inconnu]';
|
77 |
|
77 |
|
78 |
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
|
78 |
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
|
79 |
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
|
79 |
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
|
80 |
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
|
80 |
unset($o['id_image'], $o['date'], $o['hauteur'], $o['largeur'], $o['nom_original']);
|
81 |
if(!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
|
81 |
if(!isset($obs_merged['"' . $id . '"'])) $obs_merged['"' . $id . '"'] = $o;
|
82 |
$obs_merged['"' . $id . '"']['images'][] = $image;
|
82 |
$obs_merged['"' . $id . '"']['images'][] = $image;
|
Line 88... |
Line 88... |
88 |
* Méthode principale de la classe.
|
88 |
* Méthode principale de la classe.
|
89 |
* Lance la récupération des images dans la base et les place dans un objet ResultatService
|
89 |
* Lance la récupération des images dans la base et les place dans un objet ResultatService
|
90 |
* pour l'afficher.
|
90 |
* pour l'afficher.
|
91 |
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
|
91 |
* @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
|
92 |
* @param array $parametres les paramètres situés après le ? dans l'url
|
92 |
* @param array $parametres les paramètres situés après le ? dans l'url
|
93 |
**/
|
93 |
**/
|
94 |
public function consulter($ressources, $parametres) {
|
94 |
public function consulter($ressources, $parametres) {
|
95 |
// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
|
95 |
// SELECT, à terme, pourrait affecter getInfos(), mais en aucune manière getIdObs()
|
96 |
$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
|
96 |
$req = array('select' => array(), 'join' => array(), 'where' => array(), 'groupby' => array(), 'having' => array());
|
97 |
|
97 |
|
98 |
// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
|
98 |
// toujours nécessaire puisque nous tapons sur v_del_image qui INNER JOIN cel_images, or nous voulons certes
|
99 |
// toutes les images, mais nous voulons $limite observations uniques.
|
99 |
// toutes les images, mais nous voulons $limite observations uniques.
|
100 |
$req['groupby'][] = 'vdi.id_observation';
|
100 |
$req['groupby'][] = 'vdi.id_observation';
|
101 |
|
101 |
|
102 |
$db = $this->bdd;
|
102 |
$db = $this->bdd;
|
103 |
|
103 |
|
104 |
// filtrage de l'INPUT
|
104 |
// filtrage de l'INPUT
|
105 |
$params = DelTk::requestFilterParams($parametres, DelTk::$parametres_autorises, $this->conteneur);
|
105 |
$params = DelTk::requestFilterParams($parametres, DelTk::$parametres_autorises, $this->conteneur);
|
106 |
|
106 |
|
107 |
$params['masque.tag'] = DelTk::buildTagsAST(@$parametres['masque.tag'], 'OR', ',');
|
107 |
$params['masque.tag'] = DelTk::buildTagsAST(@$parametres['masque.tag'], 'OR', ',');
|
108 |
|
108 |
|
109 |
// ... et paramètres par défaut
|
109 |
// ... et paramètres par défaut
|
110 |
$params = array_merge(DelTk::$default_params, $params);
|
110 |
$params = array_merge(DelTk::$default_params, $params);
|
111 |
|
111 |
|
112 |
// création des contraintes (masques)
|
112 |
// création des contraintes (masques)
|
113 |
DelTk::sqlAddConstraint($params, $db, $req);
|
113 |
DelTk::sqlAddConstraint($params, $db, $req);
|
114 |
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
|
114 |
self::sqlAddConstraint($params, $db, $req, $this->conteneur);
|
115 |
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
|
115 |
self::sqlAddMasqueConstraint($params, $db, $req, $this->conteneur);
|
116 |
|
116 |
|
117 |
// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
|
117 |
// 1) grunt-work: *la* requête de récupération des id valides (+ SQL_CALC_FOUND_ROWS)
|
118 |
$idobs_tab = self::getIdObs($params, $req, $db);
|
118 |
$idobs_tab = self::getIdObs($params, $req, $db);
|
119 |
// idobs est une liste (toujours ordonnée) des id d'observations recherchées
|
119 |
// idobs est une liste (toujours ordonnée) des id d'observations recherchées
|
120 |
$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
|
120 |
$idobs = array_values(array_map(create_function('$a', 'return $a["id_observation"];'), $idobs_tab));
|
121 |
|
121 |
|
122 |
if($idobs) {
|
122 |
if($idobs) {
|
123 |
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
|
123 |
$total = $db->recuperer('SELECT FOUND_ROWS() AS c'); $total = intval($total['c']);
|
124 |
|
124 |
|
125 |
// 2) récupération des données nécessaires pour ces observations (obs + images)
|
125 |
// 2) récupération des données nécessaires pour ces observations (obs + images)
|
126 |
// ici les champs récupérés sont issus de self::$sql_fields_liaisons mais sans préfixes
|
126 |
// ici les champs récupérés sont issus de self::$sql_fields_liaisons mais sans préfixes
|
127 |
// car tout provient de v_del_image
|
127 |
// car tout provient de v_del_image
|
128 |
$obs_unfmt = self::getInfos($idobs, $db);
|
128 |
$obs_unfmt = self::getInfos($idobs, $db);
|
129 |
|
129 |
|
130 |
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
|
130 |
// 3) suppression, merge des données en tableau assez représentatif du futur JSON en output
|
131 |
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
|
131 |
$observations = self::reformateObservation($obs_unfmt, $this->conteneur->getParametre('url_images'));
|
132 |
|
132 |
|
133 |
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
|
133 |
// 4) récupération des données nécessaires pour ces observations (commentaires + votes)
|
134 |
// modifie $observations
|
134 |
// modifie $observations
|
135 |
$this->configurer();
|
135 |
$this->configurer();
|
136 |
$this->chargerDeterminations($observations);
|
136 |
$this->chargerDeterminations($observations);
|
137 |
|
137 |
|
138 |
// 5) restauration de l'ordre souhaité initialement
|
138 |
// 5) restauration de l'ordre souhaité initialement
|
139 |
$observations = self::sortArrayByArray($observations, $idobs);
|
139 |
$observations = self::sortArrayByArray($observations, $idobs);
|
140 |
} else {
|
140 |
} else {
|
141 |
$observations = array();
|
141 |
$observations = array();
|
142 |
$total = 0;
|
142 |
$total = 0;
|
143 |
}
|
143 |
}
|
144 |
|
144 |
|
145 |
// 6) JSON output
|
145 |
// 6) JSON output
|
146 |
$resultat = new ResultatService();
|
146 |
$resultat = new ResultatService();
|
147 |
$resultat->corps = array('entete' => DelTk::makeJSONHeader($total, $params, Config::get('url_service')),
|
147 |
$resultat->corps = array('entete' => DelTk::makeJSONHeader($total, $params, Config::get('url_service')),
|
148 |
'resultats' => $observations);
|
148 |
'resultats' => $observations);
|
149 |
|
149 |
|
150 |
return $resultat;
|
150 |
return $resultat;
|
151 |
}
|
151 |
}
|
Line 152... |
Line 152... |
152 |
|
152 |
|
153 |
static function sortArrayByArray($array, $orderArray) {
|
153 |
static function sortArrayByArray($array, $orderArray) {
|
Line 177... |
Line 177... |
177 |
' WHERE %s'. // where-clause ou TRUE
|
177 |
' WHERE %s'. // where-clause ou TRUE
|
178 |
' %s'. // group-by
|
178 |
' %s'. // group-by
|
179 |
' %s'. // having (si commentaires)
|
179 |
' %s'. // having (si commentaires)
|
180 |
' ORDER BY %s %s %s'.
|
180 |
' ORDER BY %s %s %s'.
|
181 |
' LIMIT %d, %d -- %s',
|
181 |
' LIMIT %d, %d -- %s',
|
182 |
|
182 |
|
183 |
$req['join'] ? implode(' ', $req['join']) : '',
|
183 |
$req['join'] ? implode(' ', $req['join']) : '',
|
184 |
$req['where'] ? implode(' AND ', $req['where']) : 'TRUE',
|
184 |
$req['where'] ? implode(' AND ', $req['where']) : 'TRUE',
|
Line 185... |
Line 185... |
185 |
|
185 |
|
186 |
$req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
|
186 |
$req['groupby'] ? ('GROUP BY ' . implode(', ', array_unique($req['groupby']))) : '',
|
Line 371... |
Line 371... |
371 |
foreach ($propositions as $proposition) {
|
371 |
foreach ($propositions as $proposition) {
|
372 |
$idObs = $proposition['ce_observation'];
|
372 |
$idObs = $proposition['ce_observation'];
|
373 |
$idComment = $proposition['id_commentaire'];
|
373 |
$idComment = $proposition['id_commentaire'];
|
374 |
$comment = $this->formaterDetermination($idComment, $proposition);
|
374 |
$comment = $this->formaterDetermination($idComment, $proposition);
|
375 |
if($comment) $observations['"' . $idObs . '"']['commentaires'][$idComment] = $comment;
|
375 |
if($comment) $observations['"' . $idObs . '"']['commentaires'][$idComment] = $comment;
|
376 |
|
376 |
|
377 |
}
|
377 |
}
|
378 |
}
|
378 |
}
|
Line 379... |
Line 379... |
379 |
|
379 |
|
380 |
private function formaterDetermination($commentId, $proposition) {
|
380 |
private function formaterDetermination($commentId, $proposition) {
|
Line 388... |
Line 388... |
388 |
}
|
388 |
}
|
Line 389... |
Line 389... |
389 |
|
389 |
|
390 |
// Charger les votes sur les déterminations
|
390 |
// Charger les votes sur les déterminations
|
391 |
$resultatsVotes = $this->bdd->recupererTous(
|
391 |
$resultatsVotes = $this->bdd->recupererTous(
|
392 |
sprintf('SELECT * FROM del_commentaire_vote WHERE ce_proposition = %d', $commentId));
|
392 |
sprintf('SELECT * FROM del_commentaire_vote WHERE ce_proposition = %d', $commentId));
|
393 |
|
393 |
|
394 |
foreach ($resultatsVotes as $vote) {
|
394 |
foreach ($resultatsVotes as $vote) {
|
395 |
$proposition_formatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
|
395 |
$proposition_formatee['votes'][$vote['id_vote']] = $this->formaterVote($vote);
|