Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2143 Rev 2152
Line 21... Line 21...
21
 
21
 
22
	public function __construct($config) {
22
	public function __construct($config) {
23
		parent::__construct($config);
23
		parent::__construct($config);
24
		$this->rechercheObs = new RechercheObservation($config);
24
		$this->rechercheObs = new RechercheObservation($config);
-
 
25
		$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');
-
 
26
 
-
 
27
		$this->chargerNomsTablesReferentiels();
-
 
28
	}
-
 
29
 
-
 
30
	private function chargerNomsTablesReferentiels() {
-
 
31
		// Créé des attributs avec le code du référentiel : bdtfx, bdtxa, bdtao, isfan
-
 
32
		foreach ( $this->config['referentiels'] as $referentiel => $table) {
-
 
33
			$this->$referentiel = $table;
25
		$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');
34
		}
Line 26... Line 35...
26
	}
35
	}
27
 
36
 
28
	function getElement($ressources){
37
	function getElement($ressources){
Line 112... Line 121...
112
		if ($this->controlerAccessibiliteWs()) {
121
		if ($this->controlerAccessibiliteWs()) {
113
			if ($this->controleAppelIpAutorisee()) {
122
			if ($this->controleAppelIpAutorisee()) {
114
				$idObs = isset($ressources[0]) ? $ressources[0] : '';
123
				$idObs = isset($ressources[0]) ? $ressources[0] : '';
115
				$this->verifierIdentifiantObs($idObs);
124
				$this->verifierIdentifiantObs($idObs);
Line 116... Line -...
116
 
-
 
117
				$idObs = explode(',', $idObs);
-
 
118
				// Seulement la dépublication
125
 
119
				if (isset($this->donnees['transmission']) && count($this->donnees) == 1) {
126
				if (count($this->donnees) == 1) {
120
					$gestionnaireObs = new GestionObservation($this->config);
-
 
121
					$detransmissionObs = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
127
					$donneesObligatoires = array('transmission');
122
					if ($detransmissionObs === false) {
-
 
123
						$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
128
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
124
						$this->envoyerMessageErreur(304, $msg);
129
						$this->depublierObs($idObs);
125
					}
130
					}
126
				} if (count($this->donnees) == 3) {
131
				} else if (count($this->donnees) == 4) {
127
					$donneesObligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
132
					$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel', 'id_utilisateur');
128
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
133
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
129
						$this->modifierObservationDepuisDEL($idObs);
134
						$this->accepterPropositionDEL($idObs);
130
					}
135
					}
131
				} else {
136
				} else {
132
					$msg = "La modification complète d'une observation n'est pas implémentée. \n".
-
 
133
						"Uniquement la dépublication pour l'instant fonctionne";
137
					$msg = "La modification complète d'une observation n'est pas implémentée.";
134
					$this->envoyerMessageErreur(501, $msg);
138
					$this->envoyerMessageErreur(501, $msg);
Line 135... Line 139...
135
				}
139
				}
136
 
-
 
137
				$this->envoyer('OK');
-
 
138
			} else {
-
 
139
				$msg = "Accès interdit. \n"."Vous n'êtes pas autorisé à accéder à ce service depuis '{$_SERVER['REMOTE_ADDR']}' !\n";
140
 
140
				$this->envoyerMessageErreur(401, $msg);
141
				$this->envoyer('ok');
141
			}
142
			}
Line 142... Line -...
142
		}
-
 
143
	}
-
 
144
 
-
 
145
	private function modifierObservationDepuisDEL($idObs) {
-
 
146
		$gestion_observation = new GestionObservation($this->config);
-
 
147
		$pairs = array_map('trim', $this->donnees);
-
 
148
		$utilisateur = $pairs['ce_utilisateur'];
-
 
149
		unset($pairs['ce_utilisateur'], $pairs['id_observation']);
-
 
150
 
-
 
151
		// mise à jour des mots-clefs suite à une validation:
-
 
152
		// typiquement, DEL modifierObservationParDetermination()
-
 
153
		// nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
-
 
154
		$obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
-
 
155
		// $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
-
 
156
		unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);
-
 
157
 
-
 
158
		// complete les données de la proposition validée car:
-
 
159
		// 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
-
 
160
		// 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
-
 
161
		// 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
-
 
162
		$more_data = $this->NN2(@$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
-
 
163
		if($more_data) $pairs = array_merge($pairs, $more_data);
-
 
164
 
-
 
165
		$modification = $gestion_observation->modifierObservationPublique($utilisateur, $idObs, $pairs);
-
 
166
		if($modification) {
-
 
167
			$gestion_mots_cles = new GestionMotsClesChemin($this->config, 'obs');
-
 
168
			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
-
 
169
			$supp_liaison_mot_cle = $gestion_mots_cles->supprimerLiaisonPourMotCleEtIdElementLie($obsKeywordDelete, $idObs, $utilisateur);
-
 
170
			// TODO : quel impact de la valeur de retour ?
-
 
171
			header("Content-Type: text/plain; charset=utf-8");
-
 
172
			die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
-
 
173
		}
-
 
174
		// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
-
 
175
		elseif($modification === 0) {
-
 
176
            header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
-
 
177
			header("Content-Type: text/plain; charset=utf-8");
-
 
178
			die("Not Modified");
-
 
179
		}
-
 
180
		else {
-
 
181
			header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
-
 
182
			header("Content-Type: text/plain; charset=utf-8");
-
 
183
			die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
-
 
184
		}
143
		}
185
	}
144
	}
186
 
145
 
187
	private function verifierIdentifiantObs($chaine) {
146
	private function verifierIdentifiantObs($chaine) {
188
		$ok = preg_match('/^(?:[0-9]+,)*[0-9]+$/', $chaine);
147
		$ok = preg_match('/^[0-9]+$/', $chaine);
189
		if ($ok == false) {
148
		if ($ok == false) {
190
			$msg = "Indiquer un ou plusieurs identifiants d'obs séparés par des virgules.";
149
			$msg = "Indiquer un seul identifiant numérique d'observation.";
191
			$this->envoyerMessageErreur(412, $msg);
150
			$this->envoyerMessageErreur(412, $msg);
Line 198... Line 157...
198
			if (! isset($this->donnees[$param])) {
157
			if (! isset($this->donnees[$param])) {
199
				$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));
158
				$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));
200
				$this->envoyerMessageErreur(412, $msg);
159
				$this->envoyerMessageErreur(412, $msg);
201
			}
160
			}
202
		}
161
		}
-
 
162
		return true;
-
 
163
	}
-
 
164
 
-
 
165
	private function depublierObs($idObs) {
-
 
166
		$gestionnaireObs = new GestionObservation($this->config);
-
 
167
		$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
-
 
168
		if ($depublication === false) {
-
 
169
			$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
-
 
170
			$this->envoyerMessageErreur(304, $msg);
-
 
171
		}
203
	}
172
	}
Line -... Line 173...
-
 
173
 
204
 
174
	/**
205
	private function NN2($id, $ref) {
175
	 * Modifie une observation aveec les infos d'une proposition :
206
		if(!$db || !$id || !$ref) return FALSE;
176
	 * Nous complétons les données de la proposition acceptée ici car:
207
		switch($ref) {
177
	 * 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
208
			case "bdtfx":
178
	 * 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
209
				return $this->bdd->query(sprintf(, self::db, self::bdtfx,  self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
179
	 * 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
-
 
180
	 */
210
		case "bdtxa":
181
	private function accepterPropositionDEL($idObs) {
211
		  return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel". // subtilité: "num_tax"
182
		$gestion_observation = new GestionObservation($this->config);
-
 
183
		$donnees = array_map('trim', $this->donnees);
212
									" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
184
		$idUtilisateur = $donnees['id_utilisateur'];
213
									" FROM %s.%s o".
185
		$donneesAModifier = array(
214
									" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
186
			'certitude' => 'Certaine',
215
									" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa,  self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
187
			'nom_referentiel' => $donnees['nom_referentiel'],
216
		case "isfan":
188
		);
217
		  return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
189
		// TODO : la récupération des infos du nom est aussi effectué par la suite voir ce qu'il faut garder
218
									" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
190
		$infosNoms = $this->getNomInfos($donnees['nom_sel_nn'], $donnees['nom_referentiel']);
219
									" FROM %s.%s o".
191
		if ($infosNoms) {
-
 
192
			$donneesAModifier = array_merge($donneesAModifier, $infosNoms);
-
 
193
		}
220
									" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
194
 
-
 
195
		$modification = $gestion_observation->modifierObservationPublique($idObs, $donneesAModifier);
221
									" WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan,  self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
196
 
222
		case "bdtao":
197
		if ($modification) {
223
		  return $this->bdd->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
198
			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
-
 
199
			$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
224
									" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
200
			$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
225
									" FROM %s.%s o".
201
		} else {
226
									" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
202
			$msg = "Impossible de modifier l'observation associée à cet identifiant. Erreur mysql : " . mysql_error();
227
									" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtao,  self::db, self::bdtao, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
203
			$this->envoyerMessageErreur(500, $msg);// Internal Server Error
228
		}
-
 
229
		return FALSE;
204
		}
230
	}
205
	}
-
 
206
 
-
 
207
	// TODO : cette méthode et celles qui en dépendent sont peut être inutiles au vue de la méthode traiterEspece() de GestionObservation
231
 
208
	private function getNomInfos($id_nom, $code_referentiel) {
-
 
209
		$retour = false;
-
 
210
		if ($id_nom && $code_referentiel) {
232
	const db = 'tb_eflore';
211
			switch ($code_referentiel) {
-
 
212
				case 'bdtfx' :
-
 
213
					$retour = $this->getInfosBdtfx($id_nom);
233
	const bdtfx = 'bdtfx_v2_00';
214
					break;
-
 
215
				case 'bdtxa' :
-
 
216
					$retour = $this->getInfosBdtxa($id_nom);
234
	const bdtxa = 'bdtxa_v1_01';
217
					break;
-
 
218
				case 'isfan' :
-
 
219
					$retour = $this->getInfosIsfan($id_nom);
235
	const isfan = 'isfan_v2013';
220
					break;
-
 
221
				case 'bdtao' :
-
 
222
					$retour = $this->getInfosBdtao($id_nom);
-
 
223
					break;
-
 
224
			}
-
 
225
		}
-
 
226
		return $retour;
Line 236... Line 227...
236
	const bdtao = 'bdtao_v1_00';
227
	}
-
 
228
 
-
 
229
	private function getInfosBdtfx($id_nom) {
-
 
230
		$idNomP = CEL::db()->proteger($id_nom);
-
 
231
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
-
 
232
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
-
 
233
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
-
 
234
			"FROM {$this->bdtfx} AS o ".
-
 
235
			"	LEFT JOIN {$this->bdtfx} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
-
 
236
			"WHERE o.num_nom = $idNomP ".
-
 
237
			' -- '.__FILE__.' : '.__LINE__;
-
 
238
		$resultat = Cel::db()->requeterLigne($requete);
-
 
239
		return $resultat;
-
 
240
	}
-
 
241
 
-
 
242
	private function getInfosBdtxa($id_nom) {
-
 
243
		$idNomP = CEL::db()->proteger($id_nom);
-
 
244
		// Champ "num_tax" au lieu de "num_taxonomique"
-
 
245
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, o.famille, ".
-
 
246
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
-
 
247
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
-
 
248
			"FROM {$this->bdtxa} AS o ".
-
 
249
			"	LEFT JOIN {$this->bdtxa} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
-
 
250
			"WHERE o.num_nom = $idNomP ".
-
 
251
			' -- '.__FILE__.' : '.__LINE__;
-
 
252
		$resultat = Cel::db()->requeterLigne($requete);
-
 
253
		return $resultat;
-
 
254
	}
-
 
255
 
-
 
256
	private function getInfosIsfan($id_nom) {
-
 
257
		$idNomP = CEL::db()->proteger($id_nom);
-
 
258
		// Champ "num_tax" au lieu de "num_taxonomique"
-
 
259
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
-
 
260
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
-
 
261
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
-
 
262
			"FROM {$this->isfan} AS o ".
-
 
263
			"	LEFT JOIN {$this->isfan} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
-
 
264
			"WHERE o.num_nom = $idNomP ".
-
 
265
			' -- '.__FILE__.' : '.__LINE__;
-
 
266
		$resultat = Cel::db()->requeterLigne($requete);
-
 
267
		return $resultat;
-
 
268
	}
237
 
269
 
-
 
270
	private function getInfosBdtao($id_nom) {
238
	private function getInfosBdtfx($id_nom) {
271
		$idNomP = CEL::db()->proteger($id_nom);
239
		$idNomP = $this->bdd->proteger($id_nom);
272
		// Champ "num_tax" au lieu de "num_taxonomique"
240
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
273
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
241
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
274
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
242
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
275
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
243
			"FROM bdtfx_v2_00 AS o ".
276
			"FROM {$this->bdtao} AS o ".
244
			"	LEFT JOIN bdtfx_v2_00 AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
277
			"	LEFT JOIN {$this->bdtao} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
245
			"WHERE o.num_nom = $idNomP ".
278
			"WHERE o.num_nom = $idNomP ".
246
			' -- '.__FILE__.' : '.__LINE__;
279
			' -- '.__FILE__.' : '.__LINE__;
247
		$resultat = Cel::db()->executerRequete($requete, Cel::db::SQL_RETOUR_LIGNE);
280
		$resultat = Cel::db()->requeterLigne($requete);
248
		return $resultat;
281
		return $resultat;
249
	}
282
	}