2008-05-30 11:40:08 +00:00
< ? php
/**
2010-01-07 02:27:56 +00:00
* App and Configure classes
2008-05-30 11:40:08 +00:00
*
* PHP versions 4 and 5
*
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 ) {
2010-07-05 02:00:49 +00:00
if ( ! class_exists ( 'Set' )) {
require LIBS . 'set.php' ;
2008-05-30 11:40:08 +00:00
}
2010-07-05 02:03:25 +00:00
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 ;
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 ;
}
2008-09-12 05:11:34 +00:00
return Configure :: 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-05 02:00:49 +00:00
Configure :: 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-05 02:00:49 +00:00
Configure :: __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-06 01:50:36 +00:00
if ( Configure :: 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 ) {
2008-06-11 15:46:31 +00:00
if ( ! class_exists ( 'File' )) {
2008-09-13 18:59:30 +00:00
require LIBS . 'file.php' ;
2008-06-11 15:46:31 +00:00
}
2008-05-30 11:40:08 +00:00
$fileClass = new File ( $file );
if ( $fileClass -> writable ()) {
$fileClass -> append ( $content );
}
}
}
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
)));
}
Cache :: config ( 'default' );
}
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
}
}
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
2010-01-07 02:27:14 +00:00
* Class / file loader and path management .
2009-06-07 22:24:10 +00:00
*
2010-04-05 03:31:50 +00:00
* @ link http :// book . cakephp . org / view / 933 / The - App - Class
2009-06-07 22:24:10 +00:00
* @ since CakePHP ( tm ) v 1.2 . 0.6001
* @ package cake
* @ subpackage cake . cake . libs
*/
2010-07-10 04:48:45 +00:00
class App {
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of object types and their properties
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $types = array (
2009-06-11 16:13:16 +00:00
'class' => array ( 'suffix' => '.php' , 'extends' => null , 'core' => true ),
'file' => array ( 'suffix' => '.php' , 'extends' => null , 'core' => true ),
'model' => array ( 'suffix' => '.php' , 'extends' => 'AppModel' , 'core' => false ),
'behavior' => array ( 'suffix' => '.php' , 'extends' => 'ModelBehavior' , 'core' => true ),
'controller' => array ( 'suffix' => '_controller.php' , 'extends' => 'AppController' , 'core' => true ),
'component' => array ( 'suffix' => '.php' , 'extends' => null , 'core' => true ),
2009-10-21 10:59:12 +00:00
'lib' => array ( 'suffix' => '.php' , 'extends' => null , 'core' => true ),
2009-06-11 16:13:16 +00:00
'view' => array ( 'suffix' => '.php' , 'extends' => null , 'core' => true ),
'helper' => array ( 'suffix' => '.php' , 'extends' => 'AppHelper' , 'core' => true ),
'vendor' => array ( 'suffix' => '' , 'extends' => null , 'core' => true ),
'shell' => array ( 'suffix' => '.php' , 'extends' => 'Shell' , 'core' => true ),
'plugin' => array ( 'suffix' => '' , 'extends' => null , 'core' => true )
2009-06-07 22:24:10 +00:00
);
/**
* List of additional path ( s ) where model files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $models = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where behavior files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $behaviors = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where controller files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $controllers = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where component files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $components = array ();
2009-07-24 19:18:37 +00:00
2009-11-04 03:45:44 +00:00
/**
* List of additional path ( s ) where datasource files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $datasources = array ();
2009-11-04 03:45:44 +00:00
2009-10-21 10:59:12 +00:00
/**
* List of additional path ( s ) where libs files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $libs = array ();
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where view files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $views = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where helper files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $helpers = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where plugins reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $plugins = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where vendor packages reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $vendors = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where locale files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $locales = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where console shell files reside .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $shells = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Paths to search for files .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
public static $search = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Whether or not to return the file that is loaded .
*
* @ var boolean
*/
2010-07-10 04:48:45 +00:00
public static $return = false ;
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Determines if $__maps and $__paths cache should be written .
*
* @ var boolean
*/
2010-07-10 04:48:45 +00:00
private static $__cache = false ;
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Holds key / value pairs of $type => file path .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
private static $__map = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Holds paths for deep searching of files .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
private static $__paths = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Holds loaded files .
*
* @ var array
*/
2010-07-10 04:48:45 +00:00
private static $__loaded = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Holds and key => value array of object types .
2008-05-30 11:40:08 +00:00
*
2009-06-07 22:24:10 +00:00
* @ var array
2008-05-30 11:40:08 +00:00
*/
2010-07-10 04:48:45 +00:00
private static $__objects = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Used to read information stored path
*
2010-01-07 02:27:14 +00:00
* Usage :
*
* `App::path('models'); will return all paths for models`
2009-06-07 22:24:10 +00:00
*
* @ param string $type type of path
* @ return string array
*/
2010-04-15 04:06:17 +00:00
public static function path ( $type ) {
2010-07-10 04:48:45 +00:00
if ( ! isset ( self :: ${$type} )) {
2009-06-11 16:13:16 +00:00
return array ();
2009-06-07 22:24:10 +00:00
}
2010-07-10 04:48:45 +00:00
return self :: ${$type} ;
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-09-27 14:56:32 +00:00
* Build path references . Merges the supplied $paths
* with the base paths and the default core paths .
2008-05-30 11:40:08 +00:00
*
* @ param array $paths paths defines in config / bootstrap . php
2009-06-11 16:13:16 +00:00
* @ param boolean $reset true will set paths , false merges paths [ default ] false
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 build ( $paths = array (), $reset = false ) {
2009-06-11 16:13:16 +00:00
$defaults = array (
'models' => array ( MODELS ),
'behaviors' => array ( BEHAVIORS ),
'datasources' => array ( MODELS . 'datasources' ),
'controllers' => array ( CONTROLLERS ),
'components' => array ( COMPONENTS ),
2009-10-21 10:59:12 +00:00
'libs' => array ( APPLIBS ),
2009-06-11 16:13:16 +00:00
'views' => array ( VIEWS ),
'helpers' => array ( HELPERS ),
'locales' => array ( APP . 'locale' . DS ),
2009-07-24 22:01:51 +00:00
'shells' => array ( APP . 'vendors' . DS . 'shells' . DS , VENDORS . 'shells' . DS ),
2009-06-11 16:13:16 +00:00
'vendors' => array ( APP . 'vendors' . DS , VENDORS ),
2009-08-09 16:36:18 +00:00
'plugins' => array ( APP . 'plugins' . DS )
2008-05-30 11:40:08 +00:00
);
2009-06-11 16:13:16 +00:00
if ( $reset == true ) {
foreach ( $paths as $type => $new ) {
2010-07-10 04:48:45 +00:00
self :: ${$type} = ( array ) $new ;
2009-06-11 16:13:16 +00:00
}
return $paths ;
}
2010-07-10 04:48:45 +00:00
$core = self :: core ();
2009-06-11 16:13:16 +00:00
$app = array ( 'models' => true , 'controllers' => true , 'helpers' => true );
foreach ( $defaults as $type => $default ) {
2008-05-30 11:40:08 +00:00
$merge = array ();
2009-06-11 16:13:16 +00:00
if ( isset ( $app [ $type ])) {
$merge = array ( APP );
2008-05-30 11:40:08 +00:00
}
2009-06-11 16:13:16 +00:00
if ( isset ( $core [ $type ])) {
$merge = array_merge ( $merge , ( array ) $core [ $type ]);
2008-05-30 11:40:08 +00:00
}
2010-03-26 03:44:40 +00:00
if ( empty ( $_this -> { $type }) || empty ( $paths )) {
2010-07-10 04:48:45 +00:00
self :: ${$type} = $default ;
2010-03-26 03:44:40 +00:00
}
2008-05-30 11:40:08 +00:00
2009-06-11 16:13:16 +00:00
if ( ! empty ( $paths [ $type ])) {
2010-01-25 16:14:18 +00:00
$path = array_flip ( array_flip ( array_merge (
2010-07-10 04:48:45 +00:00
( array ) $paths [ $type ], self :: ${$type} , $merge
2010-01-25 16:14:18 +00:00
)));
2010-07-10 04:48:45 +00:00
self :: ${$type} = array_values ( $path );
2008-05-30 11:40:08 +00:00
} else {
2010-07-10 04:48:45 +00:00
$path = array_flip ( array_flip ( array_merge ( self :: ${$type} , $merge )));
self :: ${$type} = array_values ( $path );
2008-05-30 11:40:08 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2009-08-28 04:31:54 +00:00
/**
* Get the path that a plugin is on . Searches through the defined plugin paths .
*
2010-07-01 00:17:17 +00:00
* @ param string $plugin CamelCased / lower_cased plugin name to find the path of .
2009-08-28 04:31:54 +00:00
* @ return string full path to the plugin .
2009-11-14 12:19:25 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function pluginPath ( $plugin ) {
2009-08-28 04:31:54 +00:00
$pluginDir = Inflector :: underscore ( $plugin );
2010-07-10 04:48:45 +00:00
for ( $i = 0 , $length = count ( self :: $plugins ); $i < $length ; $i ++ ) {
if ( is_dir ( self :: $plugins [ $i ] . $pluginDir )) {
return self :: $plugins [ $i ] . $pluginDir . DS ;
2009-08-28 04:31:54 +00:00
}
}
2010-07-10 04:48:45 +00:00
return self :: $plugins [ 0 ] . $pluginDir . DS ;
2009-08-28 04:31:54 +00:00
}
2010-07-01 00:17:17 +00:00
/**
* Find the path that a theme is on . Search through the defined theme paths .
*
* @ param string $theme lower_cased theme name to find the path of .
* @ return string full path to the theme .
*/
2010-07-01 02:48:30 +00:00
public static function themePath ( $theme ) {
2010-07-01 00:17:17 +00:00
$themeDir = 'themed' . DS . Inflector :: underscore ( $theme );
2010-07-10 04:48:45 +00:00
for ( $i = 0 , $length = count ( self :: $views ); $i < $length ; $i ++ ) {
if ( is_dir ( self :: $views [ $i ] . $themeDir )) {
return self :: $views [ $i ] . $themeDir . DS ;
2010-07-01 00:17:17 +00:00
}
}
2010-07-10 04:48:45 +00:00
return self :: $views [ 0 ] . $themeDir . DS ;
2010-07-01 00:17:17 +00:00
}
2008-05-30 11:40:08 +00:00
/**
2009-06-07 22:24:10 +00:00
* Returns a key / value list of all paths where core libs are found .
* Passing $type only returns the values for a given value of $key .
2008-05-30 11:40:08 +00:00
*
2009-06-07 22:24:10 +00:00
* @ param string $type valid values are : 'model' , 'behavior' , 'controller' , 'component' ,
2010-01-07 02:27:14 +00:00
* 'view' , 'helper' , 'datasource' , 'libs' , and 'cake'
2009-06-07 22:24:10 +00:00
* @ return array numeric keyed array of core lib paths
2008-05-30 11:40:08 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function core ( $type = null ) {
2010-01-25 16:14:18 +00:00
static $paths = false ;
if ( $paths === false ) {
$paths = Cache :: read ( 'core_paths' , '_cake_core_' );
}
2009-06-07 22:24:10 +00:00
if ( ! $paths ) {
$paths = array ();
2010-02-14 00:06:52 +00:00
$libs = dirname ( __FILE__ ) . DS ;
$cake = dirname ( $libs ) . DS ;
$path = dirname ( $cake ) . DS ;
$paths [ 'cake' ][] = $cake ;
$paths [ 'libs' ][] = $libs ;
$paths [ 'models' ][] = $libs . 'model' . DS ;
$paths [ 'datasources' ][] = $libs . 'model' . DS . 'datasources' . DS ;
$paths [ 'behaviors' ][] = $libs . 'model' . DS . 'behaviors' . DS ;
$paths [ 'controllers' ][] = $libs . 'controller' . DS ;
$paths [ 'components' ][] = $libs . 'controller' . DS . 'components' . DS ;
$paths [ 'views' ][] = $libs . 'view' . DS ;
$paths [ 'helpers' ][] = $libs . 'view' . DS . 'helpers' . DS ;
$paths [ 'plugins' ][] = $path . 'plugins' . DS ;
$paths [ 'vendors' ][] = $path . 'vendors' . DS ;
$paths [ 'shells' ][] = $cake . 'console' . DS . 'libs' . DS ;
2009-06-07 22:24:10 +00:00
Cache :: write ( 'core_paths' , array_filter ( $paths ), '_cake_core_' );
}
if ( $type && isset ( $paths [ $type ])) {
return $paths [ $type ];
}
return $paths ;
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
2010-06-30 12:45:06 +00:00
* Returns an array of objects of the given type .
*
* Example usage :
*
* `App::objects('plugin');` returns `array('DebugKit', 'Blog', 'User');`
2009-06-07 22:24:10 +00:00
*
2010-01-07 02:27:14 +00:00
* @ param string $type Type of object , i . e . 'model' , 'controller' , 'helper' , or 'plugin'
* @ param mixed $path Optional Scan only the path given . If null , paths for the chosen
* type will be used .
* @ param boolean $cache Set to false to rescan objects of the chosen type . Defaults to true .
* @ return mixed Either false on incorrect / miss . Or an array of found objects .
2009-06-07 22:24:10 +00:00
*/
2010-04-15 04:06:17 +00:00
public static function objects ( $type , $path = null , $cache = true ) {
2009-06-07 22:24:10 +00:00
$objects = array ();
$extension = false ;
$name = $type ;
2008-05-30 11:40:08 +00:00
2009-06-07 22:24:10 +00:00
if ( $type === 'file' && ! $path ) {
return false ;
} elseif ( $type === 'file' ) {
$extension = true ;
$name = $type . str_replace ( DS , '' , $path );
}
2008-05-30 11:40:08 +00:00
2010-07-10 04:48:45 +00:00
if ( empty ( self :: $__objects ) && $cache === true ) {
self :: $__objects = Cache :: read ( 'object_map' , '_cake_core_' );
2009-06-07 22:24:10 +00:00
}
2008-05-30 11:40:08 +00:00
2010-07-10 04:48:45 +00:00
if ( ! isset ( self :: $__objects [ $name ]) || $cache !== true ) {
$types = self :: $types ;
2008-09-09 11:32:18 +00:00
2009-06-07 22:24:10 +00:00
if ( ! isset ( $types [ $type ])) {
return false ;
}
$objects = array ();
if ( empty ( $path )) {
2010-07-10 04:48:45 +00:00
$path = self :: $ { " { $type } s " };
2009-06-07 22:24:10 +00:00
if ( isset ( $types [ $type ][ 'core' ]) && $types [ $type ][ 'core' ] === false ) {
array_pop ( $path );
2008-05-30 11:40:08 +00:00
}
2009-06-07 22:24:10 +00:00
}
$items = array ();
2008-05-30 11:40:08 +00:00
2009-06-07 22:24:10 +00:00
foreach (( array ) $path as $dir ) {
2010-01-08 09:39:40 +00:00
if ( $dir != APP ) {
2010-07-10 04:48:45 +00:00
$items = self :: __list ( $dir , $types [ $type ][ 'suffix' ], $extension );
2009-06-07 22:24:10 +00:00
$objects = array_merge ( $items , array_diff ( $objects , $items ));
2010-01-08 09:39:40 +00:00
}
2009-06-07 22:24:10 +00:00
}
2008-05-30 11:40:08 +00:00
2009-06-07 22:24:10 +00:00
if ( $type !== 'file' ) {
foreach ( $objects as $key => $value ) {
$objects [ $key ] = Inflector :: camelize ( $value );
2008-06-02 17:35:56 +00:00
}
2008-05-30 11:40:08 +00:00
}
2009-07-25 22:57:49 +00:00
if ( $cache === true ) {
2010-07-10 04:48:45 +00:00
self :: $__cache = true ;
2009-06-07 22:24:10 +00:00
}
2010-07-10 04:48:45 +00:00
self :: $__objects [ $name ] = $objects ;
2008-05-30 11:40:08 +00:00
}
2009-07-25 22:57:49 +00:00
2010-07-10 04:48:45 +00:00
return self :: $__objects [ $name ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 19:18:37 +00:00
2010-04-24 02:04:16 +00:00
/**
* Allows you to modify the object listings that App maintains inside of it
* Useful for testing
*
* @ param string $type Type of object listing you are changing
* @ param array $values The values $type should be set to .
* @ return void
*/
public static function setObjects ( $type , $values ) {
2010-07-10 04:48:45 +00:00
self :: $__objects [ $type ] = $values ;
2010-04-24 02:04:16 +00:00
}
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Finds classes based on $name or specific file ( s ) to search .
2008-05-30 11:40:08 +00:00
*
2010-03-28 15:34:58 +00:00
* @ link http :// book . cakephp . org / view / 934 / Using - App - import
2008-12-17 04:13:45 +00:00
* @ param mixed $type The type of Class if passed as a string , or all params can be passed as
* an single array to $type ,
2008-05-30 11:40:08 +00:00
* @ param string $name Name of the Class or a unique name for the file
2008-12-17 04:13:45 +00:00
* @ param mixed $parent boolean true if Class Parent should be searched , accepts key => value
* array ( 'parent' => $parent , 'file' => $file , 'search' => $search , 'ext' => '$ext' );
* $ext allows setting the extension of the file name
* based on Inflector :: underscore ( $name ) . " . $ext " ;
2008-05-30 11:40:08 +00:00
* @ param array $search paths to search for files , array ( 'path 1' , 'path 2' , 'path 3' );
* @ param string $file full name of the file to search for including extension
2008-12-17 04:13:45 +00:00
* @ param boolean $return , return the loaded file , the file must have a return
* statement in it to work : return $variable ;
2008-05-30 11:40:08 +00:00
* @ return boolean true if Class is already in memory or if file is found and loaded , false if not
*/
2010-04-15 04:06:17 +00:00
public static function import ( $type = null , $name = null , $parent = true , $search = array (), $file = null , $return = false ) {
2008-09-12 05:11:34 +00:00
$plugin = $directory = null ;
2008-05-30 11:40:08 +00:00
if ( is_array ( $type )) {
extract ( $type , EXTR_OVERWRITE );
}
if ( is_array ( $parent )) {
extract ( $parent , EXTR_OVERWRITE );
}
if ( $name === null && $file === null ) {
$name = $type ;
$type = 'Core' ;
} elseif ( $name === null ) {
$type = 'File' ;
}
if ( is_array ( $name )) {
foreach ( $name as $class ) {
$tempType = $type ;
$plugin = null ;
if ( strpos ( $class , '.' ) !== false ) {
$value = explode ( '.' , $class );
$count = count ( $value );
if ( $count > 2 ) {
$tempType = $value [ 0 ];
$plugin = $value [ 1 ] . '.' ;
$class = $value [ 2 ];
2008-09-09 11:32:18 +00:00
} elseif ( $count === 2 && ( $type === 'Core' || $type === 'File' )) {
2008-05-30 11:40:08 +00:00
$tempType = $value [ 0 ];
$class = $value [ 1 ];
} else {
$plugin = $value [ 0 ] . '.' ;
$class = $value [ 1 ];
}
}
2008-09-09 05:26:09 +00:00
2009-07-30 22:01:22 +00:00
if ( ! App :: import ( $tempType , $plugin . $class , $parent )) {
2008-05-30 11:40:08 +00:00
return false ;
}
}
return true ;
}
if ( $name != null && strpos ( $name , '.' ) !== false ) {
list ( $plugin , $name ) = explode ( '.' , $name );
2009-06-11 16:13:16 +00:00
$plugin = Inflector :: camelize ( $plugin );
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
self :: $return = $return ;
2008-05-30 11:40:08 +00:00
if ( isset ( $ext )) {
2009-06-11 16:13:16 +00:00
$file = Inflector :: underscore ( $name ) . " . { $ext } " ;
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
$ext = self :: __settings ( $type , $plugin , $parent );
2008-05-30 11:40:08 +00:00
if ( $name != null && ! class_exists ( $name . $ext [ 'class' ])) {
2010-07-10 04:48:45 +00:00
if ( $load = self :: __mapped ( $name . $ext [ 'class' ], $type , $plugin )) {
if ( self :: __load ( $load )) {
self :: __overload ( $type , $name . $ext [ 'class' ], $parent );
2008-05-30 11:40:08 +00:00
2010-07-10 04:48:45 +00:00
if ( self :: $return ) {
2010-01-25 16:14:18 +00:00
return include ( $load );
2008-05-30 11:40:08 +00:00
}
return true ;
} else {
2010-07-10 04:48:45 +00:00
self :: __remove ( $name . $ext [ 'class' ], $type , $plugin );
self :: $__cache = true ;
2008-05-30 11:40:08 +00:00
}
}
if ( ! empty ( $search )) {
2010-07-10 04:48:45 +00:00
self :: $search = $search ;
2008-05-30 11:40:08 +00:00
} elseif ( $plugin ) {
2010-07-10 04:48:45 +00:00
self :: $search = self :: __paths ( 'plugin' );
2008-05-30 11:40:08 +00:00
} else {
2010-07-10 04:48:45 +00:00
self :: $search = self :: __paths ( $type );
2008-05-30 11:40:08 +00:00
}
$find = $file ;
if ( $find === null ) {
$find = Inflector :: underscore ( $name . $ext [ 'suffix' ]) . '.php' ;
if ( $plugin ) {
2010-07-10 04:48:45 +00:00
$paths = self :: $search ;
2008-05-30 11:40:08 +00:00
foreach ( $paths as $key => $value ) {
2010-07-10 04:48:45 +00:00
self :: $search [ $key ] = $value . $ext [ 'path' ];
2008-05-30 11:40:08 +00:00
}
}
}
2010-07-10 04:48:45 +00:00
if ( strtolower ( $type ) !== 'vendor' && empty ( $search ) && self :: __load ( $file )) {
2008-05-30 11:40:08 +00:00
$directory = false ;
} else {
$file = $find ;
2010-07-10 04:48:45 +00:00
$directory = self :: __find ( $find , true );
2008-05-30 11:40:08 +00:00
}
if ( $directory !== null ) {
2010-07-10 04:48:45 +00:00
self :: $__cache = true ;
self :: __map ( $directory . $file , $name . $ext [ 'class' ], $type , $plugin );
self :: __overload ( $type , $name . $ext [ 'class' ], $parent );
2008-05-30 11:40:08 +00:00
2010-07-10 04:48:45 +00:00
if ( self :: $return ) {
2010-01-25 16:14:18 +00:00
return include ( $directory . $file );
2008-05-30 11:40:08 +00:00
}
return true ;
}
return false ;
}
return true ;
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2010-07-10 04:48:45 +00:00
* Initializes the cache for App , registers a shutdown function .
2008-05-30 11:40:08 +00:00
*
2010-07-10 04:48:45 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-07-10 04:48:45 +00:00
public static function init () {
self :: $__map = ( array ) Cache :: read ( 'file_map' , '_cake_core_' );
register_shutdown_function ( array ( 'App' , 'shutdown' ));
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
* Locates the $file in $__paths , searches recursively .
2008-05-30 11:40:08 +00:00
*
* @ param string $file full file name
* @ param boolean $recursive search $__paths recursively
* @ return mixed boolean on fail , $file directory path on success
*/
2010-07-10 04:48:45 +00:00
private static function __find ( $file , $recursive = true ) {
2010-01-25 16:14:18 +00:00
static $appPath = false ;
2010-07-10 04:48:45 +00:00
if ( empty ( self :: $search )) {
2008-05-30 11:40:08 +00:00
return null ;
2010-07-10 04:48:45 +00:00
} elseif ( is_string ( self :: $search )) {
$this -> search = array ( self :: $search );
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
if ( empty ( self :: $__paths )) {
self :: $__paths = Cache :: read ( 'dir_map' , '_cake_core_' );
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
foreach ( self :: $search as $path ) {
2010-01-25 16:14:18 +00:00
if ( $appPath === false ) {
$appPath = rtrim ( APP , DS );
}
2008-05-30 11:40:08 +00:00
$path = rtrim ( $path , DS );
2010-01-25 16:14:18 +00:00
if ( $path === $appPath ) {
2008-05-30 11:40:08 +00:00
$recursive = false ;
}
if ( $recursive === false ) {
2010-07-10 04:48:45 +00:00
if ( self :: __load ( $path . DS . $file )) {
2008-05-30 11:40:08 +00:00
return $path . DS ;
}
continue ;
}
2009-07-25 22:57:49 +00:00
2010-07-10 04:48:45 +00:00
if ( ! isset ( self :: $__paths [ $path ])) {
2008-09-24 00:33:54 +00:00
if ( ! class_exists ( 'Folder' )) {
require LIBS . 'folder.php' ;
}
2008-05-30 11:40:08 +00:00
$Folder =& new Folder ();
2010-01-25 16:14:18 +00:00
$directories = $Folder -> tree ( $path , array ( '.svn' , '.git' , 'CVS' , 'tests' , 'templates' ), 'dir' );
2009-07-26 01:27:02 +00:00
sort ( $directories );
2010-07-10 04:48:45 +00:00
self :: $__paths [ $path ] = $directories ;
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
foreach ( self :: $__paths [ $path ] as $directory ) {
if ( self :: __load ( $directory . DS . $file )) {
2008-05-30 11:40:08 +00:00
return $directory . DS ;
}
}
}
return null ;
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Attempts to load $file .
2008-05-30 11:40:08 +00:00
*
* @ param string $file full path to file including file name
* @ return boolean
2008-09-25 16:49:56 +00:00
* @ access private
2008-05-30 11:40:08 +00:00
*/
2010-07-10 04:48:45 +00:00
private static function __load ( $file ) {
2008-08-27 16:43:15 +00:00
if ( empty ( $file )) {
return false ;
}
2010-07-10 04:48:45 +00:00
if ( ! self :: $return && isset ( self :: $__loaded [ $file ])) {
2008-05-30 11:40:08 +00:00
return true ;
}
if ( file_exists ( $file )) {
2010-07-10 04:48:45 +00:00
if ( ! self :: $return ) {
2008-05-30 11:40:08 +00:00
require ( $file );
2010-07-10 04:48:45 +00:00
self :: $__loaded [ $file ] = true ;
2008-05-30 11:40:08 +00:00
}
return true ;
}
return false ;
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Maps the $name to the $file .
2008-05-30 11:40:08 +00:00
*
* @ param string $file full path to file
* @ param string $name unique name for this map
* @ param string $type type object being mapped
2009-06-11 16:13:16 +00:00
* @ param string $plugin camelized if object is from a plugin , the name of the plugin
2010-01-07 02:27:14 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
* @ access private
*/
2010-07-10 04:48:45 +00:00
private static function __map ( $file , $name , $type , $plugin ) {
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2010-07-10 04:48:45 +00:00
self :: $__map [ 'Plugin' ][ $plugin ][ $type ][ $name ] = $file ;
2008-05-30 11:40:08 +00:00
} else {
2010-07-10 04:48:45 +00:00
self :: $__map [ $type ][ $name ] = $file ;
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
* Returns a file ' s complete path .
2008-05-30 11:40:08 +00:00
*
* @ param string $name unique name
* @ param string $type type object
2009-06-11 16:13:16 +00:00
* @ param string $plugin camelized if object is from a plugin , the name of the plugin
2008-05-30 11:40:08 +00:00
* @ return mixed , file path if found , false otherwise
* @ access private
*/
2010-07-10 04:48:45 +00:00
private static function __mapped ( $name , $type , $plugin ) {
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2010-07-10 04:48:45 +00:00
if ( isset ( self :: $__map [ 'Plugin' ][ $plugin ][ $type ]) && isset ( self :: $__map [ 'Plugin' ][ $plugin ][ $type ][ $name ])) {
return self :: $__map [ 'Plugin' ][ $plugin ][ $type ][ $name ];
2008-05-30 11:40:08 +00:00
}
2008-09-12 05:11:34 +00:00
return false ;
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
if ( isset ( self :: $__map [ $type ]) && isset ( self :: $__map [ $type ][ $name ])) {
return self :: $__map [ $type ][ $name ];
2008-05-30 11:40:08 +00:00
}
2008-09-12 05:11:34 +00:00
return false ;
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 overload objects as needed .
2008-05-30 11:40:08 +00:00
*
* @ param string $type Model or Helper
* @ param string $name Class name to overload
* @ access private
*/
2010-04-15 04:06:17 +00:00
private function __overload ( $type , $name , $parent ) {
2010-04-18 05:02:39 +00:00
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 parent classes based on $type .
* Returns a prefix or suffix needed for loading files .
2008-05-30 11:40:08 +00:00
*
* @ param string $type type of object
2009-06-11 16:13:16 +00:00
* @ param string $plugin camelized name of plugin
2008-05-30 11:40:08 +00:00
* @ param boolean $parent false will not attempt to load parent
* @ return array
* @ access private
*/
2010-07-10 04:48:45 +00:00
private static function __settings ( $type , $plugin , $parent ) {
2008-05-30 11:40:08 +00:00
if ( ! $parent ) {
2010-01-25 16:14:18 +00:00
return array ( 'class' => null , 'suffix' => null , 'path' => null );
2008-05-30 11:40:08 +00:00
}
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$pluginPath = Inflector :: underscore ( $plugin );
2008-05-30 11:40:08 +00:00
}
$path = null ;
2008-06-17 15:43:08 +00:00
$load = strtolower ( $type );
2008-05-30 11:40:08 +00:00
switch ( $load ) {
case 'model' :
if ( ! class_exists ( 'Model' )) {
2009-07-30 22:01:22 +00:00
require LIBS . 'model' . DS . 'model.php' ;
2008-05-30 11:40:08 +00:00
}
2008-10-12 02:33:12 +00:00
if ( ! class_exists ( 'AppModel' )) {
2009-07-30 22:01:22 +00:00
App :: import ( $type , 'AppModel' , false );
2008-10-12 02:33:12 +00:00
}
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
if ( ! class_exists ( $plugin . 'AppModel' )) {
App :: import ( $type , $plugin . '.' . $plugin . 'AppModel' , false , array (), $pluginPath . DS . $pluginPath . '_app_model.php' );
2008-10-12 02:33:12 +00:00
}
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'models' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => null , 'suffix' => null , 'path' => $path );
break ;
case 'behavior' :
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'models' . DS . 'behaviors' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => $type , 'suffix' => null , 'path' => $path );
break ;
2010-01-25 16:14:18 +00:00
case 'datasource' :
if ( $plugin ) {
$path = $pluginPath . DS . 'models' . DS . 'datasources' . DS ;
}
return array ( 'class' => $type , 'suffix' => null , 'path' => $path );
2008-05-30 11:40:08 +00:00
case 'controller' :
2008-09-12 05:11:34 +00:00
App :: import ( $type , 'AppController' , false );
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
App :: import ( $type , $plugin . '.' . $plugin . 'AppController' , false , array (), $pluginPath . DS . $pluginPath . '_app_controller.php' );
$path = $pluginPath . DS . 'controllers' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => $type , 'suffix' => $type , 'path' => $path );
break ;
case 'component' :
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'controllers' . DS . 'components' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => $type , 'suffix' => null , 'path' => $path );
break ;
2009-10-21 10:59:12 +00:00
case 'lib' :
if ( $plugin ) {
$path = $pluginPath . DS . 'libs' . DS ;
}
return array ( 'class' => null , 'suffix' => null , 'path' => $path );
break ;
2008-05-30 11:40:08 +00:00
case 'view' :
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'views' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => $type , 'suffix' => null , 'path' => $path );
break ;
case 'helper' :
2008-10-12 02:33:12 +00:00
if ( ! class_exists ( 'AppHelper' )) {
App :: import ( $type , 'AppHelper' , false );
}
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'views' . DS . 'helpers' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => $type , 'suffix' => null , 'path' => $path );
break ;
case 'vendor' :
if ( $plugin ) {
2009-06-11 16:13:16 +00:00
$path = $pluginPath . DS . 'vendors' . DS ;
2008-05-30 11:40:08 +00:00
}
return array ( 'class' => null , 'suffix' => null , 'path' => $path );
break ;
default :
$type = $suffix = $path = null ;
break ;
}
return array ( 'class' => null , 'suffix' => null , 'path' => null );
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Returns default search paths .
2008-05-30 11:40:08 +00:00
*
* @ param string $type type of object to be searched
* @ return array list of paths
*/
2010-07-10 04:48:45 +00:00
private static function __paths ( $type ) {
2008-09-09 11:32:18 +00:00
$type = strtolower ( $type );
2009-07-25 22:57:49 +00:00
$paths = array ();
2008-09-09 11:32:18 +00:00
if ( $type === 'core' ) {
2009-07-26 01:27:02 +00:00
return App :: core ( 'libs' );
2008-05-30 11:40:08 +00:00
}
2010-07-10 04:48:45 +00:00
if ( isset ( self :: $ { $type . 's' })) {
return self :: $ { $type . 's' };
2008-09-09 05:26:09 +00:00
}
2009-07-25 22:57:49 +00:00
return $paths ;
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
* Removes file location from map if the file has been deleted .
2008-05-30 11:40:08 +00:00
*
* @ param string $name name of object
* @ param string $type type of object
2009-06-11 16:13:16 +00:00
* @ param string $plugin camelized name of plugin
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-07-10 04:48:45 +00:00
private static function __remove ( $name , $type , $plugin ) {
2008-05-30 11:40:08 +00:00
if ( $plugin ) {
2010-07-10 04:48:45 +00:00
unset ( self :: $__map [ 'Plugin' ][ $plugin ][ $type ][ $name ]);
2008-05-30 11:40:08 +00:00
} else {
2010-07-10 04:48:45 +00:00
unset ( self :: $__map [ $type ][ $name ]);
2008-05-30 11:40:08 +00:00
}
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Returns an array of filenames of PHP files in the given directory .
*
2009-11-15 23:09:04 +00:00
* @ param string $path Path to scan for files
* @ param string $suffix if false , return only directories . if string , match and return files
2009-06-07 22:24:10 +00:00
* @ return array List of directories or files in directory
*/
2010-07-10 04:48:45 +00:00
private static function __list ( $path , $suffix = false , $extension = false ) {
2009-06-07 22:24:10 +00:00
if ( ! class_exists ( 'Folder' )) {
require LIBS . 'folder.php' ;
}
$items = array ();
$Folder =& new Folder ( $path );
$contents = $Folder -> read ( false , true );
if ( is_array ( $contents )) {
if ( ! $suffix ) {
return $contents [ 0 ];
} else {
foreach ( $contents [ 1 ] as $item ) {
if ( substr ( $item , - strlen ( $suffix )) === $suffix ) {
if ( $extension ) {
$items [] = $item ;
} else {
$items [] = substr ( $item , 0 , strlen ( $item ) - strlen ( $suffix ));
}
}
}
}
}
return $items ;
}
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Object destructor .
2008-05-30 11:40:08 +00:00
*
2008-10-28 17:08:14 +00:00
* Writes cache file if changes have been made to the $__map or $__paths
2008-11-08 02:54:07 +00:00
*
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
*/
2010-07-10 04:48:45 +00:00
public static function shutdown () {
if ( self :: $__cache ) {
2009-06-07 22:24:10 +00:00
$core = App :: core ( 'cake' );
2010-07-10 04:48:45 +00:00
unset ( self :: $__paths [ rtrim ( $core [ 0 ], DS )]);
Cache :: write ( 'dir_map' , array_filter ( self :: $__paths ), '_cake_core_' );
Cache :: write ( 'file_map' , array_filter ( self :: $__map ), '_cake_core_' );
Cache :: write ( 'object_map' , self :: $__objects , '_cake_core_' );
2008-05-30 11:40:08 +00:00
}
}
}