Subversion Repositories eFlore/Projets.eflore-projets

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
206 jpm 1
<?php
2
class TaxonsListeGenerique implements NomsListe {
3
 
4
	private $parametres = null;
5
	private $ressources = null;
6
	private $bdd = null;
7
	private $projet = null;
8
	private $versions = null;
9
	private $listeUrl = null;
10
	private $detailsHrefTpl = null;
11
	private $ontologieHrefTpl = null;
12
	private $champsProjet = array();
13
 
14
	private $nbreTotalNoms = 0;
15
	private $noms = array();
16
 
17
	public function __construct(Ressources $ressources, Parametres $parametres, Bdd $bdd) {
18
		$this->ressources = $ressources;
19
		$this->parametres = $parametres;
20
		$this->bdd = $bdd;
21
	}
22
 
23
	public function setProjet($projet) {
24
		$this->projet = $projet;
25
	}
26
 
27
	public function setVersions($versions) {
28
		$this->versions = $versions;
29
	}
30
 
31
	public function setChampsProjet($champsProjet) {
32
		$this->champsProjet = $champsProjet;
33
	}
34
 
35
	public function setDetailsHrefTpl($tpl) {
36
		$this->detailsHrefTpl = $tpl;
37
	}
38
 
39
	public function setOntologieHrefTpl($tpl) {
40
		$this->ontologieHrefTpl = $tpl;
41
	}
42
 
43
	public function setListeUrl($url) {
44
		$this->listeUrl = $url;
45
	}
46
 
47
	public function consulter() {
48
		$this->noms = $this->rechercher();
49
		$this->nbreNomsTotal = $this->recupererNombreNomsTotal();
50
		$this->trierNoms();
51
		$retour = $this->construireTableauRetour();
52
		return $retour;
53
	}
54
 
55
	private function getTable() {
56
		$versions = $this->versions->getVersions();
57
		return $this->projet.'_v'.end($versions);
58
	}
59
 
60
	private function rechercher() {
61
		$resultats = array();
62
		$recherche = $this->parametres->get('recherche');
63
 
64
		if ($recherche == 'stricte') {
65
			$resultats = $this->rechercherStricte();
66
		} else if ($recherche == 'etendue') {
67
			$resultats = $this->rechercherEtendue();
68
		} else if ($recherche == 'floue') {
69
			$resultats = $this->rechercherFloue();
70
		}
71
 
72
		return $resultats;
73
	}
74
 
75
	private function rechercherStricte() {
76
		$table = $this->getTable();
77
		$conditions = array();
78
		if ($masque = $this->parametres->getMasquePourBdd()) {
79
			$conditions[] = "ns.nom_sci = $masque";
80
		}
81
		if ($masqueSg = $this->parametres->getMasquePourBdd('sg')) {
82
			$conditions[] = "ns.nom_supra_generique = $masqueSg";
83
		}
84
		if ($masqueGen = $this->parametres->getMasquePourBdd('gen')) {
85
			$conditions[] = "ns.genre = $masqueGen";
86
		}
87
		if ($masqueSp = $this->parametres->getMasquePourBdd('sp')) {
88
			$conditions[] = "ns.epithete_sp = $masqueSp";
89
		}
90
 
91
		$requete = 'SELECT SQL_CALC_FOUND_ROWS ns.*,  '.
92
					'	nr.nom_sci AS nr_nom_sci, nb.nom_sci AS nb_nom_sci '.
93
					"FROM $table AS ns ".
94
					"	LEFT JOIN $table AS nr ON (ns.num_nom_retenu = nr.num_nom) ".
95
					"	LEFT JOIN $table AS nb ON (ns.basionyme = nb.num_nom) ".
96
					'WHERE ns.num_nom = ns.num_nom_retenu '.
97
					implode(' AND ', $conditions).
98
					'ORDER BY ns.nom_sci ASC '.
99
					'LIMIT 0,100';
100
		$resultats = $this->bdd->recupererTous($requete);
101
 
102
		return $resultats;
103
	}
104
 
105
	private function rechercherEtendue() {
106
		$table = $this->getTable();
107
		$conditions = array();
108
		if ($masque = $this->parametres->getMasquePourBdd()) {
109
			$conditions[] = "ns.nom_sci LIKE $masque";
110
		}
111
		if ($masqueSg = $this->parametres->getMasquePourBdd('sg')) {
112
			$conditions[] = "ns.nom_supra_generique LIKE $masqueSg";
113
		}
114
		if ($masqueGen = $this->parametres->getMasquePourBdd('gen')) {
115
			$conditions[] = "ns.genre LIKE $masqueGen";
116
		}
117
		if ($masqueSp = $this->parametres->getMasquePourBdd('sp')) {
118
			$conditions[] = "ns.epithete_sp LIKE $masqueSp";
119
		}
120
		$requete = 'SELECT SQL_CALC_FOUND_ROWS ns.*,  '.
121
			'	nr.nom_sci AS nr_nom_sci, nb.nom_sci AS nb_nom_sci '.
122
			"FROM $table AS ns ".
123
			"	LEFT JOIN $table AS nr ON (ns.num_nom_retenu = nr.num_nom) ".
124
			"	LEFT JOIN $table AS nb ON (ns.basionyme = nb.num_nom) ".
125
			'WHERE ns.num_nom = ns.num_nom_retenu '.
126
			implode(' AND ', $conditions).
127
			'ORDER BY ns.nom_sci ASC '.
128
			'LIMIT 0,100';
129
 
130
		$resultats = $this->bdd->recupererTous($requete);
131
		return $resultats;
132
	}
133
 
134
	private function rechercherFloue() {
135
		$table = $this->getTable();
136
		$masque = $this->parametres->getMasquePourBdd();
137
		$requete = 'SELECT SQL_CALC_FOUND_ROWS ns.*,  '.
138
			'	nr.nom_sci AS nr_nom_sci, nb.nom_sci AS nb_nom_sci '.
139
			"FROM $table AS ns ".
140
			"	LEFT JOIN $table AS nr ON (ns.num_nom_retenu = nr.num_nom) ".
141
			"	LEFT JOIN $table AS nb ON (ns.basionyme = nb.num_nom) ".
142
			'WHERE ns.num_nom = ns.num_nom_retenu '.
143
			($masque ?
144
				"	(SOUNDEX(ns.nom_sci) = SOUNDEX($masque)) ".
145
				"	OR (SOUNDEX(REVERSE(ns.nom_sci)) = SOUNDEX(REVERSE($masque))) " : '').
146
			'ORDER BY ns.nom_sci ASC '.
147
			'LIMIT 0,100';
148
		$resultats = $this->bdd->recupererTous($requete);
149
		return $resultats;
150
	}
151
 
152
	private function recupererNombreNomsTotal() {
153
		$requete = 'SELECT FOUND_ROWS() AS nbre';
154
		$nombre = $this->bdd->recuperer($requete);
155
		return (int) $nombre['nbre'];
156
	}
157
 
158
	private function trierNoms() {
159
		$recherche = $this->parametres->get('recherche');
160
		if ($recherche == 'floue') {
161
			$this->trierRechercheFloue();
162
		}
163
	}
164
 
165
	public function trierRechercheFloue() {
166
		$nomDemande = $this->parametres->get('masque');
167
		$nomDemandeSimple = strtolower(Chaine::supprimerAccents($nomDemande));
168
 
169
		foreach ($this->noms as $id => $nom) {
170
			$nomFlouSimple = strtolower(Chaine::supprimerAccents($nom['nom_sci']));
171
			// Prime pour la ressemblance globale :
172
			$score = 500 - levenshtein($nomFlouSimple, $nomDemandeSimple);
173
			// On affine
174
			$score += similar_text($nomDemandeSimple, $nomFlouSimple) * 3;
175
			$this->noms[$id]['score'] = $score;
176
		}
177
		$noms = $this->noms;
178
		$this->noms = Tableau::trierMD($noms, array('score' => false));
179
		//print_r($this->noms);
180
	}
181
 
182
	private function construireTableauRetour() {
183
		$retour = array('entete' => array(), 'resultats' => array());
184
		$retour['resultats'] = $this->construireResultats();
185
		$retour['entete'] = $this->construireEntete();
186
		return $retour;
187
	}
188
 
189
	private function construireResultats() {
190
		$nomsFormates = array();
191
		foreach ($this->noms as $nom) {
192
			$id = $nom['num_nom'];
193
			$nomsFormates[$id] = $this->formaterNom($nom);
194
		}
195
		return $nomsFormates;
196
	}
197
 
198
	private function formaterNom($infos) {
199
		$nomAFormater = new NomDO($infos);
200
		$formateur = new NomFormateur($nomAFormater);
201
		$formateur->setBdd($this->bdd);
202
		$formateur->setChampsProjet($this->champsProjet);
203
		$formateur->setDetailsHrefTpl($this->detailsHrefTpl);
204
		$formateur->setOntologieHrefTpl($this->ontologieHrefTpl);
205
		$formateur->setChampsRetour($this->parametres->getListe('retour.champs'));
206
		$nom = $formateur->formaterListe();
207
		return $nom;
208
	}
209
 
210
	private function formaterHref($nom) {
211
		$href = sprintf($this->detailsHrefTpl, $nom['num_nom']);
212
		return $href;
213
	}
214
 
215
	private function construireEntete() {
216
		$entete = array('masque' => '', 'depart' => 0, 'limite' => 100, 'total' => 0);
217
		$entete['masque'] = $this->formaterEnteteMasque();
218
		$entete['depart'] = (int) $this->parametres->get('navigation.depart');
219
		$entete['limite'] = (int) $this->parametres->get('navigation.limite');
220
		$entete['total'] = $this->nbreNomsTotal;
221
		if ($hrefPrecedent = $this->formaterEnteteHrefPrecedent()) {
222
			$entete['href.precedent'] = $hrefPrecedent;
223
		}
224
		if ($hrefSuivant = $this->formaterEnteteHrefSuivant()) {
225
			$entete['href.suivant'] = $hrefSuivant;
226
		}
227
		return $entete;
228
	}
229
 
230
	private function formaterEnteteMasque() {
231
		$masqueComplet = array();
232
		if ($this->parametres->exister('masque')) {
233
			$masque = '';
234
			$masque .= 'nom_sci='.$this->parametres->get('masque');
235
			if ($this->parametres->get('recherche') == 'etendue') {
236
				$masque .= '%';
237
			}
238
			$masqueComplet[] = $masque;
239
		}
240
		if ($this->parametres->exister('masque.sg')) {
241
			$masque = '';
242
			$masque .= 'nom_supra_generique='.$this->parametres->get('masque.sg');
243
			if ($this->parametres->get('recherche') == 'etendue') {
244
				$masque .= '%';
245
			}
246
			$masqueComplet[] = $masque;
247
		}
248
		if ($this->parametres->exister('masque.gen')) {
249
			$masque = '';
250
			$masque .= 'genre='.$this->parametres->get('masque.gen');
251
			if ($this->parametres->get('recherche') == 'etendue') {
252
				$masque .= '%';
253
			}
254
			$masqueComplet[] = $masque;
255
		}
256
		if ($this->parametres->exister('masque.sp')) {
257
			$masque = '';
258
			$masque .= 'epithete_sp='.$this->parametres->get('masque.sp');
259
			if ($this->parametres->get('recherche') == 'etendue') {
260
				$masque .= '%';
261
			}
262
			$masqueComplet[] = $masque;
263
		}
264
		return implode('&', $masqueComplet);
265
	}
266
 
267
	private function formaterEnteteHrefPrecedent() {
268
		$limite = $this->parametres->get('navigation.limite');
269
		$departActuel = $this->parametres->get('navigation.depart');
270
		$departPrecedent = $departActuel - $limite;
271
		$href = null;
272
		if ($departPrecedent >= 0) {
273
			$squelette = $this->construireTplHrefNavigation();
274
			$href = sprintf($squelette, $departPrecedent, $limite);
275
		}
276
		return $href;
277
	}
278
 
279
	private function formaterEnteteHrefSuivant() {
280
		$limite = $this->parametres->get('navigation.limite');
281
		$departActuel = $this->parametres->get('navigation.depart');
282
		$departSuivant = $departActuel + $limite;
283
		$href = null;
284
		if ($departSuivant < $this->nbreNomsTotal) {
285
			$squelette = $this->construireTplHrefNavigation();
286
			$href = sprintf($squelette, $departSuivant, $limite);
287
		}
288
		return $href;
289
	}
290
 
291
	private function construireTplHrefNavigation() {
292
		$requetes = array();
293
		$this->parametres->rewind();
294
		while (is_null($parametre = $this->parametres->key()) === false) {
295
			if (strpos($parametre, 'navigation') === false) {
296
				$valeur = $this->parametres->current();
297
				$requetes[] = "$parametre=$valeur";
298
			}
299
			$this->parametres->next();
300
		}
301
		$requetes[] = "navigation.depart=%s";
302
		$requetes[] = "navigation.limite=%s";
303
		$tpl = $this->listeUrl.'?'.implode('&', $requetes);
304
		return $tpl;
305
	}
306
}
307
?>