Subversion Repositories eFlore/Applications.del

Rev

Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Navigation gère les url de navigation en fonction d'un départ et d'une limite
 *
 * @category  DEL
 * @package   Services
 * @package   Bibliotheque
 * @version   0.1
 * @author    Mathias CHOUET <mathias@tela-botanica.org>
 * @author    Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author    Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license   GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license   CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
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;
        }
}