Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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