Subversion Repositories Applications.referentiel

Rev

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