1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: class Config {
17:
18: 19: 20:
21: private static $instance = null;
22:
23: 24: 25:
26: private static $parametres = array();
27:
28: 29: 30:
31: private function __construct() {
32:
33: self::$parametres = array(
34: 'fw_fichier_config' => 'config%s.ini',
35: 'fw_chemin' => dirname(__FILE__).DS
36: );
37:
38:
39: $existe = self::parserFichierIni(self::$parametres['fw_chemin'].sprintf(self::$parametres['fw_fichier_config'], ''));
40: if ($existe === false) {
41: trigger_error("Veuillez configurer le Framework en renommant le fichier config.defaut.ini en config.ini.", E_USER_ERROR);
42: }
43:
44:
45: $chemin_config_defaut_appli = self::$parametres['chemin_configurations'].sprintf(self::$parametres['fw_fichier_config'], '');
46: self::parserFichierIni($chemin_config_defaut_appli);
47:
48:
49: if (PHP_SAPI == 'cli') {
50: foreach ($_SERVER['argv'] as $cle => $valeur) {
51: if ($valeur == '-contexte') {
52: chargerFichierContexte($_SERVER['argv'][($cle+1)]);
53: break;
54: }
55: }
56: } else {
57:
58: if (defined('PAP_VERSION')) {
59: self::chargerFichierContexte('papyrus');
60: }
61:
62: if (Config::existeValeur('info.contexte', self::$parametres)) {
63: self::chargerFichierContexte(Config::get('info.contexte'));
64: }
65:
66:
67: if (isset($_GET['contexte'])) {
68: self::chargerFichierContexte($_GET['contexte']);
69: }
70:
71:
72: if (isset($_POST['contexte'])) {
73: self::chargerFichierContexte($_POST['contexte']);
74: }
75: }
76: }
77:
78: 79: 80: 81:
82: private static function chargerFichierContexte($contexte) {
83: $chemin_config_appli_contextuel = self::$parametres['chemin_configurations'];
84: $chemin_config_appli_contextuel .= sprintf(self::$parametres['fw_fichier_config'], '_'.$contexte);
85: self::parserFichierIni($chemin_config_appli_contextuel);
86: }
87:
88: 89: 90: 91: 92:
93: public static function parserFichierIni($fichier_ini) {
94: $retour = false;
95: if (file_exists($fichier_ini)) {
96: $ini = parse_ini_file($fichier_ini, true);
97: $ini = self::analyserTableauIni($ini);
98: self::fusionner($ini);
99: $retour = true;
100: }
101: return $retour;
102: }
103:
104: 105: 106: 107:
108: private static function fusionner(array $ini) {
109: self::$parametres = array_merge(self::$parametres, $ini);
110: }
111:
112: 113: 114: 115: 116: 117:
118: private static function getValeur($param, $config) {
119: if ($param === null) {
120: return null;
121: } else {
122: if (isset($config[$param])) {
123: return $config[$param];
124: } else if (strpos($param, '.') !== false) {
125: $pieces = explode('.', $param, 2);
126: if (strlen($pieces[0]) && strlen($pieces[1])) {
127: if (isset($config[$pieces[0]])) {
128: if (is_array($config[$pieces[0]])) {
129: return self::getValeur($pieces[1], $config[$pieces[0]]);
130: }
131: }
132: }
133: } else {
134: return null;
135: }
136: }
137: }
138:
139: 140: 141: 142: 143:
144: private static function existeValeur($param, $config) {
145: $retour = false;
146: if (self::getValeur($param, $config) !== null) {
147: $retour = true;
148: }
149: return $retour;
150: }
151:
152: 153: 154:
155: private static function verifierCreationInstance() {
156: if (empty(self::$instance)) {
157: self::$instance = new Config();
158: }
159: }
160:
161: 162: 163: 164: 165:
166: private static function analyserTableauIni($config = array()) {
167: foreach ($config as $cle => &$valeur) {
168: if (is_array($valeur)) {
169: $config[$cle] = self::analyserTableauIni($valeur);
170: } else {
171: self::evaluerReferences($config, $cle);
172: self::evaluerPhp($config, $cle);
173: self::evaluerCle($config, $cle, $config[$cle]);
174: }
175: }
176: return $config;
177: }
178:
179: 180: 181: 182: 183: 184: 185:
186: private static function evaluerCle(&$config, $cle, $valeur) {
187: if (strpos($cle, '.') !== false) {
188: unset($config[$cle]);
189: $pieces = explode('.', $cle, 2);
190: if (strlen($pieces[0]) && strlen($pieces[1])) {
191: if (isset($config[$pieces[0]]) && !is_array($config[$pieces[0]])) {
192: $m = "Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà";
193: trigger_error($m, E_USER_WARNING);
194: } else {
195: $config[$pieces[0]][$pieces[1]] = $valeur;
196: $config[$pieces[0]] = self::evaluerCle($config[$pieces[0]], $pieces[1], $valeur);
197: }
198: } else {
199: $m = "Clé invalide '$cle'";
200: trigger_error($m, E_USER_WARNING);
201: }
202: } else {
203: $config[$cle] = $valeur;
204: }
205: return $config;
206: }
207:
208: 209: 210: 211: 212:
213: private static function evaluerReferences(&$config, $cle) {
214: if (preg_match_all('/{ref:([A-Za-z0-9_.-]+)}/', $config[$cle], $correspondances, PREG_SET_ORDER)) {
215: foreach ($correspondances as $ref) {
216: $config[$cle] = str_replace($ref[0], self::getValeur($ref[1], $config), $config[$cle]);
217: }
218: }
219: }
220:
221: 222: 223: 224: 225:
226: private static function evaluerPhp(&$config, $cle) {
227: if (preg_match('/^php:(.+)$/', $config[$cle], $correspondances)) {
228: eval('$config["'.$cle.'"] = '.$correspondances[1].';');
229: }
230: }
231:
232: 233: 234: 235: 236:
237: public static function charger($fichier_ini) {
238: self::verifierCreationInstance();
239: return self::parserFichierIni($fichier_ini);
240: }
241:
242: 243: 244: 245: 246:
247: public static function get($param = null) {
248: self::verifierCreationInstance();
249: return self::getValeur($param, self::$parametres);
250: }
251:
252: 253: 254: 255: 256:
257: public static function existe($param) {
258: self::verifierCreationInstance();
259: return self::existeValeur($param, self::$parametres);
260: }
261: }
262: ?>