Subversion Repositories eFlore/Applications.del

Rev

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

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