* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class Navigation { private $conteneur; private $parametresUrl; private $ressourcesUrl; private $serviceNom; private $filtresPossibles; private $filtresActifs; private $total; private $sansLimite; /** * Constructeur de la classe Navigation * @param Array $parametresUrl (optionnel) la liste des paramètre issus du Conteneur */ public function __construct($conteneur) { $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur; $contexte = $this->conteneur->getContexte(); $this->parametresUrl = $contexte->getQS(); $this->serviceNom = $contexte->getRessource(1); $ressources = $contexte->getRessource(); $this->ressourcesUrl = implode('/', array_slice($ressources, 1)); $this->filtresPossibles = $this->conteneur->getparametreTableau($this->serviceNom.'.masques_possibles'); $this->chargerFiltresActifs(); } private function chargerFiltresActifs() { if ($this->parametresUrl != null) { foreach ($this->parametresUrl as $paramNom => $valeur) { if (in_array($paramNom, $this->filtresPossibles)) { $this->filtresActifs[$paramNom] = $valeur; } } } } /** * Obtenir la valeur courante de départ */ public function getDepart() { $navDepart = $this->getParamUrl('navigation.depart'); return ($navDepart == null) ? 0 : $navDepart ; } /** * Obtenir la limite courante */ public function getLimite() { $limiteParam = $this->getParamUrl('navigation.limite'); $limite = 10; if ($limiteParam != null && is_numeric($limiteParam)) { $limite = ($limiteParam < 1000) ? $limiteParam : 1000;// Pour éviter les abus ! } return $limite; } private function getParamUrl($nom) { $valeur = isset($this->parametresUrl[$nom]) ? $this->parametresUrl[$nom] : null; return $valeur; } /** * Récupérer l'url de navigation en concaténant d'éventuels paramètres * @param $depart l'entier de départ de la recherche * @param $limite le nombre de résultats à retourner * @param $parametresAdditionnels le tableau contenant les parametres => valeurs additionnels */ private function obtenirUrlNavigation($depart, $limite) { $parametres = $this->parametresUrl; $parametres['navigation.depart'] = $depart; $parametres['navigation.limite'] = $limite; $urlServiceBase = $this->conteneur->getParametre('url_service_base').$this->ressourcesUrl; $urlNavigation = $this->conteneur->getUrl($urlServiceBase); $urlNavigation->setOption(Url::OPTION_ENCODER_VALEURS, true); $urlNavigation->setRequete($parametres); $url = $urlNavigation->getURL(); return $url; } /** * Récupérer le lien pour afficher les images précédentes en fonction des paramètres */ public function recupererHrefPrecedent() { $departActuel = $this->getDepart(); $limite = $this->getLimite(); $departPrecedent = $departActuel - $limite; $url = null; if ($departActuel > 0) { $url = $this->obtenirUrlNavigation($departPrecedent, $limite); } return $url; } /** * Récupérer le lien pour afficher les images suivantes en fonction des paramètres */ public function recupererHrefSuivant() { $departActuel = $this->getDepart(); $limite = $this->getLimite(); $departSuivant = $departActuel + $limite; $url = null; if ($departSuivant < $this->total) { $url = $this->obtenirUrlNavigation($departSuivant, $limite); } return $url; } /** * Retourner le nombre total d'éléments */ public function getTotal() { return $this->total; } /** * Enregistrer le nombre total d'éléments * @param int $total le nombre d'éléments */ public function setTotal($total) { $this->total = $total; } /** * Changer la valeur de sans limite pour ne pas l'afficher dans l'entete * */ public function setSansLimite() { $this->sansLimite = true; } /** * Génère un tableau contenant les informations pour l'entête des services renvoyant une liste de résultats. * * @return array Le tableau d'entête prés à être encodé en JSON. */ public function getEntete() { $entete = array(); $entete['masque'] = $this->getChaineFiltresActifs(); $entete['total'] = $this->getTotal(); if ($this->sansLimite == false) { $entete['depart'] = (int) $this->getDepart(); $entete['limite'] = (int) $this->getLimite(); $lienPrecedent = $this->recupererHrefPrecedent(); if ($lienPrecedent != null) { $entete['href.precedent'] = $lienPrecedent; } $lienSuivant = $this->recupererHrefSuivant(); if ($lienSuivant != null) { $entete['href.suivant'] = $lienSuivant; } } return $entete; } /** * Retourne les filtres au format chaine sous la forme filtre1=valeur1&filtre2=valeur2. * * @return String la chaine de caractères ou une chaine vide si pas de filtre. */ private function getChaineFiltresActifs() { return (!empty($this->filtresActifs)) ? http_build_query($this->filtresActifs) : ''; } /** * Récupérer tout ou partie des filtres présent dans l'url. * * @param String $filtreNom (optionnel) le nom du filtre tel que présent dans l'url. * @return mixed si un filtre est passé en paramètre retourn la valeur correspondante, si pas de paramétre * retourne le tableau complet des filtres. False en cas d'erreur. * */ public function getFiltre($filtreNom = null) { $retour = false; if ($filtreNom == null) { $retour = $this->filtresActifs; } else if ($filtreNom != null && isset($this->filtresActifs[$filtreNom])) { $retour = $this->filtresActifs[$filtreNom]; } return $retour; } }