Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 517 | Rev 912 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Classe abstraite dont chaque controleur de l'application doit hériter.
 *
 * @category    PHP 5.2
 * @package             eflore-consultation
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author              Delphine CAUQUIL <delphine@tela-botanica.org>
 * @copyright   2011 Tela-Botanica
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
 * @version             $Id$
 */
abstract class aControleur extends Controleur {

        const META_TITRE = 'titre';
        const META_DESCRIPTION = 'description';
        const META_TAGS = 'tags';
        const ENTETE = 'entete';
        const RENDU_TETE = 'tete';
        const RENDU_CORPS = 'corps';
        const RENDU_PIED = 'pied';
        const RENDU_NAVIGATION = 'navigation';
        const RENDU_MENU = 'menu';

        private $sortie = array();
        protected $urlBase = null;
        protected $urlCourante = null;
        protected $urls = null;
        
        protected $cache = null;

        public function __construct(AppUrls $urls = null)  {
                $chemin = Config::get('chemin_modules').
                        AppControleur::getNomDossierDepuisClasse(get_class($this)).DS.
                        Config::get('dossier_squelettes').DS;
                Registre::set('tbf.chemin_squelettes', $chemin);

                $this->urlBase = Registre::get('eFlore.urlBase');
                $this->urlCourante = Registre::get('eFlore.urlCourante');
                $this->urlRedirection = Registre::get('eFlore.urlRedirection');
                $this->urls = (is_null($urls)) ? new AppUrls() : $urls;
                
                $this->cache = new CacheSimple(array("mise_en_cache" => Config::get("cache"), "stockage_chemin" => Config::get("chemincache"), "duree_de_vie" => Config::get("dureecache")));

                parent::__construct();
        }

        //+------------------------------------------------------------------------------------------------------+
        // GESTION de l'AFFICHAGE en SORTIE

        /**
        * Attribue une position de sortie à un contenu.
        */
        protected function setSortie($position, $contenu, $fusionner = false) {
                if ($this->verifierExistenceTypeSortie($position)) {
                        if ($fusionner) {
                                if (isset($this->sortie[$position])) {
                                        $this->sortie[$position] .= $contenu;
                                } else {
                                        $this->sortie[$position] = $contenu;
                                }
                        } else {
                                $this->sortie[$position] = $contenu;
                        }
                }
        }

        /**
         * Vérifie l'existence du type de sortie indiqué pour son utilisation dans le tableau de sortie.
         * @param string le type de sortie à tester.
         * @return bool true si le type de sortie est valide, sinon false.
         */
        private function verifierExistenceTypeSortie($type) {
                $existe = true;
                if ($type != self::RENDU_TETE &&
                        $type != self::RENDU_CORPS &&
                        $type != self::RENDU_PIED &&
                        $type != self::RENDU_NAVIGATION &&
                        $type != self::RENDU_MENU &&
                        $type != self::ENTETE &&
                        $type != self::META_TITRE &&
                        $type != self::META_DESCRIPTION &&
                        $type != self::META_TAGS) {
                        trigger_error("Le type de sortie '$type' n'est pas une valeur prédéfinie.", E_USER_WARNING);
                        $existe = false;
                }
                return $existe;
        }

        /**
         * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
         */
        public function getSortie() {
                return $this->sortie;
        }

        /**
         * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
         * @param array le tableau à fusionner
         */
        private function fusionnerSortie($nouvelleSortie) {
                $sortieActuelle = $this->getSortie();
                foreach ($nouvelleSortie as $position => $nouveauContenu) {
                        if ($nouveauContenu != '') {
                                $contenuPrecedent = isset($sortieActuelle[$position]) ? $sortieActuelle[$position] : null;
                                if ($nouveauContenu != $contenuPrecedent) {
                                        $this->setSortie($position, $nouveauContenu, true);
                                }
                        }
                }
        }

        /**
         * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
         * Permet à une action d'un module donnée de charger le résultat d'une autre action de module.
         */
        protected function executerAction($ClasseModule, $action, $parametres = array()) {
                $module = new $ClasseModule();
                $sortiePrecedente = $this->getSortie();
                // Initialisation du module demandé
                if (method_exists($module, 'initialiser')) {
                        $module->initialiser();
                }
                // Lancement de l'action demandé du module chargé
                if (method_exists($module, $action)) {
                        if (isset($parametres)) {
                                $module->$action($parametres);
                        } else {
                                $module->$action();
                        }
                        $nouvelleSortie = $module->getSortie();
                        $this->fusionnerSortie($nouvelleSortie);
                } else {
                        $m = "La méthode '$action' du controleur '$ClasseModule' est introuvable.";
                        trigger_error($m, E_USER_ERROR);
                }
        }

        //+------------------------------------------------------------------------------------------------------+
        // GESTION du VUES COMMUNES
        /**
         * Charge un squelette de vue depuis l'emplacement commune.
         * @param String $tpl le nom du squelette à charger sans l'extenssion de fichier.
         * @param Array $donnees les données à passer au squelette PHP.
         */
        private function getVueCommune($tpl, $donnees) {
                $cheminOrigine = $this->getCheminSquelette();
                $this->setCheminSquelette(Config::get('chemin_squelettes'));
                $vue = $this->getVue($tpl, $donnees);
                $this->setCheminSquelette($cheminOrigine);
                return $vue;
        }

        /**
         * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
         */
        public function chargerEnteteGeneral() {
                $donnees['appli'] = Framework::getInfoAppli();
                $donnees['i18n'] = array_merge(I18n::get('Entete'), I18n::get('General'));
                $donnees['referentiel_titre'] = I18n::get('Referentiels-titres.'.Registre::get('parametres.referentiel'));

                $this->setSortie(self::RENDU_TETE, $this->getVueCommune('entete_page', $donnees));
        }

        /**
         * Pour mutualiser la création du menu de l'application, sa gestion est gérée dans cette classe.
         */
        public function chargerMenuGeneral() {
                $donnees['appli'] = Framework::getInfoAppli();
                $donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
                $donnees['courrielContact'] = Config::get('courriel_contact');

                $this->setSortie(self::RENDU_MENU, $this->getVueCommune('menu', $donnees));
        }

        /**
         * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
         */
        public function chargerPiedGeneral() {
                $donnees['appli'] = Framework::getInfoAppli();
                $donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
                $donnees['courrielContact'] = Config::get('courriel_contact');

                $this->setSortie(self::RENDU_PIED, $this->getVueCommune('pied_page', $donnees));
        }

        //+------------------------------------------------------------------------------------------------------+
        // GESTION du CHARGEMENT des CLASSES MÉTIERS
        protected function getEfloreNoms() {
                if (! isset($this->EfloreNoms)) {
                        $this->EfloreNoms = new Noms();
                }
                return $this->EfloreNoms;
        }

        protected function getEfloreTaxons() {
                if (! isset($this->EfloreTaxons)) {
                        $this->EfloreTaxons = new Taxons();
                }
                return $this->EfloreTaxons;
        }

        public function obtenirUrlBase() {
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function redirigerVers($url) {
                $url = str_replace('&amp;', '&', $url);
                header("Location: $url");
        }

        public function getParametresUrlListe() {
                $parametres = array(
                                        'referentiel' => Registre::get('parametres.referentiel'),
                                        'module' => 'liste',
                                        'action' => 'liste',
                                        'rang' => $this->rang,
                                        'lettre' => $this->lettre
                );
                return $parametres;
        }

        public function obtenirUrlListeFamille() {
                $parametres = $this->getParametresUrlListe();
                $parametres['rang'] = 'F';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function obtenirUrlListeGenre() {
                $parametres = $this->getParametresUrlListe();
                $parametres['rang'] = 'G';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }



        public function getParametresUrlResultat() {
                $parametres = array(
                                        'referentiel' => Registre::get('parametres.referentiel'),
                                        'module' => 'recherche',
                                        'action' => Registre::get('parametres.action'),
                                        'submit' => 'Rechercher',
                                        'type_nom' => isset($_GET['type_nom']) ? $_GET['type_nom'] : 'nom_scientifique',
                                        'nom' => isset($_GET['nom']) ? $_GET['nom'] : ''
                );
                return $parametres;
        }

        public function obtenirUrlResultatDetermination() {
                $parametres = $this->getParametresUrlResultat();
                $parametres['resultat'] = 'determination';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function obtenirUrlResultatAlphab() {
                $parametres = $this->getParametresUrlResultat();
                $parametres['resultat'] = 'alphab';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function obtenirUrlResultatRetenu() {
                $parametres = $this->getParametresUrlResultat();
                $parametres['resultat'] = 'retenu';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function obtenirUrlResultatDecompo() {
                $parametres = $this->getParametresUrlResultat();
                $parametres['resultat'] = 'decompo';
                $this->urlBase->setRequete($parametres);
                $url = $this->urlBase->getURL();
                return $url;
        }

        public function obtenirCache($id) {
                $retour = unserialize($this->cache->charger($id));
                if ($retour == false) {
                        $retour = null;
                }
                return $retour;
        }
        
        public function mettreEnCache($id, $donnees) {
                $this->cache->sauver(serialize($donnees), $id);
        }
}
?>