| 1646 | 
           alex | 
           1 | 
           <?php
  | 
        
        
            | 
            | 
           2 | 
           // In : utf8 url_encoded (get et post)
  | 
        
        
            | 
            | 
           3 | 
           // Out : utf8
  | 
        
        
            | 
            | 
           4 | 
           /**
  | 
        
        
            | 
            | 
           5 | 
            * La classe Widget analyser l'url et chage le widget correspondant.
  | 
        
        
            | 
            | 
           6 | 
            * Format d'url :
  | 
        
        
            | 
            | 
           7 | 
            * /widget/nom_du_widget?parametres1=ma_valeur1¶metre2=ma_valeur2
  | 
        
        
            | 
            | 
           8 | 
            * Les widget sont dans des dossiers en minuscule correspondant au nom de la classe du widget.
  | 
        
        
            | 
            | 
           9 | 
            * Exemple : /widget/carto avec la classe Carto.php dans le dossier carto.
  | 
        
        
            | 
            | 
           10 | 
            *
  | 
        
        
            | 
            | 
           11 | 
            *
  | 
        
        
            | 
            | 
           12 | 
            * @author jpm
  | 
        
        
            | 
            | 
           13 | 
            *
  | 
        
        
            | 
            | 
           14 | 
            */
  | 
        
        
            | 
            | 
           15 | 
           class Widget {
  | 
        
        
            | 
            | 
           16 | 
              | 
        
        
            | 
            | 
           17 | 
            	/** Les paramètres de configuration extrait du fichier .ini */
  | 
        
        
            | 
            | 
           18 | 
               private static $config;
  | 
        
        
            | 
            | 
           19 | 
              | 
        
        
            | 
            | 
           20 | 
           	/** Le nom du widget demandé. */
  | 
        
        
            | 
            | 
           21 | 
           	private $widget = null;
  | 
        
        
            | 
            | 
           22 | 
              | 
        
        
            | 
            | 
           23 | 
           	/** Les chemins où l'autoload doit chercher des classes. */
  | 
        
        
            | 
            | 
           24 | 
           	private static $autoload_chemins = array();
  | 
        
        
            | 
            | 
           25 | 
              | 
        
        
            | 
            | 
           26 | 
           	/** Les paramètres de l'url $_GET nettoyés. */
  | 
        
        
            | 
            | 
           27 | 
           	private $parametres = null;
  | 
        
        
            | 
            | 
           28 | 
              | 
        
        
            | 
            | 
           29 | 
           	/**
  | 
        
        
            | 
            | 
           30 | 
           	 * Constructeur.
  | 
        
        
            | 
            | 
           31 | 
           	 * Parse le fichier de configuraion "widget.ini" et parse l'url à la recherche du widget demandé.
  | 
        
        
            | 
            | 
           32 | 
           	 * @param str iniFile Configuration file to use
  | 
        
        
            | 
            | 
           33 | 
           	 */
  | 
        
        
            | 
            | 
           34 | 
           	public function __construct($fichier_ini = 'widget.ini.php') {
  | 
        
        
            | 
            | 
           35 | 
           		// Chargement de la configuration
  | 
        
        
            | 
            | 
           36 | 
           		self::$config = parse_ini_file($fichier_ini, TRUE);
  | 
        
        
           | 1948 | 
           mathias | 
           37 | 
           		// Paramètres de config dynamiques
  | 
        
        
            | 
            | 
           38 | 
           		$protocole = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://';
  | 
        
        
            | 
            | 
           39 | 
           		self::$config['chemins']['baseURLAbsoluDyn'] = $protocole . $_SERVER['SERVER_NAME'].self::$config['chemins']['baseURL'].'%s';
  | 
        
        
           | 1646 | 
           alex | 
           40 | 
              | 
        
        
            | 
            | 
           41 | 
           		// Gestion de la mémoire maximum allouée aux services
  | 
        
        
            | 
            | 
           42 | 
           		ini_set('memory_limit', self::$config['parametres']['limiteMemoire']);
  | 
        
        
            | 
            | 
           43 | 
              | 
        
        
            | 
            | 
           44 | 
           		// Réglages de PHP
  | 
        
        
            | 
            | 
           45 | 
           		setlocale(LC_ALL, self::$config['parametres']['locale']);
  | 
        
        
            | 
            | 
           46 | 
           		date_default_timezone_set(self::$config['parametres']['fuseauHoraire']);
  | 
        
        
            | 
            | 
           47 | 
              | 
        
        
            | 
            | 
           48 | 
           		// Gestion des erreurs
  | 
        
        
            | 
            | 
           49 | 
           		error_reporting(self::$config['parametres']['erreurNiveau']);
  | 
        
        
            | 
            | 
           50 | 
              | 
        
        
            | 
            | 
           51 | 
           		if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['QUERY_STRING'])) {
  | 
        
        
            | 
            | 
           52 | 
           			$url_morceaux = $this->parserUrl();
  | 
        
        
            | 
            | 
           53 | 
           			if (isset($url_morceaux[0])) {
  | 
        
        
            | 
            | 
           54 | 
           				$this->widget = $url_morceaux[0];
  | 
        
        
            | 
            | 
           55 | 
           				self::$config['chemins']['widgetCourantDossier'] = self::$config['chemins']['widgetsDossier'].strtolower($this->widget).DIRECTORY_SEPARATOR;
  | 
        
        
            | 
            | 
           56 | 
           				$this->chargerWidgetConfig();
  | 
        
        
            | 
            | 
           57 | 
           			}
  | 
        
        
            | 
            | 
           58 | 
           			// Chargement des chemins pour l'autoload
  | 
        
        
            | 
            | 
           59 | 
           			$this->chargerCheminAutoload();
  | 
        
        
            | 
            | 
           60 | 
              | 
        
        
            | 
            | 
           61 | 
           			// Enregistrement de la méthode gérant l'autoload des classes
  | 
        
        
            | 
            | 
           62 | 
           			spl_autoload_register(array('Widget', 'chargerClasse'));
  | 
        
        
            | 
            | 
           63 | 
              | 
        
        
            | 
            | 
           64 | 
           			// Nettoyage du $_GET (sécurité)
  | 
        
        
            | 
            | 
           65 | 
           			$this->collecterParametres();
  | 
        
        
            | 
            | 
           66 | 
           		} else {
  | 
        
        
            | 
            | 
           67 | 
           			$e = 'Les widget nécessite les variables serveurs suivantes pour fonctionner : REQUEST_URI et QUERY_STRING.';
  | 
        
        
            | 
            | 
           68 | 
           			trigger_error($e, E_USER_ERROR);
  | 
        
        
            | 
            | 
           69 | 
           		}
  | 
        
        
            | 
            | 
           70 | 
           	}
  | 
        
        
            | 
            | 
           71 | 
              | 
        
        
            | 
            | 
           72 | 
           	private function parserUrl() {
  | 
        
        
            | 
            | 
           73 | 
           		if (strlen($_SERVER['QUERY_STRING']) == 0) {
  | 
        
        
            | 
            | 
           74 | 
           			$len = strlen($_SERVER['REQUEST_URI']);
  | 
        
        
            | 
            | 
           75 | 
           		} else {
  | 
        
        
            | 
            | 
           76 | 
           			$len = -(strlen($_SERVER['QUERY_STRING']) + 1);
  | 
        
        
            | 
            | 
           77 | 
           		}
  | 
        
        
            | 
            | 
           78 | 
           		$url = substr($_SERVER['REQUEST_URI'], strlen(self::$config['chemins']['baseURL']), $len);
  | 
        
        
            | 
            | 
           79 | 
           		$url_morceaux = explode('/', $url);
  | 
        
        
            | 
            | 
           80 | 
           		return $url_morceaux;
  | 
        
        
            | 
            | 
           81 | 
           	}
  | 
        
        
            | 
            | 
           82 | 
              | 
        
        
            | 
            | 
           83 | 
           	private function collecterParametres() {
  | 
        
        
            | 
            | 
           84 | 
           		if (isset($_GET) && $_GET != '') {
  | 
        
        
            | 
            | 
           85 | 
           			$this->nettoyerGet();
  | 
        
        
            | 
            | 
           86 | 
           			$this->parametres = $_GET;
  | 
        
        
            | 
            | 
           87 | 
           		}
  | 
        
        
            | 
            | 
           88 | 
           	}
  | 
        
        
            | 
            | 
           89 | 
              | 
        
        
            | 
            | 
           90 | 
           	private function nettoyerGet() {
  | 
        
        
            | 
            | 
           91 | 
           		foreach ($_GET as $cle => $valeur) {
  | 
        
        
            | 
            | 
           92 | 
           			$verifier = array('NULL', "\n", "\r", "\\", '"', "\x00", "\x1a", ';');
  | 
        
        
            | 
            | 
           93 | 
           			$_GET[$cle] = strip_tags(str_replace($verifier, '', $valeur));
  | 
        
        
            | 
            | 
           94 | 
           		}
  | 
        
        
            | 
            | 
           95 | 
           	}
  | 
        
        
            | 
            | 
           96 | 
              | 
        
        
            | 
            | 
           97 | 
           	private function chargerCheminAutoload() {
  | 
        
        
            | 
            | 
           98 | 
           		$chemins_communs = explode(';', self::$config['chemins']['autoload']);
  | 
        
        
            | 
            | 
           99 | 
           		$chemins_communs = array_map('trim', $chemins_communs);
  | 
        
        
            | 
            | 
           100 | 
           		array_unshift($chemins_communs, '');
  | 
        
        
            | 
            | 
           101 | 
              | 
        
        
            | 
            | 
           102 | 
           		$chemins_widget = array();
  | 
        
        
            | 
            | 
           103 | 
           		if (isset(self::$config[$this->widget]['autoload'])) {
  | 
        
        
            | 
            | 
           104 | 
           			$chemins_widget = explode(';', self::$config[$this->widget]['autoload']);
  | 
        
        
            | 
            | 
           105 | 
           			foreach ($chemins_widget as $cle => $chemin) {
  | 
        
        
            | 
            | 
           106 | 
           				$chemins_widget[$cle] = self::$config['chemins']['widgetCourantDossier'].trim($chemin);
  | 
        
        
            | 
            | 
           107 | 
           			}
  | 
        
        
            | 
            | 
           108 | 
           		}
  | 
        
        
            | 
            | 
           109 | 
              | 
        
        
            | 
            | 
           110 | 
           		self::$autoload_chemins = array_merge($chemins_communs, $chemins_widget);
  | 
        
        
            | 
            | 
           111 | 
           	}
  | 
        
        
            | 
            | 
           112 | 
              | 
        
        
            | 
            | 
           113 | 
           	/**
  | 
        
        
            | 
            | 
           114 | 
           	* La méthode chargerClasse() charge dynamiquement les classes trouvées dans le code.
  | 
        
        
            | 
            | 
           115 | 
           	* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
  | 
        
        
            | 
            | 
           116 | 
           	*
  | 
        
        
            | 
            | 
           117 | 
           	*@param string le nom de la classe appelée.
  | 
        
        
            | 
            | 
           118 | 
           	*@return void le fichier contenant la classe doit être inclu par la fonction.
  | 
        
        
            | 
            | 
           119 | 
           	*/
  | 
        
        
            | 
            | 
           120 | 
           	public static function chargerClasse($classe) {
  | 
        
        
            | 
            | 
           121 | 
           		if (class_exists($classe)) {
  | 
        
        
            | 
            | 
           122 | 
           			return null;
  | 
        
        
            | 
            | 
           123 | 
           		}
  | 
        
        
            | 
            | 
           124 | 
           		foreach (self::$autoload_chemins as $chemin) {
  | 
        
        
            | 
            | 
           125 | 
           			$chemin = $chemin.$classe.'.php';
  | 
        
        
            | 
            | 
           126 | 
           			if (file_exists($chemin)) {
  | 
        
        
            | 
            | 
           127 | 
           				require_once $chemin;
  | 
        
        
            | 
            | 
           128 | 
           			}
  | 
        
        
            | 
            | 
           129 | 
           		}
  | 
        
        
            | 
            | 
           130 | 
           	}
  | 
        
        
            | 
            | 
           131 | 
              | 
        
        
            | 
            | 
           132 | 
              | 
        
        
            | 
            | 
           133 | 
           	/**
  | 
        
        
            | 
            | 
           134 | 
           	 * Execute le widget.
  | 
        
        
            | 
            | 
           135 | 
           	 */
  | 
        
        
            | 
            | 
           136 | 
           	function executer() {
  | 
        
        
            | 
            | 
           137 | 
           		if (!is_null($this->widget)) {
  | 
        
        
            | 
            | 
           138 | 
           			$classe_widget = ucfirst($this->widget);
  | 
        
        
            | 
            | 
           139 | 
           			$fichier_widget = self::$config['chemins']['widgetCourantDossier'].$classe_widget.'.php';
  | 
        
        
            | 
            | 
           140 | 
           			if (file_exists($fichier_widget))  {
  | 
        
        
            | 
            | 
           141 | 
           				include_once $fichier_widget;
  | 
        
        
            | 
            | 
           142 | 
           				if (class_exists($classe_widget)) {
  | 
        
        
            | 
            | 
           143 | 
           					$widget = new $classe_widget(self::$config, $this->parametres);
  | 
        
        
            | 
            | 
           144 | 
           					$widget->executer();
  | 
        
        
            | 
            | 
           145 | 
           				}
  | 
        
        
            | 
            | 
           146 | 
           			}
  | 
        
        
            | 
            | 
           147 | 
           		}
  | 
        
        
            | 
            | 
           148 | 
           	}
  | 
        
        
            | 
            | 
           149 | 
              | 
        
        
            | 
            | 
           150 | 
           	/**
  | 
        
        
            | 
            | 
           151 | 
           	 * Charge le fichier de config spécifique du wiget et fusionne la config avec celle partagés par l'ensemble des widgets.
  | 
        
        
            | 
            | 
           152 | 
           	 */
  | 
        
        
            | 
            | 
           153 | 
           	private function chargerWidgetConfig() {
  | 
        
        
            | 
            | 
           154 | 
           		$widget_config_ini_fichier = self::$config['chemins']['widgetCourantDossier'].'config.ini';
  | 
        
        
            | 
            | 
           155 | 
           		if (file_exists($widget_config_ini_fichier))  {
  | 
        
        
            | 
            | 
           156 | 
           			$widget_config = parse_ini_file($widget_config_ini_fichier, TRUE);
  | 
        
        
            | 
            | 
           157 | 
           			self::$config = array_merge(self::$config, $widget_config);
  | 
        
        
            | 
            | 
           158 | 
           		}
  | 
        
        
            | 
            | 
           159 | 
           	}
  | 
        
        
            | 
            | 
           160 | 
           }
  | 
        
        
            | 
            | 
           161 | 
           ?>
  |