Subversion Repositories eFlore/Applications.del

Rev

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