Subversion Repositories eFlore/Applications.del

Rev

Rev 1618 | Rev 1755 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1618 Rev 1666
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);