Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 843 | Details | Compare with Previous | Last modification | View Log | RSS feed

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