Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2212 arthur 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Navigation gère les url de navigation en fonction d'un départ et d'une limite
5
 *
6
 * @category  DEL
7
 * @package   Services
8
 * @package   Bibliotheque
9
 * @version   0.1
10
 * @author    Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author    Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author    Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license   GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
16
*/
17
class Navigation {
18
 
19
	private $conteneur;
20
	private $parametresUrl;
21
	private $ressourcesUrl;
22
	private $serviceNom;
23
	private $filtresPossibles;
24
	private $filtresActifs;
25
 
26
	private $total;
27
	private $sansLimite;
28
 
29
	/**
30
	 * Constructeur de la classe Navigation
31
	 * @param Array $parametresUrl (optionnel) la liste des paramètre issus du Conteneur
32
	 */
33
	public function __construct($conteneur) {
34
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
35
 
36
		$contexte = $this->conteneur->getContexte();
37
		$this->parametresUrl = $contexte->getQS();
38
		$this->serviceNom = $contexte->getRessource(1);
39
 
40
		$ressources = $contexte->getRessource();
41
		$this->ressourcesUrl = implode('/', array_slice($ressources, 1));
42
 
43
		$this->filtresPossibles = $this->conteneur->getparametreTableau($this->serviceNom.'.masques_possibles');
44
		$this->chargerFiltresActifs();
45
	}
46
 
47
	private function chargerFiltresActifs() {
48
		if ($this->parametresUrl != null) {
49
			foreach ($this->parametresUrl as $paramNom => $valeur) {
50
				if (in_array($paramNom, $this->filtresPossibles)) {
51
					$this->filtresActifs[$paramNom] = $valeur;
52
				}
53
			}
54
		}
55
	}
56
 
57
	/**
58
	 * Obtenir la valeur courante de départ
59
	 */
60
	public function getDepart() {
61
		$navDepart = $this->getParamUrl('navigation.depart');
62
		return ($navDepart == null) ? 0 : $navDepart ;
63
	}
64
 
65
	/**
66
	 * Obtenir la limite courante
67
	 */
68
	public function getLimite() {
69
		$limiteParam = $this->getParamUrl('navigation.limite');
70
		$limite = 10;
71
		if ($limiteParam != null && is_numeric($limiteParam)) {
72
			$limite = ($limiteParam < 1000) ? $limiteParam : 1000;// Pour éviter les abus !
73
		}
74
		return $limite;
75
	}
76
 
77
	private function getParamUrl($nom) {
78
		$valeur = isset($this->parametresUrl[$nom]) ? $this->parametresUrl[$nom] : null;
79
		return $valeur;
80
	}
81
 
82
	/**
83
	 * Récupérer l'url de navigation en concaténant d'éventuels paramètres
84
	 * @param $depart l'entier de départ de la recherche
85
	 * @param $limite le nombre de résultats à retourner
86
	 * @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels
87
	 */
88
	private function obtenirUrlNavigation($depart, $limite) {
89
		$parametres = $this->parametresUrl;
90
		$parametres['navigation.depart'] = $depart;
91
		$parametres['navigation.limite'] = $limite;
92
 
93
		$urlServiceBase = $this->conteneur->getParametre('url_service_base').$this->ressourcesUrl;
94
		$urlNavigation = $this->conteneur->getUrl($urlServiceBase);
95
		$urlNavigation->setOption(Url::OPTION_ENCODER_VALEURS, true);
96
		$urlNavigation->setRequete($parametres);
97
		$url = $urlNavigation->getURL();
98
		return $url;
99
	}
100
 
101
	/**
102
	 * Récupérer le lien pour afficher les images précédentes en fonction des paramètres
103
	 */
104
	public function recupererHrefPrecedent() {
105
		$departActuel = $this->getDepart();
106
		$limite = $this->getLimite();
107
		$departPrecedent = $departActuel - $limite;
108
		$url = null;
109
		if ($departActuel > 0) {
110
			$url = $this->obtenirUrlNavigation($departPrecedent, $limite);
111
		}
112
		return $url;
113
	}
114
 
115
	/**
116
	 * Récupérer le lien pour afficher les images suivantes en fonction des paramètres
117
	 */
118
	public function recupererHrefSuivant() {
119
		$departActuel = $this->getDepart();
120
		$limite = $this->getLimite();
121
		$departSuivant = $departActuel + $limite;
122
		$url = null;
123
		if ($departSuivant < $this->total) {
124
			$url = $this->obtenirUrlNavigation($departSuivant, $limite);
125
		}
126
		return $url;
127
	}
128
 
129
	/**
130
	 * Retourner le nombre total d'éléments
131
	 */
132
	public function getTotal() {
133
		return $this->total;
134
	}
135
 
136
	/**
137
	 * Enregistrer le nombre total d'éléments
138
	 * @param int $total le nombre d'éléments
139
	 */
140
	public function setTotal($total) {
141
		$this->total = $total;
142
	}
143
 
144
	/**
145
	 * Changer la valeur de sans limite pour ne pas l'afficher dans l'entete
146
	 * */
147
	public function setSansLimite() {
148
		$this->sansLimite = true;
149
	}
150
 
151
	/**
152
	 * Génère un tableau contenant les informations pour l'entête des services renvoyant une liste de résultats.
153
	 *
154
	 * @return array Le tableau d'entête prés à être encodé en JSON.
155
	 */
156
	public function getEntete() {
157
		$entete = array();
158
		$entete['masque'] = $this->getChaineFiltresActifs();
159
 
160
		$entete['total'] = $this->getTotal();
161
		if ($this->sansLimite == false) {
162
			$entete['depart'] = (int) $this->getDepart();
163
			$entete['limite'] = (int) $this->getLimite();
164
 
165
			$lienPrecedent = $this->recupererHrefPrecedent();
166
			if ($lienPrecedent != null) {
167
				$entete['href.precedent'] = $lienPrecedent;
168
			}
169
 
170
			$lienSuivant = $this->recupererHrefSuivant();
171
			if ($lienSuivant != null) {
172
				$entete['href.suivant'] = $lienSuivant;
173
			}
174
		}
175
 
176
		return $entete;
177
	}
178
 
179
	/**
180
	 * Retourne les filtres au format chaine sous la forme filtre1=valeur1&filtre2=valeur2.
181
	 *
182
	 * @return String la chaine de caractères ou une chaine vide si pas de filtre.
183
	 */
184
	private function getChaineFiltresActifs() {
185
		return (!empty($this->filtresActifs)) ? http_build_query($this->filtresActifs) : '';
186
	}
187
 
188
	/**
189
	 * Récupérer tout ou partie des filtres présent dans l'url.
190
	 *
191
	 * @param String $filtreNom (optionnel) le nom du filtre tel que présent dans l'url.
192
	 * @return mixed si un filtre est passé en paramètre retourn la valeur correspondante, si pas de paramétre
193
	 * retourne le tableau complet des filtres. False en cas d'erreur.
194
	 * */
195
	public function getFiltre($filtreNom = null) {
196
		$retour = false;
197
		if ($filtreNom == null) {
198
			$retour = $this->filtresActifs;
199
		} else if ($filtreNom != null && isset($this->filtresActifs[$filtreNom])) {
200
			$retour = $this->filtresActifs[$filtreNom];
201
		}
202
		return $retour;
203
	}
204
}