Subversion Repositories eFlore/Applications.cel

Rev

Rev 2205 | Rev 2461 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2205 Rev 2394
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Service permettant de récupérer toutes les informations d'une observation publique.
4
 * Service permettant de récupérer toutes les informations d'une observation publique.
5
 * Encodage en entrée : utf8
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
6
 * Encodage en sortie : utf8
7
 *
7
 *
8
 * Cas d'utilisation :
8
 * Cas d'utilisation :
9
 * GET /CelObs/[id] : oû id est l'identifiant d'une observation publique
9
 * GET /CelObs/[id] : oû id est l'identifiant d'une observation publique
10
 *
10
 *
11
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
11
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
12
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @version $Id$
14
 * @version $Id$
15
 * @copyright © 2013, Jean-Pascal MILCENT
15
 * @copyright © 2013, Jean-Pascal MILCENT
16
 */
16
 */
17
class CelObs extends Cel {
17
class CelObs extends Cel {
18
	private $rechercheObs = null;
18
	private $rechercheObs = null;
19
	private $chpsEtendus = null;
19
	private $chpsEtendus = null;
20
	private $donnees = null;
20
	private $donnees = null;
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');
25
		$this->chpsEtendus = new GestionChampsEtendus($config, 'obs');
26
 
26
 
27
		$this->chargerNomsTablesReferentiels();
27
		$this->chargerNomsTablesReferentiels();
28
	}
28
	}
29
 
29
 
30
	private function chargerNomsTablesReferentiels() {
30
	private function chargerNomsTablesReferentiels() {
31
		// Créé des attributs avec le code du référentiel : bdtfx, bdtxa, apd, isfan
31
		// Créé des attributs avec le code du référentiel : bdtfx, bdtxa, apd, isfan
32
		foreach ( $this->config['referentiels'] as $referentiel => $table) {
32
		foreach ( $this->config['referentiels'] as $referentiel => $table) {
33
			$this->$referentiel = $table;
33
			$this->$referentiel = $table;
34
		}
34
		}
35
	}
35
	}
36
 
36
 
37
	function getElement($ressources){
37
	function getElement($ressources){
38
		$retour = false;
38
		$retour = false;
39
		$idObs = $ressources[0];
39
		$idObs = $ressources[0];
40
		if (isset($idObs) && preg_match('/^[0-9]+$/', $idObs)) {
40
		if (isset($idObs) && preg_match('/^[0-9]+$/', $idObs)) {
41
 
41
 
42
			$criteres = array('id_observation' => $idObs, 'transmission' => 1);
42
			$criteres = array('id_observation' => $idObs, 'transmission' => 1);
43
			$obsTrouvee = $this->rechercheObs->rechercherObservations(null, $criteres, 0, 1)->get();
43
			$obsTrouvee = $this->rechercheObs->rechercherObservations(null, $criteres, 0, 1)->get();
44
 
44
 
45
			$observation = array();
45
			$observation = array();
46
			if (is_array($obsTrouvee) && count($obsTrouvee) > 0) {
46
			if (is_array($obsTrouvee) && count($obsTrouvee) > 0) {
47
				$observation = $obsTrouvee[0];
47
				$observation = $obsTrouvee[0];
48
			}
48
			}
49
			$observation = $this->preparerChamps($observation);
49
			$observation = $this->preparerChamps($observation);
50
			$observation = $this->selectionnerChamps($observation);
50
			$observation = $this->selectionnerChamps($observation);
51
			$observation = $this->formaterClePourJs($observation);
51
			$observation = $this->formaterClePourJs($observation);
52
 
52
 
53
			$champsEtendus = $this->chpsEtendus->consulter($idObs);
53
			$champsEtendus = $this->chpsEtendus->consulter($idObs);
54
			if (is_array($champsEtendus) && count($champsEtendus) > 0) {
54
			if (is_array($champsEtendus) && count($champsEtendus) > 0) {
55
				$champsEtendus = $this->preparerChampsEtendus($champsEtendus);
55
				$champsEtendus = $this->preparerChampsEtendus($champsEtendus);
56
				$observation['extension'] = $champsEtendus;
56
				$observation['extension'] = $champsEtendus;
57
			}
57
			}
58
 
58
 
59
			$this->envoyerJson($observation);
59
			$this->envoyerJson($observation);
60
			$retour = true;
60
			$retour = true;
61
		}
61
		}
62
		return $retour;
62
		return $retour;
63
	}
63
	}
64
 
64
 
65
	private function preparerChamps($champs) {
65
	private function preparerChamps($champs) {
66
		if (isset($champs['date_observation'])) {
66
		if (isset($champs['date_observation'])) {
67
			$date = explode(' ', $champs['date_observation']);
67
			$date = explode(' ', $champs['date_observation']);
68
			$champs['date_observation'] = $date[0];
68
			$champs['date_observation'] = $date[0];
69
		}
69
		}
70
		return $champs;
70
		return $champs;
71
	}
71
	}
72
 
72
 
73
	private function selectionnerChamps($observation) {
73
	private function selectionnerChamps($observation) {
74
		$champs = array('id_observation', 'nom_sel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille',
74
		$champs = array('id_observation', 'nom_sel', 'nom_ret', 'nom_ret_nn', 'nt', 'famille',
75
			'nom_referentiel', 'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'milieu', 'latitude', 'longitude',
75
			'nom_referentiel', 'ce_zone_geo', 'zone_geo', 'lieudit', 'station', 'milieu', 'latitude', 'longitude',
76
			'geodatum', 'date_observation', 'mots_cles_texte', 'commentaire', 'date_creation', 'date_modification',
76
			'geodatum', 'date_observation', 'mots_cles_texte', 'commentaire', 'date_creation', 'date_modification',
77
			'date_transmission', 'code_insee_calcule', 'abondance', 'certitude', 'phenologie', 'altitude');
77
			'date_transmission', 'code_insee_calcule', 'abondance', 'certitude', 'phenologie', 'altitude');
78
		$selection = array();
78
		$selection = array();
79
		foreach ($champs as $chp) {
79
		foreach ($champs as $chp) {
80
			if (isset($observation[$chp])) {
80
			if (isset($observation[$chp])) {
81
				$selection[$chp] = $observation[$chp];
81
				$selection[$chp] = $observation[$chp];
82
			}
82
			}
83
		}
83
		}
84
		return $selection;
84
		return $selection;
85
	}
85
	}
86
 
86
 
87
	private function formaterClePourJs(Array $tableau) {
87
	private function formaterClePourJs(Array $tableau) {
88
		$tableauJs = array();
88
		$tableauJs = array();
89
		foreach ($tableau as $cle => $valeur) {
89
		foreach ($tableau as $cle => $valeur) {
90
			if ($cle == 'ce_zone_geo') {
90
			if ($cle == 'ce_zone_geo') {
91
				$cle = 'codeZoneGeo';
91
				$cle = 'codeZoneGeo';
92
			} else {
92
			} else {
93
				$cle = str_replace(' ', '', ucwords(str_replace('_', ' ', $cle)));
93
				$cle = str_replace(' ', '', ucwords(str_replace('_', ' ', $cle)));
94
				$cle{0} = strtolower($cle{0});
94
				$cle{0} = strtolower($cle{0});
95
			}
95
			}
96
			$tableauJs[$cle] = $valeur;
96
			$tableauJs[$cle] = $valeur;
97
		}
97
		}
98
		return $tableauJs;
98
		return $tableauJs;
99
	}
99
	}
100
 
100
 
101
	private function preparerChampsEtendus($champs) {
101
	private function preparerChampsEtendus($champs) {
102
		$retour = array();
102
		$retour = array();
103
		foreach ($champs as $chp) {
103
		foreach ($champs as $chp) {
104
			$retour[$chp['cle']] = array('valeur' => $chp['valeur'], 'label' => $chp['label']);
104
			$retour[$chp['cle']] = array('valeur' => $chp['valeur']);
105
		}
105
		}
106
		return $retour;
106
		return $retour;
107
	}
107
	}
108
 
108
 
109
	/**
109
	/**
110
	 * Méthode appelée avec une requête de type POST et un identifiant d'observation.
110
	 * Méthode appelée avec une requête de type POST et un identifiant d'observation.
111
	 * Modifie une observation en fonction des informations envoyées en POST.
111
	 * Modifie une observation en fonction des informations envoyées en POST.
112
	 * Utilisé par:
112
	 * Utilisé par:
113
	 * - service:del:0.1/determinations/ : ValiderDetermination.php::modifierObservationParDetermination()
113
	 * - service:del:0.1/determinations/ : ValiderDetermination.php::modifierObservationParDetermination()
114
	 * - service:del:0.1/observations/#idObs [POST] : pour dépublier une observation
114
	 * - service:del:0.1/observations/#idObs [POST] : pour dépublier une observation
115
	 *
115
	 *
116
	 * @param $uid array	$uid[0] (int) : identifiant observation
116
	 * @param $uid array	$uid[0] (int) : identifiant observation
117
	 * @param pairs array	tableau contenant les champs à modifier sous la forme : nom_du_champ=nouvelle_valeur
117
	 * @param pairs array	tableau contenant les champs à modifier sous la forme : nom_du_champ=nouvelle_valeur
118
	 */
118
	 */
119
	public function updateElement($ressources, $donnees) {
119
	public function updateElement($ressources, $donnees) {
120
		$this->donnees = $donnees;
120
		$this->donnees = $donnees;
121
		if ($this->controlerAccessibiliteWs()) {
121
		if ($this->controlerAccessibiliteWs()) {
122
			if ($this->controleAppelIpAutorisee()) {
122
			if ($this->controleAppelIpAutorisee()) {
123
				$idObs = isset($ressources[0]) ? $ressources[0] : '';
123
				$idObs = isset($ressources[0]) ? $ressources[0] : '';
124
				$this->verifierIdentifiantObs($idObs);
124
				$this->verifierIdentifiantObs($idObs);
125
 
125
 
126
				if (count($this->donnees) == 1) {
126
				if (count($this->donnees) == 1) {
127
					$donneesObligatoires = array('transmission');
127
					$donneesObligatoires = array('transmission');
128
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
128
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
129
						$this->depublierObs($idObs);
129
						$this->depublierObs($idObs);
130
					}
130
					}
131
				} else if (count($this->donnees) == 3) {
131
				} else if (count($this->donnees) == 3) {
132
					$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel');
132
					$donneesObligatoires = array('id_observation', 'nom_sel_nn', 'nom_referentiel');
133
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
133
					if ($this->verifierDonneesObligatoires($donneesObligatoires)) {
134
						$this->accepterPropositionDEL($idObs);
134
						$this->accepterPropositionDEL($idObs);
135
					}
135
					}
136
				} else {
136
				} else {
137
					$msg = "La modification complète d'une observation n'est pas implémentée.";
137
					$msg = "La modification complète d'une observation n'est pas implémentée.";
138
					$this->envoyerMessageErreur(501, $msg);
138
					$this->envoyerMessageErreur(501, $msg);
139
				}
139
				}
140
 
140
 
141
				$this->envoyer('ok');
141
				$this->envoyer('ok');
142
			}
142
			}
143
		}
143
		}
144
		return true;
144
		return true;
145
	}
145
	}
146
 
146
 
147
	private function verifierIdentifiantObs($chaine) {
147
	private function verifierIdentifiantObs($chaine) {
148
		$ok = preg_match('/^[0-9]+$/', $chaine);
148
		$ok = preg_match('/^[0-9]+$/', $chaine);
149
		if ($ok == false) {
149
		if ($ok == false) {
150
			$msg = "Indiquer un seul identifiant numérique d'observation.";
150
			$msg = "Indiquer un seul identifiant numérique d'observation.";
151
			$this->envoyerMessageErreur(412, $msg);
151
			$this->envoyerMessageErreur(412, $msg);
152
		}
152
		}
153
		return $ok;
153
		return $ok;
154
	}
154
	}
155
 
155
 
156
	private function verifierDonneesObligatoires($champsObligatoires) {
156
	private function verifierDonneesObligatoires($champsObligatoires) {
157
		foreach ($champsObligatoires as $param) {
157
		foreach ($champsObligatoires as $param) {
158
			if (! isset($this->donnees[$param])) {
158
			if (! isset($this->donnees[$param])) {
159
				$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));
159
				$msg = sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $champsObligatoires));
160
				$this->envoyerMessageErreur(412, $msg);
160
				$this->envoyerMessageErreur(412, $msg);
161
			}
161
			}
162
		}
162
		}
163
		return true;
163
		return true;
164
	}
164
	}
165
 
165
 
166
	private function depublierObs($idObs) {
166
	private function depublierObs($idObs) {
167
		$gestionnaireObs = new GestionObservation($this->config);
167
		$gestionnaireObs = new GestionObservation($this->config);
168
		$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
168
		$depublication = $gestionnaireObs->modifierTransmissionObservation($idObs, false);
169
		if ($depublication === false) {
169
		if ($depublication === false) {
170
			$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
170
			$msg = "Un problème est survenu (voir log). Les observations n'ont pas pu être dépubliées.";
171
			$this->envoyerMessageErreur(304, $msg);
171
			$this->envoyerMessageErreur(304, $msg);
172
		}
172
		}
173
	}
173
	}
174
 
174
 
175
	/**
175
	/**
176
	 * Modifie une observation aveec les infos d'une proposition :
176
	 * Modifie une observation aveec les infos d'une proposition :
177
	 * Nous complétons les données de la proposition acceptée ici car:
177
	 * Nous complétons les données de la proposition acceptée ici car:
178
	 * 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
178
	 * 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
179
	 * 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
179
	 * 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
180
	 * 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
180
	 * 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
181
	 */
181
	 */
182
	private function accepterPropositionDEL($idObs) {
182
	private function accepterPropositionDEL($idObs) {
183
		$gestion_observation = new GestionObservation($this->config);
183
		$gestion_observation = new GestionObservation($this->config);
184
		$donnees = array_map('trim', $this->donnees);
184
		$donnees = array_map('trim', $this->donnees);
185
		$donneesAModifier = array(
185
		$donneesAModifier = array(
186
			'certitude' => 'Certaine',
186
			'certitude' => 'Certaine',
187
			'nom_referentiel' => $donnees['nom_referentiel'],
187
			'nom_referentiel' => $donnees['nom_referentiel'],
188
		);
188
		);
189
		// TODO : la récupération des infos du nom est aussi effectué par la suite voir ce qu'il faut garder
189
		// TODO : la récupération des infos du nom est aussi effectué par la suite voir ce qu'il faut garder
190
		$infosNoms = $this->getNomInfos($donnees['nom_sel_nn'], $donnees['nom_referentiel']);
190
		$infosNoms = $this->getNomInfos($donnees['nom_sel_nn'], $donnees['nom_referentiel']);
191
		if ($infosNoms) {
191
		if ($infosNoms) {
192
			$donneesAModifier = array_merge($donneesAModifier, $infosNoms);
192
			$donneesAModifier = array_merge($donneesAModifier, $infosNoms);
193
		}
193
		}
194
 
194
 
195
		$modification = $gestion_observation->modifierObservationPublique($idObs, $donneesAModifier);
195
		$modification = $gestion_observation->modifierObservationPublique($idObs, $donneesAModifier);
196
 
196
 
197
		if ($modification) {
197
		if ($modification) {
198
			// TODO: en modifiant bien la classe de gestion mots clés, on aurait peut être pas besoin de l'id
198
			// TODO: en modifiant bien la classe de gestion mots clés, on aurait peut être pas besoin de l'id
199
			// utilisateur (car l'id de l'obs est déjà sans ambiguité)
199
			// utilisateur (car l'id de l'obs est déjà sans ambiguité)
200
			$idUtilisateur = $this->rechercheObs->obtenirIdUtilisateurPourIdObs($idObs);
200
			$idUtilisateur = $this->rechercheObs->obtenirIdUtilisateurPourIdObs($idObs);
201
			
201
			
202
			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
202
			// supression des éventuelles liaison de l'obs avec le mot clé contenu dans obsKeywordDelete
203
			$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
203
			$gestionMotsClesObs = new GestionMotsClesChemin($this->config, 'obs');
204
			$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
204
			$supp_liaison_mot_cle = $gestionMotsClesObs->supprimerLiaisonPourMotCleEtIdElementLie('aDeterminer', $idObs, $idUtilisateur);
205
		} else {
205
		} else {
206
			$msg = "Impossible de modifier l'observation associée à cet identifiant. Erreur mysql : " . mysql_error();
206
			$msg = "Impossible de modifier l'observation associée à cet identifiant. Erreur mysql : " . mysql_error();
207
			$this->envoyerMessageErreur(500, $msg);// Internal Server Error
207
			$this->envoyerMessageErreur(500, $msg);// Internal Server Error
208
		}
208
		}
209
	}
209
	}
210
 
210
 
211
	// TODO : cette méthode et celles qui en dépendent sont peut être inutiles au vue de la méthode traiterEspece() de GestionObservation
211
	// TODO : cette méthode et celles qui en dépendent sont peut être inutiles au vue de la méthode traiterEspece() de GestionObservation
212
	private function getNomInfos($id_nom, $code_referentiel) {
212
	private function getNomInfos($id_nom, $code_referentiel) {
213
		$retour = false;
213
		$retour = false;
214
		if ($id_nom && $code_referentiel) {
214
		if ($id_nom && $code_referentiel) {
215
			switch ($code_referentiel) {
215
			switch ($code_referentiel) {
216
				case 'bdtfx' :
216
				case 'bdtfx' :
217
					$retour = $this->getInfosBdtfx($id_nom);
217
					$retour = $this->getInfosBdtfx($id_nom);
218
					break;
218
					break;
219
				case 'bdtxa' :
219
				case 'bdtxa' :
220
					$retour = $this->getInfosBdtxa($id_nom);
220
					$retour = $this->getInfosBdtxa($id_nom);
221
					break;
221
					break;
222
				case 'isfan' :
222
				case 'isfan' :
223
					$retour = $this->getInfosIsfan($id_nom);
223
					$retour = $this->getInfosIsfan($id_nom);
224
					break;
224
					break;
225
				case 'apd' :
225
				case 'apd' :
226
					$retour = $this->getInfosApd($id_nom);
226
					$retour = $this->getInfosApd($id_nom);
227
					break;
227
					break;
228
			}
228
			}
229
		}
229
		}
230
		return $retour;
230
		return $retour;
231
	}
231
	}
232
 
232
 
233
	private function getInfosBdtfx($id_nom) {
233
	private function getInfosBdtfx($id_nom) {
234
		$idNomP = CEL::db()->proteger($id_nom);
234
		$idNomP = CEL::db()->proteger($id_nom);
235
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
235
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
236
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
236
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
237
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
237
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
238
			"FROM {$this->bdtfx} AS o ".
238
			"FROM {$this->bdtfx} AS o ".
239
			"	LEFT JOIN {$this->bdtfx} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
239
			"	LEFT JOIN {$this->bdtfx} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
240
			"WHERE o.num_nom = $idNomP ".
240
			"WHERE o.num_nom = $idNomP ".
241
			' -- '.__FILE__.' : '.__LINE__;
241
			' -- '.__FILE__.' : '.__LINE__;
242
		$resultat = Cel::db()->requeterLigne($requete);
242
		$resultat = Cel::db()->requeterLigne($requete);
243
		return $resultat;
243
		return $resultat;
244
	}
244
	}
245
 
245
 
246
	private function getInfosBdtxa($id_nom) {
246
	private function getInfosBdtxa($id_nom) {
247
		$idNomP = CEL::db()->proteger($id_nom);
247
		$idNomP = CEL::db()->proteger($id_nom);
248
		// Champ "num_tax" au lieu de "num_taxonomique"
248
		// Champ "num_tax" au lieu de "num_taxonomique"
249
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, o.famille, ".
249
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, o.famille, ".
250
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
250
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
251
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
251
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
252
			"FROM {$this->bdtxa} AS o ".
252
			"FROM {$this->bdtxa} AS o ".
253
			"	LEFT JOIN {$this->bdtxa} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
253
			"	LEFT JOIN {$this->bdtxa} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
254
			"WHERE o.num_nom = $idNomP ".
254
			"WHERE o.num_nom = $idNomP ".
255
			' -- '.__FILE__.' : '.__LINE__;
255
			' -- '.__FILE__.' : '.__LINE__;
256
		$resultat = Cel::db()->requeterLigne($requete);
256
		$resultat = Cel::db()->requeterLigne($requete);
257
		return $resultat;
257
		return $resultat;
258
	}
258
	}
259
 
259
 
260
	private function getInfosIsfan($id_nom) {
260
	private function getInfosIsfan($id_nom) {
261
		$idNomP = CEL::db()->proteger($id_nom);
261
		$idNomP = CEL::db()->proteger($id_nom);
262
		// Champ "num_tax" au lieu de "num_taxonomique"
262
		// Champ "num_tax" au lieu de "num_taxonomique"
263
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
263
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
264
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
264
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
265
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
265
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
266
			"FROM {$this->isfan} AS o ".
266
			"FROM {$this->isfan} AS o ".
267
			"	LEFT JOIN {$this->isfan} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
267
			"	LEFT JOIN {$this->isfan} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
268
			"WHERE o.num_nom = $idNomP ".
268
			"WHERE o.num_nom = $idNomP ".
269
			' -- '.__FILE__.' : '.__LINE__;
269
			' -- '.__FILE__.' : '.__LINE__;
270
		$resultat = Cel::db()->requeterLigne($requete);
270
		$resultat = Cel::db()->requeterLigne($requete);
271
		return $resultat;
271
		return $resultat;
272
	}
272
	}
273
 
273
 
274
	private function getInfosApd($id_nom) {
274
	private function getInfosApd($id_nom) {
275
		$idNomP = CEL::db()->proteger($id_nom);
275
		$idNomP = CEL::db()->proteger($id_nom);
276
		// Champ "num_tax" au lieu de "num_taxonomique"
276
		// Champ "num_tax" au lieu de "num_taxonomique"
277
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
277
		$requete = "SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, o.famille, ".
278
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
278
			"	CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel, ".
279
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
279
			"	CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret ".
280
			"FROM {$this->apd} AS o ".
280
			"FROM {$this->apd} AS o ".
281
			"	LEFT JOIN {$this->apd} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
281
			"	LEFT JOIN {$this->apd} AS ret ON (o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom) ".
282
			"WHERE o.num_nom = $idNomP ".
282
			"WHERE o.num_nom = $idNomP ".
283
			' -- '.__FILE__.' : '.__LINE__;
283
			' -- '.__FILE__.' : '.__LINE__;
284
		$resultat = Cel::db()->requeterLigne($requete);
284
		$resultat = Cel::db()->requeterLigne($requete);
285
		return $resultat;
285
		return $resultat;
286
	}
286
	}
287
}
287
}