2008-05-30 11:40:08 +00:00
< ? php
/**
2010-11-14 18:02:17 +00:00
* Configure class
2008-05-30 11:40:08 +00:00
*
2010-10-03 16:38:58 +00:00
* PHP 5
2008-05-30 11:40:08 +00:00
*
2009-11-06 06:46:59 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// cakephp . org )
2010-01-26 19:18:20 +00:00
* Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
2010-01-26 19:18:20 +00:00
* @ copyright Copyright 2005 - 2010 , Cake Software Foundation , Inc . ( http :// cakefoundation . org )
2009-11-06 06:00:11 +00:00
* @ link http :// cakephp . org CakePHP ( tm ) Project
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . libs
* @ since CakePHP ( tm ) v 1.0 . 0.2363
2009-11-06 06:51:51 +00:00
* @ license MIT License ( http :// www . opensource . org / licenses / mit - license . php )
2008-05-30 11:40:08 +00:00
*/
2009-07-25 22:57:49 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Configuration class ( singleton ) . Used for managing runtime configuration information .
2008-05-30 11:40:08 +00:00
*
2008-10-30 17:30:26 +00:00
* @ package cake
* @ subpackage cake . cake . libs
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 924 / The - Configuration - Class
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
class Configure {
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-07-05 02:00:49 +00:00
* Array of values currently stored in Configure .
2008-05-30 11:40:08 +00:00
*
2010-07-05 02:00:49 +00:00
* @ var array
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
protected static $_values = array (
'debug' => 0
);
2010-07-05 02:00:49 +00:00
/**
* Initializes configure and runs the bootstrap process .
*
* @ return void
*/
2010-07-05 02:03:25 +00:00
public static function bootstrap ( $boot = true ) {
self :: __loadBootstrap ( $boot );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Used to store a dynamic variable in the Configure instance .
2008-05-30 11:40:08 +00:00
*
2009-02-04 05:00:59 +00:00
* Usage :
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: write ( 'One.key1' , 'value of the Configure::One[key1]' );
* Configure :: write ( array ( 'One.key1' => 'value of the Configure::One[key1]' ));
2008-12-17 04:13:45 +00:00
* Configure :: write ( 'One' , array (
* 'key1' => 'value of the Configure::One[key1]' ,
* 'key2' => 'value of the Configure::One[key2]'
* );
2009-06-07 22:24:10 +00:00
*
2008-12-17 04:13:45 +00:00
* Configure :: write ( array (
* 'One.key1' => 'value of the Configure::One[key1]' ,
* 'One.key2' => 'value of the Configure::One[key2]'
* ));
2009-02-04 05:00:59 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 926 / write
2008-05-30 11:40:08 +00:00
* @ param array $config Name of var to write
* @ param mixed $value Value to set for var
2010-03-03 23:20:15 +00:00
* @ return boolean True if write was successful
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function write ( $config , $value = null ) {
2008-05-30 11:40:08 +00:00
if ( ! is_array ( $config )) {
$config = array ( $config => $value );
}
2009-07-24 20:50:50 +00:00
foreach ( $config as $name => $value ) {
if ( strpos ( $name , '.' ) === false ) {
2010-07-05 02:00:49 +00:00
self :: $_values [ $name ] = $value ;
2009-07-24 20:50:50 +00:00
} else {
2009-11-22 00:57:04 +00:00
$names = explode ( '.' , $name , 4 );
switch ( count ( $names )) {
case 2 :
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]][ $names [ 1 ]] = $value ;
2009-11-22 00:57:04 +00:00
break ;
case 3 :
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]][ $names [ 1 ]][ $names [ 2 ]] = $value ;
2010-09-06 20:53:04 +00:00
break ;
2009-11-22 00:57:04 +00:00
case 4 :
$names = explode ( '.' , $name , 2 );
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $names [ 0 ]])) {
self :: $_values [ $names [ 0 ]] = array ();
2009-11-22 00:57:04 +00:00
}
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]] = Set :: insert ( self :: $_values [ $names [ 0 ]], $names [ 1 ], $value );
2009-11-22 00:57:04 +00:00
break ;
2009-07-24 20:50:50 +00:00
}
2008-05-30 11:40:08 +00:00
}
}
2009-12-11 05:46:13 +00:00
if ( isset ( $config [ 'debug' ]) || isset ( $config [ 'log' ])) {
2009-09-08 03:28:50 +00:00
$reporting = 0 ;
2010-07-05 02:00:49 +00:00
if ( self :: $_values [ 'debug' ]) {
2009-09-08 03:28:50 +00:00
if ( ! class_exists ( 'Debugger' )) {
require LIBS . 'debugger.php' ;
}
$reporting = E_ALL & ~ E_DEPRECATED ;
2008-05-30 11:40:08 +00:00
if ( function_exists ( 'ini_set' )) {
ini_set ( 'display_errors' , 1 );
}
2009-09-08 03:28:50 +00:00
} elseif ( function_exists ( 'ini_set' )) {
ini_set ( 'display_errors' , 0 );
}
2008-05-30 11:40:08 +00:00
2010-07-05 02:00:49 +00:00
if ( isset ( self :: $_values [ 'log' ]) && self :: $_values [ 'log' ]) {
2008-06-11 15:46:31 +00:00
if ( ! class_exists ( 'CakeLog' )) {
2008-09-13 18:59:30 +00:00
require LIBS . 'cake_log.php' ;
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:00:49 +00:00
if ( is_integer ( self :: $_values [ 'log' ]) && ! self :: $_values [ 'debug' ]) {
$reporting = self :: $_values [ 'log' ];
2009-09-08 03:28:50 +00:00
} else {
$reporting = E_ALL & ~ E_DEPRECATED ;
}
2008-05-30 11:40:08 +00:00
}
2009-09-08 03:28:50 +00:00
error_reporting ( $reporting );
2008-05-30 11:40:08 +00:00
}
2010-03-03 23:20:15 +00:00
return true ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-07-06 01:57:39 +00:00
* Used to read information stored in the Configure instance . Currently its not
* possible to store `null` values in Configure .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* Usage :
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: read ( 'Name' ); will return all values for Name
* Configure :: read ( 'Name.key' ); will return only the value of Configure :: Name [ key ]
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 927 / read
2009-11-15 23:09:04 +00:00
* @ param string $var Variable to obtain . Use '.' to access array elements .
2010-07-06 01:57:39 +00:00
* @ return mixed value stored in configure , or null .
2008-05-30 11:40:08 +00:00
*/
2010-07-06 01:50:36 +00:00
public static function read ( $var = null ) {
if ( $var === null ) {
return self :: $_values ;
}
if ( isset ( self :: $_values [ $var ])) {
return self :: $_values [ $var ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) !== false ) {
2009-11-22 00:57:04 +00:00
$names = explode ( '.' , $var , 3 );
2009-07-24 20:50:50 +00:00
$var = $names [ 0 ];
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $var ])) {
2009-07-24 20:50:50 +00:00
return null ;
2008-05-30 11:40:08 +00:00
}
2009-11-22 00:57:04 +00:00
switch ( count ( $names )) {
case 2 :
2010-07-05 02:00:49 +00:00
if ( isset ( self :: $_values [ $var ][ $names [ 1 ]])) {
return self :: $_values [ $var ][ $names [ 1 ]];
2009-11-22 00:57:04 +00:00
}
break ;
case 3 :
2010-07-05 02:00:49 +00:00
if ( isset ( self :: $_values [ $var ][ $names [ 1 ]][ $names [ 2 ]])) {
return self :: $_values [ $var ][ $names [ 1 ]][ $names [ 2 ]];
2009-11-22 00:57:04 +00:00
}
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ $var ][ $names [ 1 ]])) {
2009-11-22 00:57:04 +00:00
return null ;
}
2010-07-05 02:00:49 +00:00
return Set :: classicExtract ( self :: $_values [ $var ][ $names [ 1 ]], $names [ 2 ]);
2009-11-22 00:57:04 +00:00
break ;
}
return null ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Used to delete a variable from the Configure instance .
2008-05-30 11:40:08 +00:00
*
* Usage :
2009-11-15 23:09:04 +00:00
* {{{
2008-05-30 11:40:08 +00:00
* Configure :: delete ( 'Name' ); will delete the entire Configure :: Name
* Configure :: delete ( 'Name.key' ); will delete only the Configure :: Name [ key ]
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 928 / delete
2008-05-30 11:40:08 +00:00
* @ param string $var the var to be deleted
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function delete ( $var = null ) {
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) === false ) {
2010-07-05 02:00:49 +00:00
unset ( self :: $_values [ $var ]);
2009-07-24 20:50:50 +00:00
return ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
$names = explode ( '.' , $var , 2 );
2010-07-05 02:00:49 +00:00
self :: $_values [ $names [ 0 ]] = Set :: remove ( self :: $_values [ $names [ 0 ]], $names [ 1 ]);
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Loads a file from app / config / configure_file . php .
* Config file variables should be formated like :
2009-11-15 23:09:04 +00:00
* `$config['name'] = 'value';`
2010-01-04 23:23:06 +00:00
* These will be used to create dynamic Configure vars . load () is also used to
2009-11-15 23:09:04 +00:00
* load stored config files created with Configure :: store ()
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* - To load config files from app / config use `Configure::load('configure_file');` .
* - To load config files from a plugin `Configure::load('plugin.configure_file');` .
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 929 / load
2008-12-17 04:13:45 +00:00
* @ param string $fileName name of file to load , extension must be . php and only the name
2009-11-15 23:09:04 +00:00
* should be used , not the extenstion
2008-09-25 16:49:56 +00:00
* @ return mixed false if file not found , void if load successful
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function load ( $fileName ) {
2009-11-16 00:55:20 +00:00
$found = $plugin = $pluginPath = false ;
list ( $plugin , $fileName ) = pluginSplit ( $fileName );
if ( $plugin ) {
$pluginPath = App :: pluginPath ( $plugin );
2009-11-15 21:59:19 +00:00
}
2009-11-25 18:41:19 +00:00
$pos = strpos ( $fileName , '..' );
2010-01-04 23:23:06 +00:00
2009-11-25 18:41:19 +00:00
if ( $pos === false ) {
if ( $pluginPath && file_exists ( $pluginPath . 'config' . DS . $fileName . '.php' )) {
include ( $pluginPath . 'config' . DS . $fileName . '.php' );
$found = true ;
} elseif ( file_exists ( CONFIGS . $fileName . '.php' )) {
include ( CONFIGS . $fileName . '.php' );
$found = true ;
} elseif ( file_exists ( CACHE . 'persistent' . DS . $fileName . '.php' )) {
include ( CACHE . 'persistent' . DS . $fileName . '.php' );
$found = true ;
} else {
foreach ( App :: core ( 'cake' ) as $key => $path ) {
if ( file_exists ( $path . DS . 'config' . DS . $fileName . '.php' )) {
include ( $path . DS . 'config' . DS . $fileName . '.php' );
$found = true ;
break ;
}
2008-05-30 11:40:08 +00:00
}
}
}
if ( ! $found ) {
return false ;
}
if ( ! isset ( $config )) {
2010-04-15 15:52:49 +00:00
trigger_error ( sprintf ( __ ( 'Configure::load() - no variable $config found in %s.php' ), $fileName ), E_USER_WARNING );
2008-05-30 11:40:08 +00:00
return false ;
}
2010-07-23 23:12:30 +00:00
return self :: write ( $config );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Used to determine the current version of CakePHP .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* Usage `Configure::version();`
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 930 / version
2008-05-30 11:40:08 +00:00
* @ return string Current version of CakePHP
*/
2010-04-15 04:06:17 +00:00
public static function version () {
2010-07-05 02:00:49 +00:00
if ( ! isset ( self :: $_values [ 'Cake' ][ 'version' ])) {
2008-05-30 11:40:08 +00:00
require ( CORE_PATH . 'cake' . DS . 'config' . DS . 'config.php' );
2010-07-23 23:12:30 +00:00
self :: write ( $config );
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:00:49 +00:00
return self :: $_values [ 'Cake' ][ 'version' ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Used to write a config file to disk .
2008-05-30 11:40:08 +00:00
*
2009-11-15 23:09:04 +00:00
* {{{
2009-11-16 00:55:20 +00:00
* Configure :: store ( 'Model' , 'class_paths' , array ( 'Users' => array (
2008-12-17 04:13:45 +00:00
* 'path' => 'users' , 'plugin' => true
* )));
2009-11-15 23:09:04 +00:00
* }}}
2008-05-30 11:40:08 +00:00
*
* @ param string $type Type of config file to write , ex : Models , Controllers , Helpers , Components
* @ param string $name file name .
* @ param array $data array of values to store .
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function store ( $type , $name , $data = array ()) {
2008-05-30 11:40:08 +00:00
$write = true ;
$content = '' ;
foreach ( $data as $key => $value ) {
2009-11-14 19:30:22 +00:00
$content .= " \$ config[' $type '][' $key '] = " . var_export ( $value , true ) . " ; \n " ;
2008-05-30 11:40:08 +00:00
}
if ( is_null ( $type )) {
$write = false ;
}
2010-07-23 23:12:30 +00:00
self :: __writeConfig ( $content , $name , $write );
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Creates a cached version of a configuration file .
* Appends values passed from Configure :: store () to the cached file
*
* @ param string $content Content to write on file
* @ param string $name Name to use for cache file
* @ param boolean $write true if content should be written , false otherwise
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
* @ access private
*/
2010-07-05 02:00:49 +00:00
private static function __writeConfig ( $content , $name , $write = true ) {
2008-05-30 11:40:08 +00:00
$file = CACHE . 'persistent' . DS . $name . '.php' ;
2010-07-23 23:12:30 +00:00
if ( self :: read ( 'debug' ) > 0 ) {
2008-05-30 11:40:08 +00:00
$expires = " +10 seconds " ;
} else {
$expires = " +999 days " ;
}
$cache = cache ( 'persistent' . DS . $name . '.php' , null , $expires );
if ( $cache === null ) {
cache ( 'persistent' . DS . $name . '.php' , " <?php \n \$ config = array(); \n " , $expires );
}
if ( $write === true ) {
2010-07-23 23:12:30 +00:00
$fileClass = new SplFileObject ( $file , 'a' );
if ( $fileClass -> isWritable ()) {
$fileClass -> fwrite ( $content );
2008-05-30 11:40:08 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Loads app / config / bootstrap . php .
* If the alternative paths are set in this file
* they will be added to the paths vars .
*
* @ param boolean $boot Load application bootstrap ( if true )
* @ return void
*/
2010-07-05 02:00:49 +00:00
private static function __loadBootstrap ( $boot ) {
2009-06-07 22:24:10 +00:00
if ( $boot ) {
2009-11-26 20:52:38 +00:00
Configure :: write ( 'App' , array ( 'base' => false , 'baseUrl' => false , 'dir' => APP_DIR , 'webroot' => WEBROOT_DIR , 'www_root' => WWW_ROOT ));
2009-06-07 22:24:10 +00:00
if ( ! include ( CONFIGS . 'core.php' )) {
2010-04-15 15:52:49 +00:00
trigger_error ( sprintf ( __ ( " Can't find application core file. Please create %score.php, and make sure it is readable by PHP. " ), CONFIGS ), E_USER_ERROR );
2009-06-07 22:24:10 +00:00
}
if ( Configure :: read ( 'Cache.disable' ) !== true ) {
$cache = Cache :: config ( 'default' );
if ( empty ( $cache [ 'settings' ])) {
2010-04-15 15:52:49 +00:00
trigger_error ( __ ( 'Cache not configured properly. Please check Cache::config(); in APP/config/core.php' ), E_USER_WARNING );
2009-06-07 22:24:10 +00:00
$cache = Cache :: config ( 'default' , array ( 'engine' => 'File' ));
}
$path = $prefix = $duration = null ;
if ( ! empty ( $cache [ 'settings' ][ 'path' ])) {
$path = realpath ( $cache [ 'settings' ][ 'path' ]);
} else {
$prefix = $cache [ 'settings' ][ 'prefix' ];
}
2010-07-06 01:50:36 +00:00
if ( Configure :: read ( 'debug' ) >= 1 ) {
2009-06-07 22:24:10 +00:00
$duration = '+10 seconds' ;
} else {
$duration = '+999 days' ;
}
if ( Cache :: config ( '_cake_core_' ) === false ) {
2009-07-22 16:11:38 +00:00
Cache :: config ( '_cake_core_' , array_merge (( array ) $cache [ 'settings' ], array (
2009-06-07 22:24:10 +00:00
'prefix' => $prefix . 'cake_core_' , 'path' => $path . DS . 'persistent' . DS ,
'serialize' => true , 'duration' => $duration
)));
}
if ( Cache :: config ( '_cake_model_' ) === false ) {
2009-07-22 16:11:38 +00:00
Cache :: config ( '_cake_model_' , array_merge (( array ) $cache [ 'settings' ], array (
2009-06-07 22:24:10 +00:00
'prefix' => $prefix . 'cake_model_' , 'path' => $path . DS . 'models' . DS ,
'serialize' => true , 'duration' => $duration
)));
}
}
2010-07-10 15:40:06 +00:00
App :: init ();
2010-02-14 00:39:11 +00:00
App :: build ();
2009-11-09 19:07:19 +00:00
if ( ! include ( CONFIGS . 'bootstrap.php' )) {
2010-04-15 15:52:49 +00:00
trigger_error ( sprintf ( __ ( " Can't find application bootstrap file. Please create %sbootstrap.php, and make sure it is readable by PHP. " ), CONFIGS ), E_USER_ERROR );
2009-11-09 19:07:19 +00:00
}
2009-06-07 22:24:10 +00:00
}
}
2010-11-14 18:02:17 +00:00
}