3,38 → 3,43 |
* Config permet de charger automatiquement les fichiers ini du Framework et de l'application. |
* Elle offre l'accès en lecture seule aux paramêtres de config. |
* C'est une Singleton. |
* |
* PHP Version 5 |
* |
* |
* PHP Version 5 |
* |
* @category PHP |
* @package Framework |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license GPL-v3 et CECILL-v2 |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
* @license GPL-v3 et CECILL-v2 |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
*/ |
|
class Config { |
|
|
private static $instance = null; |
private static $parametres = array(); |
|
|
private function __construct() { |
// Définition de paramètres avant chargement du config.ini |
self::$parametres = array( |
'fw_fichier_config' => 'config%s.ini', |
'fw_chemin' => dirname(__FILE__).DS |
); |
|
// Chargement du fichier config.ini du Framework |
self::parserFichierIni(self::$parametres['fw_chemin'].sprintf(self::$parametres['fw_fichier_config'], '')); |
|
$chemin_config_appli_contextuel = self::$parametres['dossier_configurations']; |
|
// Chargement du fichier config.ini par défaut de l'application |
$chemin_config_defaut_appli = self::$parametres['chemin_configurations'].sprintf(self::$parametres['fw_fichier_config'], ''); |
self::parserFichierIni($chemin_config_defaut_appli); |
|
// Chargement des fichiers config.ini contextuels |
if (defined('PAP_VERSION')) { |
$chemin_config_appli_contextuel = self::$parametres['chemin_configurations']; |
$chemin_config_appli_contextuel .= sprintf(self::$parametres['fw_fichier_config'], '_papyrus'); |
} else { |
$chemin_config_appli_contextuel .= sprintf(self::$parametres['fw_fichier_config'], ''); |
self::parserFichierIni($chemin_config_appli_contextuel); |
} |
self::parserFichierIni($chemin_config_appli_contextuel); |
|
} |
|
private static function parserFichierIni($fichier_ini) { |
41,91 → 46,116 |
$retour = false; |
if (file_exists($fichier_ini)) { |
$ini = parse_ini_file($fichier_ini, true); |
$ini = self::evaluerPhp($ini); |
$ini = self::analyserTableauIni($ini); |
self::fusionner($ini); |
$retour = true; |
} |
return $retour; |
} |
|
|
private static function fusionner(array $ini) { |
self::$parametres = array_merge(self::$parametres, $ini); |
} |
|
|
public static function charger($fichier_ini) { |
self::verifierCreationInstance(); |
return self::parserFichierIni($fichier_ini); |
} |
|
public static function get($param) { |
$retour = ''; |
|
public static function get($param = null) { |
$retour = null; |
self::verifierCreationInstance(); |
if (isset(self::$parametres[$param])) { |
$retour = self::$parametres[$param]; |
if ($param === null) { |
$retour = self::$parametres; |
} else { |
$retour = self::getValeur($param, self::$parametres); |
} |
return $retour; |
} |
|
public static function getSection($section, $param = null) { |
$retour = ''; |
self::verifierCreationInstance(); |
if (isset(self::$parametres[$section])) { |
if (!is_null($param)) { |
if (isset(self::$parametres[$section][$param])) { |
$retour = self::$parametres[$section][$param]; |
} |
} else { |
$retour = self::$parametres[$section]; |
} |
} |
return $retour; |
|
private static function getValeur($param, $config) { |
if (strpos($param, '.') !== false) { |
$pieces = explode('.', $param, 2); |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (isset($config[$pieces[0]])) { |
if (is_array($config[$pieces[0]])) { |
return self::getValeur($pieces[1], $config[$pieces[0]]); |
} |
} |
} |
} else { |
if (isset($config[$param])) { |
return $config[$param]; |
} |
} |
return null; |
} |
|
|
public static function existe($param) { |
$retour = false; |
self::verifierCreationInstance(); |
if (isset(self::$parametres[$param])) { |
if (self::getValeur($param, self::$parametres) !== null) { |
$retour = true; |
} |
return $retour; |
} |
|
public static function existeSection($section, $param = null) { |
$retour = false; |
self::verifierCreationInstance(); |
if (isset(self::$parametres[$section])) { |
if (!is_null($param)) { |
if (isset(self::$parametres[$section][$param])) { |
$retour = true; |
} |
} else { |
$retour = true; |
} |
} |
return $retour; |
} |
|
|
private static function verifierCreationInstance() { |
if (empty(self::$instance)) { |
self::$instance = new Config(); |
self::$instance = new Config(); |
} |
} |
|
private static function evaluerPhp($tableau_a_analyser) { |
if (is_array($tableau_a_analyser)) { |
foreach ($tableau_a_analyser as $cle => $valeur) { |
if (is_array($valeur)) { |
$tableau_a_analyser[$cle] = self::evaluerPhp($valeur); |
} else { |
if (preg_match('/^php:(.+)$/', $valeur, $correspondances)) { |
eval('$tableau_a_analyser["'.$cle.'"] = '.$correspondances[1].';'); |
} else { |
$tableau_a_analyser[$cle] = $valeur; |
} |
} |
} |
} |
return $tableau_a_analyser; |
|
private static function analyserTableauIni($config = array()) { |
foreach ($config as $cle => $valeur) { |
if (is_array($valeur)) { |
$config[$cle] = self::analyserTableauIni($valeur); |
} else { |
self::evaluerReferences($config, $cle); |
self::evaluerPhp($config, $cle); |
self::evaluerCle($config, $cle, $config[$cle]); |
} |
} |
return $config; |
} |
|
private static function evaluerCle(&$config, $cle, $valeur) { |
if (strpos($cle, '.') !== false) { |
unset($config[$cle]); |
$pieces = explode('.', $cle, 2); |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (!isset($config[$pieces[0]])) { |
if ($pieces[0] === '0' && !empty($config)) { |
// convert the current values in $config into an array |
$config = array($pieces[0] => $config); |
} else { |
$config[$pieces[0]] = array(); |
} |
} elseif (!is_array($config[$pieces[0]])) { |
throw new ErrorException("Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà"); |
} |
$config[$pieces[0]] = self::evaluerCle($config[$pieces[0]], $pieces[1], $valeur); |
} else { |
throw new ErrorException("Clé invalide '$cle'"); |
} |
} else { |
$config[$cle] = $valeur; |
} |
return $config; |
} |
|
private static function evaluerReferences(&$config, $cle) { |
if (preg_match_all('/{ref:([A-Za-z0-9_-]+)}/', $config[$cle], $correspondances, PREG_SET_ORDER)) { |
foreach ($correspondances as $ref) { |
$config[$cle] = str_replace($ref[0], $config[$ref[1]], $config[$cle]); |
} |
} |
} |
|
private static function evaluerPhp(&$config, $cle) { |
if (preg_match('/^php:(.+)$/', $config[$cle], $correspondances)) { |
eval('$config["'.$cle.'"] = '.$correspondances[1].';'); |
} |
} |
} |
?> |