Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

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