Subversion Repositories eFlore/Applications.cel

Rev

Rev 2757 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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