* @author Delphine CAUQUIL * @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$ */ class AppControleur extends Controleur { /** * Instance de la classe pointant sur elle même (pour le pattern singleton) */ private static $instance = null; /** * Paramètres d'AppControleur */ private static $parametres = array(); /** * Constructeur vide */ public function __construct() { $sortie = array( 'titre' => '', 'description' => '', 'tags' => '', 'entete' => '', 'tags' => '', 'corps' => '', 'tete' => '', 'pied' => '', 'navigation' => '', 'menu' => ''); self::$parametres = array( 'referentiel' => Config::get('referentiel_defaut'), 'module' => Config::get('module_defaut'), 'action' => Config::get('action_defaut'), 'niveau' => Config::get('niveau_defaut'), 'sortie' => $sortie); parent::__construct(); } /** * Initialisation du controleur principal en fonction des paramêtres de l'url. */ public static function initialiser() { self::verifierCreationInstance(); self::gererSession(); self::nettoyerGet(); self::capturerParametres(); self::initialiserRegistre(); self::chargerConfigReferentiel(); spl_autoload_register(array(get_class(), 'chargerClasse')); self::executerModule(); } // "public" pour pouvoir être appelée distinctememnt de "initialiser" lors des tests PHPUnit public static function verifierCreationInstance() { if (empty(self::$instance)) { self::$instance = new AppControleur(); } } private static function gererSession() { if (Config::get('session_demarrage')) { // Attribution d'un nom à la session session_name(Config::get('session_nom')); // Démarrage de la session session_start(); } } private static function nettoyerGet() { foreach ($_GET as $cle => $valeur) { $verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); $_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur)); } } private static function capturerParametres() { if (isset($_GET['referentiel'])) { self::$parametres['referentiel'] = $_GET['referentiel']; } if (isset($_GET['module'])) { self::$parametres['module'] = $_GET['module']; } if (isset($_GET['action'])) { self::$parametres['action'] = $_GET['action']; } if (isset($_GET['niveau'])) { self::$parametres['niveau'] = $_GET['niveau']; } } // "public" pour pouvoir être appelée distinctememnt de "initialiser" lors des tests PHPUnit public static function initialiserRegistre() { Registre::set('eFlore.domaine', new Url(Config::get('base_url_domaine'))); Registre::set('eFlore.urlBase', new Url(Config::get('base_url_application_index'))); Registre::set('eFlore.urlBaseDossier', new Url(Config::get('base_url_application'))); Registre::set('eFlore.urlCourante', self::getUrlCourante()); Registre::set('eFlore.urlRedirection', self::getUrlRedirection()); Registre::set('eFlore.urlPopUp', new Url(Config::get('base_url_application_popup'))); Registre::set('eFlore.urlMobileTpl', Config::get('base_url_mobile')); Registre::set('parametres.referentiel', self::$parametres['referentiel']); Registre::set('parametres.module', self::$parametres['module']); Registre::set('parametres.action', self::$parametres['action']); Registre::set('parametres.niveau', self::$parametres['niveau']); } private static function chargerConfigReferentiel() { $chemin = Config::get('chemin_configurations').strtolower(self::$parametres['referentiel']).'.ini'; Config::charger($chemin); } private static function getUrlCourante() { $url = false; if (isset($_SERVER['REQUEST_URI'])) { $url = $_SERVER['REQUEST_URI']; } return ($url) ? new Url($url) : $url; } private static function getUrlRedirection() { $url = false; if (isset($_SERVER['REDIRECT_URL']) && !empty($_SERVER['REDIRECT_URL'])) { if (isset($_SERVER['REDIRECT_QUERY_STRING']) && !empty($_SERVER['REDIRECT_QUERY_STRING'])) { $url = $_SERVER['REDIRECT_URL'].'?'.$_SERVER['REDIRECT_QUERY_STRING']; } else { $url = $_SERVER['REDIRECT_URL']; } } return ($url) ? new Url($url) : $url; } private static function chargerClasse($nom_classe) { $dossiers_classes = array( Config::get('chemin_modules').self::getNomDossierModuleCourrant().DS, Config::get('chemin_modules').self::getNomDossierDepuisClasse($nom_classe).DS, Config::get('chemin_modeles').'api_0.1'.DS); foreach ($dossiers_classes as $chemin) { $fichier_a_tester = $chemin.$nom_classe.'.php'; if (file_exists($fichier_a_tester)) { include_once $fichier_a_tester; return null; } } } public static function getNomDossierDepuisParametre($parametre) { $dossier = str_replace('-', '_', strtolower($parametre)); return $dossier; } public static function getNomDossierDepuisClasse($nomClasse) { $dossier = str_replace(' ', '_', strtolower(preg_replace('/(?chargerEnteteGeneral(); $module->chargerMenuGeneral(); $module->chargerPiedGeneral(); // Initialisation du module demandé if (method_exists($module, 'initialiser')) { $module->initialiser(); } // Lancement de l'action demandé du module chargé if (method_exists($module, $action)) { $module->$action(); } else { $m = "La méthode '$action' du controleur '$classeModule' est introuvable."; trigger_error($m, E_USER_ERROR); } self::fusionnerSortie($module->getSortie()); } else { $m = "La classe du controleur '$classeModule' est introuvable."; trigger_error($m, E_USER_ERROR); } } /** * Fusionne un tableau de sortie par défaut avec le tableau renvoyé par l'action du module. * @param array le tableau à fusionner */ private static function fusionnerSortie($sortie) { self::$parametres['sortie'] = array_merge(self::$parametres['sortie'], $sortie); } /** * Retourne le titre du contenu de l'application. */ public static function getMetaTitre() { $contenu = self::$parametres['sortie']['titre']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne la description du contenu de l'application. */ public static function getMetaDescription() { $contenu = self::$parametres['sortie']['description']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne les mots-clés (tags) du contenu de l'application. */ public static function getMetaTags() { $contenu = self::$parametres['sortie']['tags']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne les informations à placer dans la balise HEAD du HTML. */ public static function getEntete() { $contenu = self::$parametres['sortie']['entete']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne le contenu du corps de l'application. */ public static function getContenuCorps() { $contenu = self::$parametres['sortie']['corps']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne le contenu de la tête de l'application. */ public static function getContenuTete() { $contenu = self::$parametres['sortie']['tete']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne le contenu du pied de l'application. */ public static function getContenuPied() { $contenu = self::$parametres['sortie']['pied']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne les éléments de navigation (onglet, fils d'ariane) de l'application. */ public static function getContenuNavigation() { $contenu = self::$parametres['sortie']['navigation']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne les éléments du menu de l'application. */ public static function getContenuMenu() { $contenu = self::$parametres['sortie']['menu']; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Retourne les chronos pris dans l'appli */ public static function getChrono() { $sortie = ''; if (Config::get('benchmark_chrono')) { $chrono = Chronometre::afficherChrono(); $sortie = self::convertirEncodage($chrono); } return $sortie; } /** * Retourne les messages d'exceptions et d'erreurs. */ public static function getExceptions() { $contenu = (Config::get('debogage')) ? GestionnaireException::getExceptions() : ''; $sortie = self::convertirEncodage($contenu); return $sortie; } /** * Convertion du contenu de l'application (voir fichier config.ini : appli_encodage), * dans le format de sortie désiré (voir fichier config.ini : sortie_encodage). * Cette convertion a lieu seulement si les formats sont différents. */ private static function convertirEncodage($contenu) { if (Config::get('sortie_encodage') != Config::get('appli_encodage')) { $contenu = mb_convert_encoding($contenu, Config::get('sortie_encodage'), Config::get('appli_encodage')); } return $contenu; } } ?>