Source for file jConfigCompiler.class.php

Documentation is available at jConfigCompiler.class.php

  1. <?php
  2. /**
  3. @package      jelix
  4. @subpackage   core
  5. @author       Jouanneau Laurent
  6. @contributor  Thibault PIRONT < nuKs >, Christophe Thiriot, Philippe Schelté
  7. @copyright    2006-2008 Jouanneau laurent
  8. @copyright    2007 Thibault PIRONT, 2008 Christophe Thiriot, 2008 Philippe Schelté
  9. @link         http://www.jelix.org
  10. @licence      GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  11. */
  12.  
  13. /**
  14.  * jConfigCompiler merge two ini file in a single array and store it in a temporary file
  15.  * This is a static class
  16.  * @package  jelix
  17.  * @subpackage core
  18.  * @static
  19.  */
  20. class jConfigCompiler {
  21.  
  22.     private function __construct ()}
  23.  
  24.     /**
  25.      * read the given ini file. Merge it with the content of defaultconfig.ini.php
  26.      * It also calculates some options. It stores the result in a temporary file
  27.      * @param string $configFile the config file name
  28.      * @return object an object which contains configuration values
  29.      */
  30.     static public function read($configFile){
  31.  
  32.         if(JELIX_APP_TEMP_PATH=='/'){
  33.             // if it equals to '/', this is because realpath has returned false in the application.init.php
  34.             // so this is because the path doesn't exist.
  35.             die('Jelix Error: Application temp directory doesn\'t exist !');
  36.         }
  37.  
  38.         if(!is_writable(JELIX_APP_TEMP_PATH)){
  39.             die('Jelix Error: Application temp directory is not writable');
  40.         }
  41.  
  42.         $config jIniFile::read(JELIX_LIB_CORE_PATH.'defaultconfig.ini.php');
  43.  
  44.         if$commonConfig parse_ini_file(JELIX_APP_CONFIG_PATH.'defaultconfig.ini.php',true)){
  45.             self::_mergeConfig($config$commonConfig);
  46.         }
  47.  
  48.         if($configFile !='defaultconfig.ini.php'){
  49.             if(!file_exists(JELIX_APP_CONFIG_PATH.$configFile))
  50.                 die("Jelix config file $configFile is missing !");
  51.             iffalse === ($userConfig parse_ini_file(JELIX_APP_CONFIG_PATH.$configFile,true)))
  52.                 die("Syntax error in the Jelix config file $configFile !");
  53.             self::_mergeConfig($config$userConfig);
  54.         }
  55.         $config = (object) $config;
  56.  
  57.         self::prepareConfig($config);
  58.  
  59.         if(BYTECODE_CACHE_EXISTS){
  60.             $filename=JELIX_APP_TEMP_PATH.str_replace('/','~',$configFile).'.conf.php';
  61.             if ($f @fopen($filename'wb')) {
  62.                 fwrite($f'<?php $config = '.var_export(get_object_vars($config),true).";\n?>");
  63.                 fclose($f);
  64.             else {
  65.                 throw new Exception('(24)Error while writing config cache file '.$filename);
  66.             }
  67.         }else{
  68.             jIniFile::write(get_object_vars($config)JELIX_APP_TEMP_PATH.str_replace('/','~',$configFile).'.resultini.php'";<?php die('');?>\n");
  69.         }
  70.         return $config;
  71.     }
  72.  
  73.     /**
  74.      * fill some config properties with calculated values
  75.      */
  76.     static protected function prepareConfig($config){
  77.  
  78.         $config->isWindows (DIRECTORY_SEPARATOR === '\\');
  79.         if(trim$config->startAction== ''{
  80.             $config->startAction ':';
  81.         }
  82.  
  83.         $config->_allBasePath array();
  84.         $unusedModules preg_split('/ *, */',$config->unusedModules);
  85.         $config->_modulesPathList self::_loadPathList($config->modulesPath$unusedModules$config->_allBasePath);
  86.  
  87.         self::_loadPluginsPathList($config);
  88.  
  89.         if($config->checkTrustedModules){
  90.             $config->_trustedModules explode(',',$config->trustedModules);
  91.             if(!in_array('jelix',$config->_trustedModules))
  92.                 $config->_trustedModules[]='jelix';
  93.         }else{
  94.             $config->_trustedModules array_keys($config->_modulesPathList);
  95.         }
  96.  
  97.         if($config->urlengine['scriptNameServerVariable'== ''{
  98.             $config->urlengine['scriptNameServerVariable'self::_findServerName($config->urlengine['entrypointExtension']);
  99.         }
  100.         $config->urlengine['urlScript'$_SERVER[$config->urlengine['scriptNameServerVariable']];
  101.         $lastslash strrpos ($config->urlengine['urlScript']'/');
  102.         $config->urlengine['urlScriptPath'substr ($config->urlengine['urlScript']0$lastslash ).'/';
  103.         $config->urlengine['urlScriptName'substr ($config->urlengine['urlScript']$lastslash+1);
  104.  
  105.         $basepath $config->urlengine['basePath'];
  106.         if ($basepath != '/' && $basepath != ''{
  107.             if($basepath[0!= '/'$basepath='/'.$basepath;
  108.             if(substr($basepath,-1!= '/'$basepath.='/';
  109.  
  110.             if(PHP_SAPI != 'cli' && strpos($config->urlengine['urlScriptPath']$basepath!== 0){
  111.                 throw new Exception('Jelix Error: basePath ('.$basepath.') in config file doesn\'t correspond to current base path. You should setup it to '.$config->urlengine['urlScriptPath']);
  112.             }
  113.  
  114.         else if ($basepath == ''{
  115.             // for beginners or simple site, we "guess" the base path
  116.             $basepath $config->urlengine['urlScriptPath'];
  117.         }
  118.         $config->urlengine['basePath'$basepath;
  119.  
  120.         if($config->urlengine['jelixWWWPath']{0!= '/')
  121.             $config->urlengine['jelixWWWPath'$basepath.$config->urlengine['jelixWWWPath'];
  122.  
  123.         $snp substr($config->urlengine['urlScript'],strlen($basepath));
  124.         $pos strrpos($snp$config->urlengine['entrypointExtension']);
  125.         if($pos !== false){
  126.             $snp substr($snp,0,$pos);
  127.         }
  128.         $config->urlengine['urlScriptId'$snp;
  129.         $config->urlengine['urlScriptIdenc'rawurlencode($snp);
  130.  
  131.         self::_initResponsesPath($config->responses);
  132.         self::_initResponsesPath($config->_coreResponses);
  133.  
  134.         if (trim($config->timeZone=== ''{
  135.             $tz ini_get('date.timezone');
  136.             if ($tz != '')
  137.                 $config->timeZone $tz;
  138.             else
  139.                 $config->timeZone "Europe/Paris";
  140.         }
  141.  
  142.         if($config->sessions['storage'== 'files'){
  143.             $config->sessions['files_path'str_replace(array('lib:','app:')array(LIB_PATHJELIX_APP_PATH)$config->sessions['files_path']);
  144.         }
  145.  
  146.         $config->sessions['_class_to_load'array();
  147.         if ($config->sessions['loadClasses'!= ''{
  148.             $list preg_split('/ *, */',$config->sessions['loadClasses']);
  149.             foreach($list as $sel{
  150.                 if(preg_match("/^([a-zA-Z0-9_\.]+)~([a-zA-Z0-9_\.\\/]+)$/"$sel$m)){
  151.                     if (!isset($config->_modulesPathList[$m[1]])) {
  152.                         throw new Exception('Error in config files, loadClasses: '.$m[1].' is not a valid or activated module');
  153.                     }
  154.  
  155.                     if( ($p=strrpos($m[2]'/')) !== false){
  156.                         $className substr($m[2],$p+1);
  157.                         $subpath substr($m[2],0,$p+1);
  158.                     }else{
  159.                         $className $m[2];
  160.                         $subpath ='';
  161.                     }
  162.                     
  163.                     $path $config->_modulesPathList[$m[1]].'classes/'.$subpath.$className.'.class.php';
  164.  
  165.                     if (!file_exists($path|| strpos($subpath,'..'!== false {
  166.                         throw new Exception('Error in config files, loadClasses, bad class selector: '.$sel);
  167.                     }
  168.                     $config->sessions['_class_to_load'][$path;
  169.                 }
  170.                 else
  171.                     throw new Exception('Error in config files, loadClasses, bad class selector: '.$sel);
  172.             }
  173.         }
  174.  
  175.         /*if(preg_match("/^([a-zA-Z]{2})(?:_([a-zA-Z]{2}))?$/",$config->locale,$m)){
  176.             if(!isset($m[2])){
  177.                 $m[2] = $m[1];
  178.             }
  179.             $config->defaultLang = strtolower($m[1]);
  180.             $config->defaultCountry = strtoupper($m[2]);
  181.             $config->locale = $config->defaultLang.'_'.$config->defaultCountry;
  182.         }else{
  183.             die("Syntax error in the locale parameter in Jelix config file $configFile !");
  184.         }*/
  185.     }
  186.  
  187.     /**
  188.      * Analyse and check the "lib:" and "app:" path.
  189.      * @param array $list list of "lib:*" and "app:*" path
  190.      * @return array list of full path
  191.      */
  192.     static protected function _loadPathList($list$forbiddenList&$allBasePath){
  193.         $list preg_split('/ *, */',$list);
  194.         array_unshift($listJELIX_LIB_PATH.'core-modules/');
  195.         $result=array();
  196.         foreach($list as $k=>$path){
  197.             if(trim($path== ''continue;
  198.             $p str_replace(array('lib:','app:')array(LIB_PATHJELIX_APP_PATH)$path);
  199.             if(!file_exists($p)){
  200.                 trigger_error('The path, '.$path.' given in the jelix config, doesn\'t exists !',E_USER_ERROR);
  201.                 exit;
  202.             }
  203.             if(substr($p,-1!='/')
  204.                 $p.='/';
  205.             if($k!=0)
  206.                 $allBasePath[]=$p;
  207.             if ($handle opendir($p)) {
  208.                 while (false !== ($f readdir($handle))) {
  209.                     if ($f[0!= '.' && is_dir($p.$f&& !in_array($f$forbiddenList)) {
  210.                         $result[$f]=$p.$f.'/';
  211.                     }
  212.                 }
  213.                 closedir($handle);
  214.             }
  215.         }
  216.         return $result;
  217.     }
  218.  
  219.     /**
  220.      * Analyse plugin paths
  221.      * @param array|object $config the config container
  222.      */
  223.     static protected function _loadPluginsPathList(&$config){
  224.         $list preg_split('/ *, */',$config->pluginsPath);
  225.         array_unshift($listJELIX_LIB_PATH.'plugins/');
  226.         foreach($list as $k=>$path){
  227.             if(trim($path== ''continue;
  228.             $p str_replace(array('lib:','app:')array(LIB_PATHJELIX_APP_PATH)$path);
  229.             if(!file_exists($p)){
  230.                 trigger_error('The path, '.$path.' given in the jelix config, doesn\'t exists !',E_USER_ERROR);
  231.                 exit;
  232.             }
  233.             if(substr($p,-1!='/')
  234.                 $p.='/';
  235.  
  236.             if ($handle opendir($p)) {
  237.                 while (false !== ($f readdir($handle))) {
  238.                     if ($f[0!= '.' && is_dir($p.$f)) {
  239.                         if($subdir opendir($p.$f)){
  240.                             if($k!=0)
  241.                                $config->_allBasePath[]=$p.$f.'/';
  242.                             while (false !== ($subf readdir($subdir))) {
  243.                                 if ($subf[0!= '.' && is_dir($p.$f.'/'.$subf)) {
  244.                                     if($f == 'tpl'){
  245.                                         $prop '_tplpluginsPathList_'.$subf;
  246.                                         $config->{$prop}[$p.$f.'/'.$subf.'/';
  247.                                     }else{
  248.                                         $prop '_pluginsPathList_'.$f;
  249.                                         $config->{$prop}[$subf$p.$f.'/'.$subf.'/';
  250.                                     }
  251.                                 }
  252.                             }
  253.                             closedir($subdir);
  254.                         }
  255.                     }
  256.                 }
  257.                 closedir($handle);
  258.             }
  259.         }
  260.     }
  261.  
  262.     static private function _findServerName($ext{
  263.         $varname '';
  264.         $extlen strlen($ext);
  265.  
  266.         if(strrpos($_SERVER['SCRIPT_NAME']$ext=== (strlen($_SERVER['SCRIPT_NAME']$extlen|| php_sapi_name(== 'cli'{
  267.             return 'SCRIPT_NAME';
  268.         }else if (isset($_SERVER['REDIRECT_URL']&& strrpos$_SERVER['REDIRECT_URL']$ext=== (strlen$_SERVER['REDIRECT_URL']-$extlen)) {
  269.             return 'REDIRECT_URL';
  270.         }else if (isset($_SERVER['ORIG_SCRIPT_NAME']&& strrpos$_SERVER['ORIG_SCRIPT_NAME']$ext=== (strlen$_SERVER['ORIG_SCRIPT_NAME']$extlen)) {
  271.             return 'ORIG_SCRIPT_NAME';
  272.         }
  273.         throw new Exception('Jelix Error: in config file the parameter urlengine:scriptNameServerVariable is empty and Jelix don\'t find
  274.             the variable in $_SERVER which contains the script name. You must see phpinfo and setup this parameter in your config file.');
  275.     }
  276.  
  277.     /**
  278.      * get all physical pathes of responses file
  279.      */
  280.     static private function _initResponsesPath(&$list){
  281.         $copylist $list// because we modify $list and then it will search for "foo.path" responses...
  282.         foreach($copylist as $type=>$class){
  283.             if(file_exists($path=JELIX_LIB_CORE_PATH.'response/'.$class.'.class.php')){
  284.                 $list[$type.'.path']=$path;
  285.             }elseif(file_exists($path=JELIX_APP_PATH.'responses/'.$class.'.class.php')){
  286.                 $list[$type.'.path']=$path;
  287.             }else{
  288.                 throw new Exception('Jelix Config Error: the class file of the response type "'.$type.'" is not found ('.$path.')');
  289.             }
  290.         }
  291.     }
  292.  
  293.     /**
  294.      * merge two array which are the result of a parse_ini_file call
  295.      * @param $array the main array
  296.      * @param $tomerge the array to merge in the first one
  297.      */
  298.     static private function _mergeConfig(&$array$tomerge){
  299.  
  300.         foreach($tomerge as $k=>$v){
  301.             if(!isset($array[$k])){
  302.                 $array[$k$v;
  303.                 continue;
  304.             }
  305.             if($k[1== '_')
  306.                 continue;
  307.             if(is_array($v)){
  308.                 $array[$karray_merge($array[$k]$v);
  309.             }else{
  310.                 $array[$k$v;
  311.             }
  312.         }
  313.  
  314.     }
  315. }

Documentation generated on Thu, 22 Mar 2012 22:14:15 +0100 by phpDocumentor 1.4.3