Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 209 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 209 Rev 215
1
<?php
1
<?php
2
class TaxonsListeGenerique implements NomsListe {
2
class TaxonsListeGenerique {
3
 
3
 
4
	private $parametres = null;
4
	private $parametres = null;
5
	private $ressources = null;
5
	private $ressources = null;
6
	private $nomDao = null;
6
	private $nomDao = null;
7
	private $nomFormateur = null;
7
	private $nomFormateur = null;
8
 
8
 
9
	private $listeUrl = null;
9
	private $listeUrl = null;
10
	private $nbreTotalNoms = 0;
10
	private $nbreTotalNoms = 0;
11
	private $noms = array();
11
	private $noms = array();
12
 
12
 
13
	public function __construct(Ressources $ressources, Parametres $parametres, NomDAO $nomDao, NomFormateur $nomFormateur) {
13
	public function __construct(Ressources $ressources, Parametres $parametres, NomDAO $nomDao, NomFormateur $nomFormateur) {
14
		$this->ressources = $ressources;
14
		$this->ressources = $ressources;
15
		$this->parametres = $parametres;
15
		$this->parametres = $parametres;
16
		$this->nomDao = $nomDao;
16
		$this->nomDao = $nomDao;
17
		$this->nomFormateur = $nomFormateur;
17
		$this->nomFormateur = $nomFormateur;
18
	}
18
	}
19
 
19
 
20
	public function setListeUrl($url) {
20
	public function setListeUrl($url) {
21
		$this->listeUrl = $url;
21
		$this->listeUrl = $url;
22
	}
22
	}
23
 
23
 
24
	public function consulter() {
24
	public function consulter() {
25
		$this->noms = $this->rechercher();
25
		$this->noms = $this->rechercher();
26
		$this->nbreNomsTotal = $this->nomDao->recupererNombreNomsTotal();
26
		$this->nbreNomsTotal = $this->nomDao->recupererNombreNomsTotal();
27
		$this->trierNoms();
27
		$this->trierNoms();
28
		$retour = $this->construireTableauRetour();
28
		$retour = $this->construireTableauRetour();
29
		return $retour;
29
		return $retour;
30
	}
30
	}
31
 
31
 
32
	private function rechercher() {
32
	private function rechercher() {
33
		$resultats = array();
33
		$resultats = array();
34
		$recherche = $this->parametres->get('recherche');
34
		$recherche = $this->parametres->get('recherche');
35
 
35
 
36
		if ($recherche == 'stricte') {
36
		if ($recherche == 'stricte') {
37
			$resultats = $this->nomDao->rechercherStricte();
37
			$resultats = $this->nomDao->rechercherStricte();
38
		} else if ($recherche == 'etendue') {
38
		} else if ($recherche == 'etendue') {
39
			$resultats = $this->nomDao->rechercherEtendue();
39
			$resultats = $this->nomDao->rechercherEtendue();
40
		} else if ($recherche == 'floue') {
40
		} else if ($recherche == 'floue') {
41
			$resultats = $this->nomDao->rechercherFloue();
41
			$resultats = $this->nomDao->rechercherFloue();
42
		}
42
		}
43
 
43
 
44
		return $resultats;
44
		return $resultats;
45
	}
45
	}
46
 
46
 
47
	private function trierNoms() {
47
	private function trierNoms() {
48
		$recherche = $this->parametres->get('recherche');
48
		$recherche = $this->parametres->get('recherche');
49
		if ($recherche == 'floue') {
49
		if ($recherche == 'floue') {
50
			$this->trierRechercheFloue();
50
			$this->trierRechercheFloue();
51
		}
51
		}
52
	}
52
	}
53
 
53
 
54
	public function trierRechercheFloue() {
54
	public function trierRechercheFloue() {
55
		$nomDemande = $this->parametres->get('masque');
55
		$nomDemande = $this->parametres->get('masque');
56
		$nomDemandeSimple = strtolower(Chaine::supprimerAccents($nomDemande));
56
		$nomDemandeSimple = strtolower(Chaine::supprimerAccents($nomDemande));
57
 
57
 
58
		foreach ($this->noms as $id => $nom) {
58
		foreach ($this->noms as $id => $nom) {
59
			$nomFlouSimple = strtolower(Chaine::supprimerAccents($nom['nom_sci']));
59
			$nomFlouSimple = strtolower(Chaine::supprimerAccents($nom['nom_sci']));
60
			// Prime pour la ressemblance globale :
60
			// Prime pour la ressemblance globale :
61
			$score = 500 - levenshtein($nomFlouSimple, $nomDemandeSimple);
61
			$score = 500 - levenshtein($nomFlouSimple, $nomDemandeSimple);
62
			// On affine
62
			// On affine
63
			$score += similar_text($nomDemandeSimple, $nomFlouSimple) * 3;
63
			$score += similar_text($nomDemandeSimple, $nomFlouSimple) * 3;
64
			$this->noms[$id]['score'] = $score;
64
			$this->noms[$id]['score'] = $score;
65
		}
65
		}
66
		$noms = $this->noms;
66
		$noms = $this->noms;
67
		$this->noms = Tableau::trierMD($noms, array('score' => false));
67
		$this->noms = Tableau::trierMD($noms, array('score' => false));
68
		//print_r($this->noms);
68
		//print_r($this->noms);
69
	}
69
	}
70
 
70
 
71
	private function construireTableauRetour() {
71
	private function construireTableauRetour() {
72
		$retour = array('entete' => array(), 'resultats' => array());
72
		$retour = array('entete' => array(), 'resultats' => array());
73
		$retour['resultats'] = $this->construireResultats();
73
		$retour['resultats'] = $this->construireResultats();
74
		$retour['entete'] = $this->construireEntete();
74
		$retour['entete'] = $this->construireEntete();
75
		return $retour;
75
		return $retour;
76
	}
76
	}
77
 
77
 
78
	private function construireResultats() {
78
	private function construireResultats() {
79
		$nomsFormates = array();
79
		$nomsFormates = array();
80
		foreach ($this->noms as $nom) {
80
		foreach ($this->noms as $nom) {
81
			$id = $nom['num_nom'];
81
			$id = $nom['num_nom'];
82
			$nomsFormates[$id] = $this->formaterNom($nom);
82
			$nomsFormates[$id] = $this->formaterNom($nom);
83
		}
83
		}
84
		return $nomsFormates;
84
		return $nomsFormates;
85
	}
85
	}
86
 
86
 
87
	private function formaterNom($infos) {
87
	private function formaterNom($infos) {
88
		$nomAFormater = new NomDO($infos);
88
		$nomAFormater = new NomDO($infos);
89
		$this->nomFormateur->setNomAFormater($nomAFormater);
89
		$this->nomFormateur->setNomAFormater($nomAFormater);
90
		$this->nomFormateur->setChampsRetour($this->parametres->getListe('retour.champs'));
90
		$this->nomFormateur->setChampsRetour($this->parametres->getListe('retour.champs'));
91
		$nom = $this->nomFormateur->formaterListe();
91
		$nom = $this->nomFormateur->formaterListe();
92
		return $nom;
92
		return $nom;
93
	}
93
	}
94
 
94
 
95
	private function construireEntete() {
95
	private function construireEntete() {
96
		$entete = array('masque' => '', 'depart' => 0, 'limite' => 100, 'total' => 0);
96
		$entete = array('masque' => '', 'depart' => 0, 'limite' => 100, 'total' => 0);
97
		$entete['masque'] = $this->formaterEnteteMasque();
97
		$entete['masque'] = $this->formaterEnteteMasque();
98
		$entete['depart'] = (int) $this->parametres->get('navigation.depart');
98
		$entete['depart'] = (int) $this->parametres->get('navigation.depart');
99
		$entete['limite'] = (int) $this->parametres->get('navigation.limite');
99
		$entete['limite'] = (int) $this->parametres->get('navigation.limite');
100
		$entete['total'] = $this->nbreNomsTotal;
100
		$entete['total'] = $this->nbreNomsTotal;
101
		if ($hrefPrecedent = $this->formaterEnteteHrefPrecedent()) {
101
		if ($hrefPrecedent = $this->formaterEnteteHrefPrecedent()) {
102
			$entete['href.precedent'] = $hrefPrecedent;
102
			$entete['href.precedent'] = $hrefPrecedent;
103
		}
103
		}
104
		if ($hrefSuivant = $this->formaterEnteteHrefSuivant()) {
104
		if ($hrefSuivant = $this->formaterEnteteHrefSuivant()) {
105
			$entete['href.suivant'] = $hrefSuivant;
105
			$entete['href.suivant'] = $hrefSuivant;
106
		}
106
		}
107
		return $entete;
107
		return $entete;
108
	}
108
	}
109
 
109
 
110
	private function formaterEnteteMasque() {
110
	private function formaterEnteteMasque() {
111
		$masqueComplet = array();
111
		$masqueComplet = array();
112
		if ($this->parametres->exister('masque')) {
112
		if ($this->parametres->exister('masque')) {
113
			$masque = '';
113
			$masque = '';
114
			$masque .= 'nom_sci='.$this->parametres->get('masque');
114
			$masque .= 'nom_sci='.$this->parametres->get('masque');
115
			if ($this->parametres->get('recherche') == 'etendue') {
115
			if ($this->parametres->get('recherche') == 'etendue') {
116
				$masque .= '%';
116
				$masque .= '%';
117
			}
117
			}
118
			$masqueComplet[] = $masque;
118
			$masqueComplet[] = $masque;
119
		}
119
		}
120
		if ($this->parametres->exister('masque.sg')) {
120
		if ($this->parametres->exister('masque.sg')) {
121
			$masque = '';
121
			$masque = '';
122
			$masque .= 'nom_supra_generique='.$this->parametres->get('masque.sg');
122
			$masque .= 'nom_supra_generique='.$this->parametres->get('masque.sg');
123
			if ($this->parametres->get('recherche') == 'etendue') {
123
			if ($this->parametres->get('recherche') == 'etendue') {
124
				$masque .= '%';
124
				$masque .= '%';
125
			}
125
			}
126
			$masqueComplet[] = $masque;
126
			$masqueComplet[] = $masque;
127
		}
127
		}
128
		if ($this->parametres->exister('masque.gen')) {
128
		if ($this->parametres->exister('masque.gen')) {
129
			$masque = '';
129
			$masque = '';
130
			$masque .= 'genre='.$this->parametres->get('masque.gen');
130
			$masque .= 'genre='.$this->parametres->get('masque.gen');
131
			if ($this->parametres->get('recherche') == 'etendue') {
131
			if ($this->parametres->get('recherche') == 'etendue') {
132
				$masque .= '%';
132
				$masque .= '%';
133
			}
133
			}
134
			$masqueComplet[] = $masque;
134
			$masqueComplet[] = $masque;
135
		}
135
		}
136
		if ($this->parametres->exister('masque.sp')) {
136
		if ($this->parametres->exister('masque.sp')) {
137
			$masque = '';
137
			$masque = '';
138
			$masque .= 'epithete_sp='.$this->parametres->get('masque.sp');
138
			$masque .= 'epithete_sp='.$this->parametres->get('masque.sp');
139
			if ($this->parametres->get('recherche') == 'etendue') {
139
			if ($this->parametres->get('recherche') == 'etendue') {
140
				$masque .= '%';
140
				$masque .= '%';
141
			}
141
			}
142
			$masqueComplet[] = $masque;
142
			$masqueComplet[] = $masque;
143
		}
143
		}
144
		return implode('&', $masqueComplet);
144
		return implode('&', $masqueComplet);
145
	}
145
	}
146
 
146
 
147
	private function formaterEnteteHrefPrecedent() {
147
	private function formaterEnteteHrefPrecedent() {
148
		$limite = $this->parametres->get('navigation.limite');
148
		$limite = $this->parametres->get('navigation.limite');
149
		$departActuel = $this->parametres->get('navigation.depart');
149
		$departActuel = $this->parametres->get('navigation.depart');
150
		$departPrecedent = $departActuel - $limite;
150
		$departPrecedent = $departActuel - $limite;
151
		$href = null;
151
		$href = null;
152
		if ($departPrecedent >= 0) {
152
		if ($departPrecedent >= 0) {
153
			$squelette = $this->construireTplHrefNavigation();
153
			$squelette = $this->construireTplHrefNavigation();
154
			$href = sprintf($squelette, $departPrecedent, $limite);
154
			$href = sprintf($squelette, $departPrecedent, $limite);
155
		}
155
		}
156
		return $href;
156
		return $href;
157
	}
157
	}
158
 
158
 
159
	private function formaterEnteteHrefSuivant() {
159
	private function formaterEnteteHrefSuivant() {
160
		$limite = $this->parametres->get('navigation.limite');
160
		$limite = $this->parametres->get('navigation.limite');
161
		$departActuel = $this->parametres->get('navigation.depart');
161
		$departActuel = $this->parametres->get('navigation.depart');
162
		$departSuivant = $departActuel + $limite;
162
		$departSuivant = $departActuel + $limite;
163
		$href = null;
163
		$href = null;
164
		if ($departSuivant < $this->nbreNomsTotal) {
164
		if ($departSuivant < $this->nbreNomsTotal) {
165
			$squelette = $this->construireTplHrefNavigation();
165
			$squelette = $this->construireTplHrefNavigation();
166
			$href = sprintf($squelette, $departSuivant, $limite);
166
			$href = sprintf($squelette, $departSuivant, $limite);
167
		}
167
		}
168
		return $href;
168
		return $href;
169
	}
169
	}
170
 
170
 
171
	private function construireTplHrefNavigation() {
171
	private function construireTplHrefNavigation() {
172
		$requetes = array();
172
		$requetes = array();
173
		$this->parametres->rewind();
173
		$this->parametres->rewind();
174
		while (is_null($parametre = $this->parametres->key()) === false) {
174
		while (is_null($parametre = $this->parametres->key()) === false) {
175
			if (strpos($parametre, 'navigation') === false) {
175
			if (strpos($parametre, 'navigation') === false) {
176
				$valeur = $this->parametres->current();
176
				$valeur = $this->parametres->current();
177
				$requetes[] = "$parametre=$valeur";
177
				$requetes[] = "$parametre=$valeur";
178
			}
178
			}
179
			$this->parametres->next();
179
			$this->parametres->next();
180
		}
180
		}
181
		$requetes[] = "navigation.depart=%s";
181
		$requetes[] = "navigation.depart=%s";
182
		$requetes[] = "navigation.limite=%s";
182
		$requetes[] = "navigation.limite=%s";
183
		$tpl = $this->listeUrl.'?'.implode('&', $requetes);
183
		$tpl = $this->listeUrl.'?'.implode('&', $requetes);
184
		return $tpl;
184
		return $tpl;
185
	}
185
	}
186
}
186
}
187
?>
187
?>