Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
723 gduche 1
<?php
1794 jpm 2
// declare(encoding='UTF-8');
723 gduche 3
/**
1793 jpm 4
 * Navigation gère les url de navigation en fonction d'un départ et d'une limite
5
 *
1815 jpm 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>
1793 jpm 15
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
723 gduche 16
*/
17
class Navigation {
1293 jpm 18
 
1794 jpm 19
	private $conteneur;
20
	private $parametresUrl;
1922 jpm 21
	private $ressourcesUrl;
1806 jpm 22
	private $serviceNom;
23
	private $filtresPossibles;
24
	private $filtresActifs;
25
 
723 gduche 26
	private $total;
1794 jpm 27
	private $sansLimite;
1293 jpm 28
 
723 gduche 29
	/**
30
	 * Constructeur de la classe Navigation
1794 jpm 31
	 * @param Array $parametresUrl (optionnel) la liste des paramètre issus du Conteneur
32
	 */
1806 jpm 33
	public function __construct($conteneur) {
1794 jpm 34
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
1806 jpm 35
 
36
		$contexte = $this->conteneur->getContexte();
37
		$this->parametresUrl = $contexte->getQS();
38
		$this->serviceNom = $contexte->getRessource(1);
39
 
1922 jpm 40
		$ressources = $contexte->getRessource();
41
		$this->ressourcesUrl = implode('/', array_slice($ressources, 1));
42
 
1808 jpm 43
		$this->filtresPossibles = $this->conteneur->getparametreTableau($this->serviceNom.'.masques_possibles');
1806 jpm 44
		$this->chargerFiltresActifs();
723 gduche 45
	}
1293 jpm 46
 
1806 jpm 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
 
723 gduche 57
	/**
58
	 * Obtenir la valeur courante de départ
1794 jpm 59
	 */
723 gduche 60
	public function getDepart() {
1806 jpm 61
		$navDepart = $this->getParamUrl('navigation.depart');
62
		return ($navDepart == null) ? 0 : $navDepart ;
723 gduche 63
	}
1293 jpm 64
 
723 gduche 65
	/**
66
	 * Obtenir la limite courante
1794 jpm 67
	 */
723 gduche 68
	public function getLimite() {
1806 jpm 69
		$limiteParam = $this->getParamUrl('navigation.limite');
1293 jpm 70
		$limite = 10;
1806 jpm 71
		if ($limiteParam != null && is_numeric($limiteParam)) {
1794 jpm 72
			$limite = ($limiteParam < 1000) ? $limiteParam : 1000;// Pour éviter les abus !
1293 jpm 73
		}
74
		return $limite;
723 gduche 75
	}
1293 jpm 76
 
1806 jpm 77
	private function getParamUrl($nom) {
78
		$valeur = isset($this->parametresUrl[$nom]) ? $this->parametresUrl[$nom] : null;
79
		return $valeur;
80
	}
81
 
723 gduche 82
	/**
1794 jpm 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
	 */
723 gduche 88
	private function obtenirUrlNavigation($depart, $limite) {
1794 jpm 89
		$parametres = $this->parametresUrl;
1793 jpm 90
		$parametres['navigation.depart'] = $depart;
91
		$parametres['navigation.limite'] = $limite;
1293 jpm 92
 
1922 jpm 93
		$urlServiceBase = $this->conteneur->getParametre('url_service_base').$this->ressourcesUrl;
1806 jpm 94
		$urlNavigation = $this->conteneur->getUrl($urlServiceBase);
95
		$urlNavigation->setOption(Url::OPTION_ENCODER_VALEURS, true);
96
		$urlNavigation->setRequete($parametres);
97
		$url = $urlNavigation->getURL();
1793 jpm 98
		return $url;
723 gduche 99
	}
1293 jpm 100
 
723 gduche 101
	/**
1794 jpm 102
	 * Récupérer le lien pour afficher les images précédentes en fonction des paramètres
103
	 */
723 gduche 104
	public function recupererHrefPrecedent() {
105
		$departActuel = $this->getDepart();
106
		$limite = $this->getLimite();
107
		$departPrecedent = $departActuel - $limite;
108
		$url = null;
109
		if ($departActuel > 0) {
1794 jpm 110
			$url = $this->obtenirUrlNavigation($departPrecedent, $limite);
723 gduche 111
		}
112
		return $url;
113
	}
1293 jpm 114
 
723 gduche 115
	/**
116
	 * Récupérer le lien pour afficher les images suivantes en fonction des paramètres
1794 jpm 117
	 */
723 gduche 118
	public function recupererHrefSuivant() {
119
		$departActuel = $this->getDepart();
120
		$limite = $this->getLimite();
121
		$departSuivant = $departActuel + $limite;
122
		$url = null;
123
		if ($departSuivant < $this->total) {
1794 jpm 124
			$url = $this->obtenirUrlNavigation($departSuivant, $limite);
723 gduche 125
		}
126
		return $url;
127
	}
1293 jpm 128
 
723 gduche 129
	/**
130
	 * Retourner le nombre total d'éléments
1794 jpm 131
	 */
723 gduche 132
	public function getTotal() {
133
		return $this->total;
134
	}
1293 jpm 135
 
723 gduche 136
	/**
137
	 * Enregistrer le nombre total d'éléments
138
	 * @param int $total le nombre d'éléments
1794 jpm 139
	 */
723 gduche 140
	public function setTotal($total) {
141
		$this->total = $total;
142
	}
1794 jpm 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
	/**
1806 jpm 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
	 */
1794 jpm 156
	public function getEntete() {
157
		$entete = array();
1806 jpm 158
		$entete['masque'] = $this->getChaineFiltresActifs();
1794 jpm 159
 
160
		$entete['total'] = $this->getTotal();
161
		if ($this->sansLimite == false) {
1840 jpm 162
			$entete['depart'] = (int) $this->getDepart();
163
			$entete['limite'] = (int) $this->getLimite();
1794 jpm 164
 
165
			$lienPrecedent = $this->recupererHrefPrecedent();
166
			if ($lienPrecedent != null) {
167
				$entete['href.precedent'] = $lienPrecedent;
168
			}
169
 
170
			$lienSuivant = $this->recupererHrefSuivant();
1795 jpm 171
			if ($lienSuivant != null) {
1794 jpm 172
				$entete['href.suivant'] = $lienSuivant;
173
			}
174
		}
175
 
176
		return $entete;
177
	}
1806 jpm 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
		}
1807 jpm 202
		return $retour;
1806 jpm 203
	}
1793 jpm 204
}