Subversion Repositories eFlore/Applications.del

Rev

Rev 1815 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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