Subversion Repositories Applications.referentiel

Rev

Rev 103 | Rev 110 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
78 delphine 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe Controleur du module Fiche Taxon.
5
 *
6
 * @category	Php 5.2
7
 * @package		Taxon
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @copyright	2010 Tela-Botanica
10
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
12
 * @version		SVN: $Id: Fiche.php 96 2010-06-21 16:46:31Z jpm $
13
 */
14
class FicheTaxon extends AppliControleur {
15
 
16
	private $donnees = array();
17
	protected $taxonDao = null;
85 delphine 18
	private $tableau_manuel = null;
19
	private $num_taxon = array(0=>0,1=>0,2=>0);
78 delphine 20
 
21
	//+----------------------------------------------------------------------------------------------------------------+
22
	// Méthodes
23
	/**
24
	 * Fonction d'affichage par défaut
25
	 */
26
	public function executerActionParDefaut() {
27
		return $this->afficherTaxon();
28
	}
29
 
30
	// +---------------------------------------------------------------------------------------------------------------+
82 delphine 31
	// FICHE CONSULTATION TAXON
78 delphine 32
	public function afficherTaxon() {
33
		// Récupération du référentiel
34
		if (isset($_GET['ref'])) {
35
			$this->referentiel = strtolower($_GET['ref']);
36
		}
37
		// Gestion des actions par défaut
38
		$this->taxonDao = new TaxonDao();
39
		$this->definirCommeModulePrincipal(get_class($this));
40
		$this->construireMenu($this->referentiel);
41
		$this->construireFilAriane($this->referentiel);
42
		$this->executerActionReferentiel('Recherche', 'chargerMoteurRecherche', $this->referentiel);
43
 
44
		// Gestion des données de la requête
45
		if (!isset($_GET['num_nom'])) {
46
 
47
		} else {
48
			// Récupération des données
49
			$this->donnees['referentiel'] = $this->referentiel;
50
			$this->donnees['num_nom'] = $_GET['num_nom'];
82 delphine 51
			$this->donnees['info'] = $this->taxonDao->getTaxon($this->referentiel, $this->donnees['num_nom']);
103 jpm 52
			$this->donnees['num_nom_retenu'] = $this->donnees['info']['num_nom_retenu'];
53
			$this->donnees['nom'] = $this->donnees['info']['nom_complet'];
78 delphine 54
 
88 delphine 55
			if ($this->donnees['info'] != '') {
56
				// Chargement des données des onglets
57
				$this->chargerNomenclature();
58
				$this->chargerSynonymie();
59
				$this->chargerClassification();
60
				$this->chargerChorologie();
61
				$this->chargerComplements();
62
			}
78 delphine 63
 
64
			$this->setSortie(self::RENDU_CORPS, $this->getVue('fiche_taxon', $this->donnees));
65
		}
66
	}
67
 
82 delphine 68
	private function chargerNomenclature() {
69
		$this->donnees['selectionne'] = $this->taxonDao->getNomenclature($this->referentiel, $this->donnees['num_nom']);
70
		if (strpos($this->donnees['nom'], ' x ') ) {
85 delphine 71
			if ($this->donnees['num_nom'] != $this->donnees['num_nom_retenu'] && $this->donnees['num_nom_retenu'] != '') {
82 delphine 72
				$this->donnees['retenu'] = $this->taxonDao->getNomenclature($this->referentiel, $this->donnees['num_nom_retenu']);
73
				$this->donnees['parents'] = $this->taxonDao->getParentsHybride($this->referentiel, $this->donnees['num_nom_retenu']);
74
			} else {
75
				$this->donnees['parents'] = $this->taxonDao->getParentsHybride($this->referentiel, $this->donnees['num_nom']);
76
			}
77
		} else {
85 delphine 78
			if ($this->donnees['num_nom'] != $this->donnees['num_nom_retenu'] && $this->donnees['num_nom_retenu'] != '') {
82 delphine 79
				$this->donnees['retenu'] = $this->taxonDao->getNomenclature($this->referentiel, $this->donnees['num_nom_retenu']);
80
			}
81
		}
82
	}
83
 
84
	// recherche les synonymes (à compléter)
85
	private function chargerSynonymie() {
86
		$rechercheDao = new RechercheDao();
87
		// recherche des synonymes nomenclaturaux et taxonomiques
88
		$parametres = $this->parserChaineDeRecherche('nn:'.$this->donnees['num_nom'].' tax:1');
89
		$parametres['ref']= $this->referentiel;
85 delphine 90
		$synonymes = $rechercheDao->chercher('ParTaxon', $parametres);
91
		if ($synonymes != '') {
92
			foreach ($synonymes as $synonyme) {
104 delphine 93
				$this->trierSynonymesNomenclaturauxTaxonomiques($synonyme);
94
				$this->trierSynonymesMalAppliques($synonyme);
95
				$this->trierSynonymesOrthographiques($synonyme);
82 delphine 96
			}
104 delphine 97
		}
98
		// synonyme douteux
99
		if ($this->donnees['info']['synonyme_douteux'] == 1) {
100
			$this->donnees['fiche_synonymie']['douteux']['num_nom'] = $this->donnees['info'];
101
		}
102
		// synonyme proparte
103
		if ($this->donnees['info']['synonyme_proparte'] != ''){
104
			$propartes = preg_split('/;/', $this->donnees['info']['synonyme_proparte']);
105
			foreach ($propartes as $protarte) {
106
				$this->donnees['fiche_synonymie']['pro parte'] =
107
				$this->taxonDao->getTaxonAffichage($this->referentiel, $proparte);
85 delphine 108
			}
104 delphine 109
		}
110
		// homonymie
111
		$nom = $this->encodeChaine($this->donnees['info']['nom_complet']);
112
		$homonyme = $this->taxonDao->getHomonyme($this->referentiel, $nom);
113
		if (count($homonyme) > 1) {
114
			$this->donnees['fiche_synonymie']['Homonymie (sensu)'] = $homonyme;
115
		}
116
		// Même basionyme
117
		if ($this->donnees['info']['basionyme'] != '') {
118
			$basionyme_commun = $this->taxonDao->getNomsBasionymeCommun($this->referentiel, $this->donnees['info']['basionyme']);
119
			foreach ($basionyme_commun as $nom) {
120
				if ($nom['num_nom_retenu'] != $this->donnees['num_nom_retenu']) {
121
					$this->donnees['fiche_synonymie']['Basionyme commun'][] = $nom;
88 delphine 122
				}
123
			}
104 delphine 124
		}
125
	}
126
	private function trierSynonymesNomenclaturauxTaxonomiques($synonyme) {
127
		if ($this->donnees['num_nom'] != $synonyme['num_nom'] && $synonyme['basionyme'] != null) {
128
			if (($this->donnees['num_nom'] != $synonyme['num_nom']) && ($synonyme['basionyme'] ==
129
					$this->donnees['num_nom'] || $this->donnees['info']['basionyme'] == $synonyme['num_nom'] ||
130
					$this->donnees['info']['basionyme'] == $synonyme['basionyme'])) {
131
				$this->donnees['fiche_synonymie']['nomenclaturale'][] = $synonyme;
132
			} elseif ($this->donnees['num_nom'] != $synonyme['num_nom'] && $synonyme['basionyme'] != null &&
133
					$this->donnees['info']['basionyme'] != null) {
134
				$this->donnees['fiche_synonymie']['taxonomique'][] = $synonyme;
135
			}
136
		} elseif ($this->donnees['num_nom'] != $synonyme['num_nom']) {
137
			$this->donnees['fiche_synonymie']['indéterminée (pas de basionyme)'][] = $synonyme;
138
		}
139
	}
140
	private function trierSynonymesMalAppliques($synonyme) {
141
		if ($synonyme['synonyme_mal_applique'] == 1) {
142
			if ($synonyme['num_nom'] == $synonyme['num_nom_retenu']) {
143
				$synonyme['statut'] = 'posséde des synonymes mal appliqués';
144
			} else {
145
				$synonyme['statut'] = 'est synonyme mal appliqué du num_nom '.$synonyme['num_nom_retenu'];
88 delphine 146
			}
104 delphine 147
			$this->donnees['fiche_synonymie']['mal appliquée'][] = $synonyme;
148
		}
82 delphine 149
	}
104 delphine 150
	private function trierSynonymesOrthographiques($synonyme) {
151
		if (isset($synonyme['synonyme_orthographique']) && $synonyme['synonyme_orthographique'] != '') {
152
			if ($synonyme['synonyme_orthographique'] == $synonyme['num_nom']) {
153
				$synonyme['statut'] = 'posséde des synonymes orthographiques';
154
			} else {
155
				$synonyme['statut'] = 'est synonyme orthographique du num_nom '.$synonyme['synonyme_orthographique'];
156
			}
157
			$this->donnees['fiche_synonymie']['orthographique'][] = $synonyme;
158
		}
159
	}
82 delphine 160
 
161
	private function chargerChorologie() {
85 delphine 162
		$this->chargerTableauManuel('presence');
163
		$this->chargerTableauManuel('statuts_origine');
164
		$this->chargerTableauManuel('statuts_introduction');
165
		$this->chargerTableauManuel('statuts_culture');
82 delphine 166
		foreach ($this->donnees['info'] as $param => $valeur) {
167
			if ($param == 'presence') {
168
				$this->donnees['chorologie']['Présence']['France']['code'] = $valeur;
85 delphine 169
				$this->donnees['chorologie']['Présence']['France']['valeur'] = $this->tableau_manuel['presence'][$valeur];
82 delphine 170
			} elseif (preg_match('/presence_(.*)/', $param, $lieu)) {
171
				$this->donnees['chorologie']['Présence'][$lieu['1']]['code'] = $valeur;
85 delphine 172
				$this->donnees['chorologie']['Présence'][$lieu['1']]['valeur'] = $this->tableau_manuel['presence'][$valeur];
82 delphine 173
			} elseif ($param == 'statut_origine') {
174
				$this->donnees['chorologie']['Statut d\'origine']['France']['code'] = $valeur;
85 delphine 175
				$this->donnees['chorologie']['Statut d\'origine']['France']['valeur'] =
176
					$this->tableau_manuel['statuts_origine'][$valeur];
82 delphine 177
			} elseif (preg_match('/statut_origine_(.*)/', $param, $lieu)) {
178
				$this->donnees['chorologie']['Statut d\'origine'][$lieu['1']]['code'] = $valeur;
85 delphine 179
				$this->donnees['chorologie']['Statut d\'origine'][$lieu['1']]['valeur'] =
180
					$this->tableau_manuel['statuts_origine'][$valeur];
82 delphine 181
			} elseif ($param == 'statut_introduction') {
182
				$this->donnees['chorologie']['Statut d\'introduction']['France']['code'] = $valeur;
85 delphine 183
				$this->donnees['chorologie']['Statut d\'introduction']['France']['valeur'] =
184
					$this->tableau_manuel['statuts_introduction'][$valeur];
82 delphine 185
			} elseif (preg_match('/statut_introduction_(.*)/', $param, $lieu)) {
186
				$this->donnees['chorologie']['Statut d\'introduction'][$lieu['1']]['code'] = $valeur;
85 delphine 187
				$this->donnees['chorologie']['Statut d\'introduction'][$lieu['1']]['valeur'] =
188
					$this->tableau_manuel['statuts_introduction'][$valeur];
82 delphine 189
			} elseif ($param == 'statut_culture') {
190
				$this->donnees['chorologie']['Statut de culture']['France']['code'] = $valeur;
85 delphine 191
				$this->donnees['chorologie']['Statut de culture']['France']['valeur'] =
192
					$this->tableau_manuel['statuts_culture'][$valeur];
82 delphine 193
			} elseif (preg_match('/statut_culture_(.*)/', $param, $lieu)) {
194
				$this->donnees['chorologie']['Statut de culture'][$lieu['1']]['code'] = $valeur;
85 delphine 195
				$this->donnees['chorologie']['Statut de culture'][$lieu['1']]['valeur'] =
196
					$this->tableau_manuel['statuts_culture'][$valeur];
82 delphine 197
			}
198
		}
199
		foreach ($this->donnees['chorologie']['Présence'] as $lieu=>$valeur) {
200
			if (!isset($this->donnees['chorologie']['Statut d\'origine'][$lieu])) {
201
				$this->donnees['chorologie']['Statut d\'origine'][$lieu]['code'] = '';
85 delphine 202
				$this->donnees['chorologie']['Statut d\'origine'][$lieu]['valeur'] =
203
					$this->tableau_manuel['statuts_origine'][''];
82 delphine 204
			}
205
			if (!isset($this->donnees['chorologie']['Statut d\'introduction'][$lieu])) {
206
				$this->donnees['chorologie']['Statut d\'introduction'][$lieu]['code'] = '';
85 delphine 207
				$this->donnees['chorologie']['Statut d\'introduction'][$lieu]['valeur'] =
208
					$this->tableau_manuel['statuts_introduction'][''];
82 delphine 209
			}
210
			if (!isset($this->donnees['chorologie']['Statut de culture'][$lieu])) {
211
				$this->donnees['chorologie']['Statut de culture'][$lieu]['code'] = '';
85 delphine 212
				$this->donnees['chorologie']['Statut de culture'][$lieu]['valeur'] =
213
					$this->tableau_manuel['statuts_culture'][''];
82 delphine 214
			}
215
		}
216
	}
217
 
85 delphine 218
	private function chargerClassification() {
219
		if ($this->donnees['info']['num_tax_sup'] != '' || isset($this->donnees['retenu']['num_tax_sup'])) {
220
			if ($this->donnees['num_nom'] == $this->donnees['num_nom_retenu']) {
221
				$this->donnees['classification']['supérieurs'] = array_reverse($this->taxonDao->getClassification
222
					('Superieur', $this->referentiel, $this->donnees['info']['num_tax_sup']));
223
			} else {
224
				$this->donnees['classification']['supérieurs'] = array_reverse($this->taxonDao->getClassification
225
				('Superieur', $this->referentiel, $this->donnees['retenu']['num_tax_sup']));
226
			}
227
		}
228
		if ($this->donnees['num_nom_retenu'] != '') {
229
			$class_inf = $this->taxonDao->getClassification
230
				('Inferieur', $this->referentiel, $this->donnees['num_nom_retenu']);
88 delphine 231
			if ($class_inf != '') {
232
				$this->donnees['classification']['inférieurs'] = $class_inf['inf'];
233
				$this->donnees['niveau'] = $class_inf['niveau'];
234
			}
85 delphine 235
		}
236
	}
237
 
104 delphine 238
	private function chargerComplements() {
85 delphine 239
		$champs_manuel_technique = explode(',', $this->manuel['champs']);
240
		$champs_base_donnees = key($this->donnees['info']);
241
		$champs_supp_base = array_diff_key($this->donnees['info'], array_flip($champs_manuel_technique));
242
		foreach ($champs_supp_base as $champ=>$valeur) {
243
			if (!(preg_match('/presence_(.*)/',$champ) || preg_match('/statut_origine_(.*)/', $champ) ||
244
				 preg_match('/statut_introduction_(.*)/', $champ) || preg_match('/statut_culture_(.*)/', $champ))) {
245
				$this->donnees['complement'][$champ] = $valeur;
246
			}
247
		}
248
	}
249
 
82 delphine 250
	private function parserChaineDeRecherche($chaine) {
251
		$mots = preg_split('/ /i', $chaine, -1, PREG_SPLIT_NO_EMPTY);
252
		$parametres = array('mots' => '');
253
		$cle_precedente = null;
254
		foreach ($mots as $mot) {
255
			if (preg_match('/^(sg|gen|sp|ssp|au|an|nn|bib|nr|tax):(.*)$/', $mot, $match)) {
256
				$cle = $match[1];
257
				$cle_precedente = $cle;
258
				$valeur = $match[2];
259
				$parametres[$cle] = $valeur;
260
			} else if (!is_null($cle_precedente)) {
261
				$parametres[$cle_precedente] .= ' '.$mot;
262
			} else if (is_null($cle_precedente)) {
263
				if (empty($parametres['mots'])) {
264
					$parametres['mots'] = $mot;
265
				} else {
266
					$parametres['mots'] .= ' '.$mot;
267
				}
268
			}
269
		}
270
		return $parametres;
271
	}
272
 
88 delphine 273
	public function encodeChaine($chaine) {
274
		if (Config::get('sortie_encodage') != Config::get('appli_encodage')) {
275
			$chaine = mb_convert_encoding($chaine, Config::get('sortie_encodage'), Config::get('appli_encodage'));
276
		}
277
		$chaine = urlencode($chaine);
278
		return $chaine;
279
	}
280
 
82 delphine 281
	// retourne l'url de la fiche taxon pour les liens
78 delphine 282
	public static function getUrlFicheTaxon($params, $type) {
283
		$taxon = null;
284
		switch ($type) {
285
			case 'bas' :
286
				$taxon['num_nom'] = $params['bas_num'];
287
				break;
288
			case 'p1' :
289
				$taxon['num_nom'] = $params['p1_num'];
290
				break;
291
			case 'p2' :
292
				$taxon['num_nom'] = $params['p2_num'];
293
				break;
294
			default : break;
295
		}
296
		return Recherche::getUrlFicheTaxon($taxon);
297
	}
298
 
85 delphine 299
	// charger tableau de $this->manuel
300
	private function chargerTableauManuel($titreTableau) {
301
		$champs = explode(',', $this->manuel[$titreTableau]);
302
		foreach ($champs as $champ) {
303
			list($champ_nom, $type) = explode('=', trim($champ));
304
			$this->tableau_manuel[$titreTableau][$champ_nom] = $type;
305
		}
306
	}
307
 
78 delphine 308
 
309
}