2008-05-30 11:40:08 +00:00
< ? php
/* SVN FILE: $Id$ */
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
* Short description for file .
*
* Long description for filec
*
* PHP versions 4 and 5
*
2008-10-30 17:30:26 +00:00
* CakePHP ( tm ) : Rapid Development Framework ( http :// www . cakephp . org )
* Copyright 2005 - 2008 , Cake Software Foundation , Inc . ( http :// www . cakefoundation . org )
2008-05-30 11:40:08 +00:00
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
* @ filesource
2008-10-30 17:30:26 +00:00
* @ copyright Copyright 2005 - 2008 , Cake Software Foundation , Inc . ( http :// www . cakefoundation . org )
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
* @ package cake
* @ subpackage cake . cake . libs
* @ since CakePHP ( tm ) v 1.0 . 0.2363
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
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
* @ link http :// book . cakephp . org / view / 42 / The - Configuration - Class
2008-05-30 11:40:08 +00:00
*/
class Configure extends Object {
2009-07-24 19:18:37 +00:00
2008-05-30 11:40:08 +00:00
/**
2008-10-28 17:08:14 +00:00
* Current debug level .
2008-05-30 11:40:08 +00:00
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 44 / CakePHP - Core - Configuration - Variables
2008-05-30 11:40:08 +00:00
* @ var integer
* @ access public
*/
var $debug = 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 a singleton instance of the Configure class .
2008-05-30 11:40:08 +00:00
*
* @ return Configure instance
* @ access public
*/
function & getInstance ( $boot = true ) {
static $instance = array ();
if ( ! $instance ) {
2009-07-25 19:32:02 +00:00
if ( ! class_exists ( 'Set' )) {
require LIBS . 'set.php' ;
}
2008-05-30 11:40:08 +00:00
$instance [ 0 ] =& new Configure ();
$instance [ 0 ] -> __loadBootstrap ( $boot );
}
return $instance [ 0 ];
}
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
*
2009-02-04 05:00:59 +00:00
* @ link http :// book . cakephp . org / view / 412 / 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
2008-09-25 16:49:56 +00:00
* @ return void
2008-05-30 11:40:08 +00:00
* @ access public
*/
function write ( $config , $value = null ) {
$_this =& Configure :: getInstance ();
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 ) {
$_this -> { $name } = $value ;
} else {
$names = explode ( '.' , $name , 2 );
if ( ! isset ( $_this -> { $names [ 0 ]})) {
$_this -> { $names [ 0 ]} = array ();
}
$_this -> { $names [ 0 ]} = Set :: insert ( $_this -> { $names [ 0 ]}, $names [ 1 ], $value );
2008-05-30 11:40:08 +00:00
}
}
2008-09-12 05:11:34 +00:00
if ( isset ( $config [ 'debug' ])) {
2008-05-30 11:40:08 +00:00
if ( $_this -> debug ) {
2009-07-31 15:48:30 +00:00
error_reporting ( E_ALL & ~ E_DEPRECATED );
2008-05-30 11:40:08 +00:00
if ( function_exists ( 'ini_set' )) {
ini_set ( 'display_errors' , 1 );
}
if ( ! class_exists ( 'Debugger' )) {
2008-09-13 18:59:30 +00:00
require LIBS . 'debugger.php' ;
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
}
Configure :: write ( 'log' , LOG_NOTICE );
} else {
error_reporting ( 0 );
Configure :: write ( 'log' , LOG_NOTICE );
}
}
}
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 read information stored in the Configure instance .
2008-05-30 11:40:08 +00:00
*
* Usage
* Configure :: read ( 'Name' ); will return all values for Name
* Configure :: read ( 'Name.key' ); will return only the value of Configure :: Name [ key ]
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 413 / read
2008-05-30 11:40:08 +00:00
* @ param string $var Variable to obtain
* @ return string value of Configure :: $var
* @ access public
*/
function read ( $var = 'debug' ) {
$_this =& Configure :: getInstance ();
if ( $var === 'debug' ) {
if ( ! isset ( $_this -> debug )) {
if ( defined ( 'DEBUG' )) {
$_this -> debug = DEBUG ;
} else {
$_this -> debug = 0 ;
}
}
return $_this -> debug ;
}
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) !== false ) {
$names = explode ( '.' , $var , 2 );
$var = $names [ 0 ];
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
if ( ! isset ( $_this -> { $var })) {
return null ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
if ( ! empty ( $names [ 1 ])) {
return Set :: extract ( $_this -> { $var }, $names [ 1 ]);
}
return $_this -> { $var };
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 :
* Configure :: delete ( 'Name' ); will delete the entire Configure :: Name
* Configure :: delete ( 'Name.key' ); will delete only the Configure :: Name [ key ]
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 414 / 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
* @ access public
*/
function delete ( $var = null ) {
$_this =& Configure :: getInstance ();
2009-07-24 20:50:50 +00:00
if ( strpos ( $var , '.' ) === false ) {
unset ( $_this -> { $var });
return ;
2008-05-30 11:40:08 +00:00
}
2009-07-24 20:50:50 +00:00
$names = explode ( '.' , $var , 2 );
$_this -> { $names [ 0 ]} = Set :: remove ( $_this -> { $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 :
2008-05-30 11:40:08 +00:00
* $config [ 'name' ] = 'value' ;
* These will be used to create dynamic Configure vars .
*
* Usage Configure :: load ( 'configure_file' );
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 415 / 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
* 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
* @ access public
*/
function load ( $fileName ) {
$found = false ;
if ( 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 {
2009-06-07 22:24:10 +00:00
foreach ( App :: core ( 'cake' ) as $key => $path ) {
2008-05-30 11:40:08 +00:00
if ( file_exists ( $path . DS . 'config' . DS . $fileName . '.php' )) {
include ( $path . DS . 'config' . DS . $fileName . '.php' );
$found = true ;
break ;
}
}
}
if ( ! $found ) {
return false ;
}
if ( ! isset ( $config )) {
2008-12-17 04:13:45 +00:00
$error = __ ( " Configure::load() - no variable \$ config found in %s.php " , true );
trigger_error ( sprintf ( $error , $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
*
* Usage Configure :: version ();
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 416 / version
2008-05-30 11:40:08 +00:00
* @ return string Current version of CakePHP
* @ access public
*/
function version () {
$_this =& Configure :: getInstance ();
if ( ! isset ( $_this -> Cake [ 'version' ])) {
require ( CORE_PATH . 'cake' . DS . 'config' . DS . 'config.php' );
$_this -> write ( $config );
}
return $_this -> Cake [ 'version' ];
}
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
*
2008-12-17 04:13:45 +00:00
* Configure :: store ( 'Model' , 'class.paths' , array ( 'Users' => array (
* 'path' => 'users' , 'plugin' => true
* )));
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
* @ access public
*/
function store ( $type , $name , $data = array ()) {
$write = true ;
$content = '' ;
foreach ( $data as $key => $value ) {
$content .= " \$ config[' $type '][' $key '] " ;
if ( is_array ( $value )) {
$content .= " = array( " ;
foreach ( $value as $key1 => $value2 ) {
$value2 = addslashes ( $value2 );
$content .= " ' $key1 ' => ' $value2 ', " ;
}
$content .= " ); \n " ;
} else {
$value = addslashes ( $value );
$content .= " = ' $value '; \n " ;
}
}
if ( is_null ( $type )) {
$write = false ;
}
2008-09-12 05:11:34 +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
*/
function __writeConfig ( $content , $name , $write = true ) {
$file = CACHE . 'persistent' . DS . $name . '.php' ;
2008-10-15 17:30:08 +00:00
if ( Configure :: read () > 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
/**
* @ deprecated
* @ see App :: objects ()
*/
function listObjects ( $type , $path = null , $cache = true ) {
return App :: objects ( $type , $path , $cache );
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* @ deprecated
* @ see App :: core ()
*/
function corePaths ( $type = null ) {
return App :: core ( $type );
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* @ deprecated
* @ see App :: build ()
*/
function buildPaths ( $paths ) {
return App :: build ( $paths );
}
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
* @ access private
*/
function __loadBootstrap ( $boot ) {
$modelPaths = $behaviorPaths = $controllerPaths = $componentPaths = $viewPaths = $helperPaths = $pluginPaths = $vendorPaths = $localePaths = $shellPaths = null ;
if ( $boot ) {
Configure :: write ( 'App' , array ( 'base' => false , 'baseUrl' => false , 'dir' => APP_DIR , 'webroot' => WEBROOT_DIR ));
if ( ! include ( CONFIGS . 'core.php' )) {
trigger_error ( sprintf ( __ ( " Can't find application core file. Please create %score.php, and make sure it is readable by PHP. " , true ), CONFIGS ), E_USER_ERROR );
}
if ( ! include ( CONFIGS . 'bootstrap.php' )) {
trigger_error ( sprintf ( __ ( " Can't find application bootstrap file. Please create %sbootstrap.php, and make sure it is readable by PHP. " , true ), CONFIGS ), E_USER_ERROR );
}
if ( Configure :: read ( 'Cache.disable' ) !== true ) {
$cache = Cache :: config ( 'default' );
if ( empty ( $cache [ 'settings' ])) {
trigger_error ( 'Cache not configured properly. Please check Cache::config(); in APP/config/core.php' , E_USER_WARNING );
$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' ];
}
if ( Configure :: read () >= 1 ) {
$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' );
}
2009-07-25 17:27:17 +00:00
if ( App :: path ( 'controllers' ) == array ()) {
App :: build ( array (
'models' => $modelPaths , 'views' => $viewPaths , 'controllers' => $controllerPaths ,
'helpers' => $helperPaths , 'components' => $componentPaths , 'behaviors' => $behaviorPaths ,
'plugins' => $pluginPaths , 'vendors' => $vendorPaths , 'locales' => $localePaths ,
'shells' => $shellPaths
));
}
2009-06-07 22:24:10 +00:00
}
}
}
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Class and file loader .
*
* @ link http :// book . cakephp . org / view / 499 / The - App - Class
* @ since CakePHP ( tm ) v 1.2 . 0.6001
* @ package cake
* @ subpackage cake . cake . libs
*/
class App extends Object {
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
* @ access public
*/
2009-06-10 23:13:39 +00:00
var $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 ),
'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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $components = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* List of additional path ( s ) where view files reside .
*
* @ var array
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
2009-06-11 16:13:16 +00:00
* @ access public
2009-06-07 22:24:10 +00:00
*/
2009-06-11 16:13:16 +00:00
var $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
* @ access public
*/
var $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
* @ access public
*/
var $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
* @ access private
*/
var $__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
* @ access private
*/
var $__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
* @ access private
*/
var $__paths = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Holds loaded files .
*
* @ var array
* @ access private
*/
var $__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
* @ access private
*/
2009-06-07 22:24:10 +00:00
var $__objects = array ();
2009-07-24 19:18:37 +00:00
2009-06-07 22:24:10 +00:00
/**
* Used to read information stored path
*
* Usage
* App :: path ( 'models' ); will return all paths for models
*
* @ param string $type type of path
* @ return string array
* @ access public
*/
2009-06-11 16:13:16 +00:00
function path ( $type ) {
2009-06-07 22:24:10 +00:00
$_this =& App :: getInstance ();
2009-06-11 16:13:16 +00:00
if ( ! isset ( $_this -> { $type })) {
return array ();
2009-06-07 22:24:10 +00:00
}
2009-06-11 16:13:16 +00:00
return $_this -> { $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-09-27 14:56:32 +00:00
* @ access public
2008-05-30 11:40:08 +00:00
*/
2009-06-11 16:13:16 +00:00
function build ( $paths = array (), $reset = false ) {
2009-06-07 22:24:10 +00:00
$_this =& App :: getInstance ();
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 ),
'views' => array ( VIEWS ),
'helpers' => array ( HELPERS ),
'locales' => array ( APP . 'locale' . DS ),
'shells' => array ( APP . 'vendors' . DS . 'shells' , VENDORS . 'shells' ),
'vendors' => array ( APP . 'vendors' . DS , VENDORS ),
'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 ) {
$_this -> { $type } = ( array ) $new ;
}
return $paths ;
}
$core = $_this -> core ();
$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
}
2009-06-11 16:13:16 +00:00
$_this -> { $type } = $default ;
2008-05-30 11:40:08 +00:00
2009-06-11 16:13:16 +00:00
if ( ! empty ( $paths [ $type ])) {
2008-12-17 04:13:45 +00:00
$path = array_flip ( array_flip (( array_merge (
2009-06-11 16:13:16 +00:00
$_this -> { $type }, ( array ) $paths [ $type ], $merge
2008-12-17 04:13:45 +00:00
))));
2009-06-11 16:13:16 +00:00
$_this -> { $type } = array_values ( $path );
2008-05-30 11:40:08 +00:00
} else {
2009-06-11 16:13:16 +00:00
$path = array_flip ( array_flip (( array_merge ( $_this -> { $type }, $merge ))));
$_this -> { $type } = array_values ( $path );
2008-05-30 11:40:08 +00:00
}
}
}
2009-07-24 19:18:37 +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' ,
* 'view' , 'helper' , 'datasource' , 'libs' , and 'cake'
* @ return array numeric keyed array of core lib paths
* @ access public
2008-05-30 11:40:08 +00:00
*/
2009-06-07 22:24:10 +00:00
function core ( $type = null ) {
$paths = Cache :: read ( 'core_paths' , '_cake_core_' );
if ( ! $paths ) {
$paths = array ();
$openBasedir = ini_get ( 'open_basedir' );
if ( $openBasedir ) {
$all = explode ( PATH_SEPARATOR , $openBasedir );
$all = array_flip ( array_flip (( array_merge ( array ( CAKE_CORE_INCLUDE_PATH ), $all ))));
} else {
$all = explode ( PATH_SEPARATOR , ini_get ( 'include_path' ));
$all = array_flip ( array_flip (( array_merge ( array ( CAKE_CORE_INCLUDE_PATH ), $all ))));
2008-05-30 11:40:08 +00:00
}
2009-06-07 22:24:10 +00:00
foreach ( $all as $path ) {
if ( $path !== DS ) {
$path = rtrim ( $path , DS );
}
if ( empty ( $path ) || $path === '.' ) {
continue ;
}
$cake = $path . DS . 'cake' . DS ;
$libs = $cake . 'libs' . DS ;
if ( is_dir ( $libs )) {
$paths [ 'cake' ][] = $cake ;
2009-06-11 16:13:16 +00:00
$paths [ 'libs' ][] = $libs ;
$paths [ 'models' ][] = $libs . 'model' . DS ;
2009-07-25 22:57:49 +00:00
$paths [ 'datasources' ][] = $libs . 'model' . DS . 'datasources' . DS ;
2009-06-11 16:13:16 +00:00
$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 [ 'vendors' ][] = $path . DS . 'vendors' . DS ;
$paths [ 'shells' ][] = $cake . 'console' . DS . 'libs' . DS ;
2009-06-07 22:24:10 +00:00
break ;
}
2008-05-30 11:40:08 +00:00
}
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
/**
* Returns an index of objects of the given type , with the physical path to each object .
*
* @ param string $type Type of object , i . e . 'model' , 'controller' , 'helper' , or 'plugin'
* @ param mixed $path Optional
* @ return Configure instance
* @ access public
*/
function objects ( $type , $path = null , $cache = true ) {
$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 );
}
$_this =& App :: getInstance ();
2008-05-30 11:40:08 +00:00
2009-06-07 22:24:10 +00:00
if ( empty ( $_this -> __objects ) && $cache === true ) {
$_this -> __objects = Cache :: read ( 'object_map' , '_cake_core_' );
}
2008-05-30 11:40:08 +00:00
2009-07-25 22:57:49 +00:00
if ( ! isset ( $_this -> __objects [ $name ]) || $cache !== true ) {
2009-06-10 23:13:39 +00:00
$types = $_this -> 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 )) {
2009-06-11 16:13:16 +00:00
$path = $_this -> { " { $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 ) {
if ( $type === 'file' || $type === 'class' || strpos ( $dir , $type ) !== false ) {
$items = $_this -> __list ( $dir , $types [ $type ][ 'suffix' ], $extension );
$objects = array_merge ( $items , array_diff ( $objects , $items ));
2008-05-30 11:40:08 +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 ) {
2009-06-07 22:24:10 +00:00
$_this -> __cache = true ;
}
2009-07-26 01:27:02 +00:00
$_this -> __objects [ $name ] = $objects ;
2008-05-30 11:40:08 +00:00
}
2009-07-25 22:57:49 +00:00
2009-06-07 22:24:10 +00:00
return $_this -> __objects [ $name ];
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
* Finds classes based on $name or specific file ( s ) to search .
2008-05-30 11:40:08 +00:00
*
2008-10-30 17:30:26 +00:00
* @ link http :// book . cakephp . org / view / 529 / 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
* @ access public
*/
function import ( $type = null , $name = null , $parent = true , $search = array (), $file = null , $return = false ) {
2009-06-11 16:13:16 +00:00
$_this =& App :: getInstance ();
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
}
2009-06-11 16:13:16 +00:00
2008-05-30 11:40:08 +00:00
$_this -> return = $return ;
if ( isset ( $ext )) {
2009-06-11 16:13:16 +00:00
$file = Inflector :: underscore ( $name ) . " . { $ext } " ;
2008-05-30 11:40:08 +00:00
}
$ext = $_this -> __settings ( $type , $plugin , $parent );
if ( $name != null && ! class_exists ( $name . $ext [ 'class' ])) {
if ( $load = $_this -> __mapped ( $name . $ext [ 'class' ], $type , $plugin )) {
if ( $_this -> __load ( $load )) {
2009-07-30 22:01:22 +00:00
$_this -> __overload ( $type , $name . $ext [ 'class' ], $parent );
2008-05-30 11:40:08 +00:00
if ( $_this -> return ) {
$value = include $load ;
return $value ;
}
return true ;
} else {
$_this -> __remove ( $name . $ext [ 'class' ], $type , $plugin );
$_this -> __cache = true ;
}
}
if ( ! empty ( $search )) {
$_this -> search = $search ;
} elseif ( $plugin ) {
$_this -> search = $_this -> __paths ( 'plugin' );
} else {
$_this -> search = $_this -> __paths ( $type );
}
$find = $file ;
if ( $find === null ) {
$find = Inflector :: underscore ( $name . $ext [ 'suffix' ]) . '.php' ;
if ( $plugin ) {
$paths = $_this -> search ;
foreach ( $paths as $key => $value ) {
$_this -> search [ $key ] = $value . $ext [ 'path' ];
}
}
}
if ( strtolower ( $type ) !== 'vendor' && empty ( $search ) && $_this -> __load ( $file )) {
$directory = false ;
} else {
$file = $find ;
$directory = $_this -> __find ( $find , true );
}
if ( $directory !== null ) {
$_this -> __cache = true ;
$_this -> __map ( $directory . $file , $name . $ext [ 'class' ], $type , $plugin );
2009-07-30 22:01:22 +00:00
$_this -> __overload ( $type , $name . $ext [ 'class' ], $parent );
2008-05-30 11:40:08 +00:00
2008-09-09 05:26:09 +00:00
if ( $_this -> return ) {
2008-05-30 11:40:08 +00:00
$value = include $directory . $file ;
return $value ;
}
return true ;
}
return false ;
}
return true ;
}
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 single instance of App .
2008-05-30 11:40:08 +00:00
*
* @ return object
* @ access public
*/
function & getInstance () {
static $instance = array ();
if ( ! $instance ) {
$instance [ 0 ] =& new App ();
2009-06-14 17:28:30 +00:00
$instance [ 0 ] -> __map = ( array ) Cache :: read ( 'file_map' , '_cake_core_' );
2008-05-30 11:40:08 +00:00
}
return $instance [ 0 ];
}
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
* @ access private
*/
function __find ( $file , $recursive = true ) {
2008-10-12 02:33:12 +00:00
if ( empty ( $this -> search )) {
2008-05-30 11:40:08 +00:00
return null ;
2008-10-12 02:33:12 +00:00
} elseif ( is_string ( $this -> search )) {
$this -> search = array ( $this -> search );
2008-05-30 11:40:08 +00:00
}
2008-10-12 02:33:12 +00:00
if ( empty ( $this -> __paths )) {
$this -> __paths = Cache :: read ( 'dir_map' , '_cake_core_' );
2008-05-30 11:40:08 +00:00
}
2008-10-12 02:33:12 +00:00
foreach ( $this -> search as $path ) {
2008-05-30 11:40:08 +00:00
$path = rtrim ( $path , DS );
if ( $path === rtrim ( APP , DS )) {
$recursive = false ;
}
if ( $recursive === false ) {
2008-10-12 02:33:12 +00:00
if ( $this -> __load ( $path . DS . $file )) {
2008-05-30 11:40:08 +00:00
return $path . DS ;
}
continue ;
}
2009-07-25 22:57:49 +00:00
2008-10-12 02:33:12 +00:00
if ( ! isset ( $this -> __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 ();
2009-07-25 22:57:49 +00:00
$directories = $Folder -> tree ( $path , array ( '.svn' , 'tests' , 'templates' ), 'dir' );
2009-07-26 01:27:02 +00:00
sort ( $directories );
2008-10-12 02:33:12 +00:00
$this -> __paths [ $path ] = $directories ;
2008-05-30 11:40:08 +00:00
}
2008-10-12 02:33:12 +00:00
foreach ( $this -> __paths [ $path ] as $directory ) {
if ( $this -> __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
*/
function __load ( $file ) {
2008-08-27 16:43:15 +00:00
if ( empty ( $file )) {
return false ;
}
2008-10-12 02:33:12 +00:00
if ( ! $this -> return && isset ( $this -> __loaded [ $file ])) {
2008-05-30 11:40:08 +00:00
return true ;
}
if ( file_exists ( $file )) {
2008-10-12 02:33:12 +00:00
if ( ! $this -> return ) {
2008-05-30 11:40:08 +00:00
require ( $file );
2008-10-12 02:33:12 +00:00
$this -> __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
2008-05-30 11:40:08 +00:00
* @ access private
*/
function __map ( $file , $name , $type , $plugin ) {
if ( $plugin ) {
2008-10-12 02:33:12 +00:00
$this -> __map [ 'Plugin' ][ $plugin ][ $type ][ $name ] = $file ;
2008-05-30 11:40:08 +00:00
} else {
2008-10-12 02:33:12 +00:00
$this -> __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
*/
function __mapped ( $name , $type , $plugin ) {
if ( $plugin ) {
2008-10-12 02:33:12 +00:00
if ( isset ( $this -> __map [ 'Plugin' ][ $plugin ][ $type ]) && isset ( $this -> __map [ 'Plugin' ][ $plugin ][ $type ][ $name ])) {
return $this -> __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
}
2008-10-12 02:33:12 +00:00
if ( isset ( $this -> __map [ $type ]) && isset ( $this -> __map [ $type ][ $name ])) {
return $this -> __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
*/
2009-07-30 22:01:22 +00:00
function __overload ( $type , $name , $parent ) {
if (( $type === 'Model' || $type === 'Helper' ) && $parent !== false ) {
2008-05-30 11:40:08 +00:00
Overloadable :: overload ( $name );
}
}
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
*/
function __settings ( $type , $plugin , $parent ) {
if ( ! $parent ) {
return null ;
}
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 ;
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 ;
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
* @ access private
*/
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
}
2009-06-07 22:24:10 +00:00
if ( $paths = App :: path ( $type . 's' )) {
2008-09-09 05:26:09 +00:00
return $paths ;
}
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
* @ access private
2008-05-30 11:40:08 +00:00
*/
function __remove ( $name , $type , $plugin ) {
if ( $plugin ) {
2008-10-12 02:33:12 +00:00
unset ( $this -> __map [ 'Plugin' ][ $plugin ][ $type ][ $name ]);
2008-05-30 11:40:08 +00:00
} else {
2008-10-12 02:33:12 +00:00
unset ( $this -> __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 .
*
* @ param string $path Path to scan for files
* @ param string $suffix if false , return only directories . if string , match and return files
* @ return array List of directories or files in directory
*/
function __list ( $path , $suffix = false , $extension = false ) {
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
* @ access private
*/
function __destruct () {
2008-10-12 02:33:12 +00:00
if ( $this -> __cache ) {
2009-06-07 22:24:10 +00:00
$core = App :: core ( 'cake' );
2008-10-12 02:33:12 +00:00
unset ( $this -> __paths [ rtrim ( $core [ 0 ], DS )]);
Cache :: write ( 'dir_map' , array_filter ( $this -> __paths ), '_cake_core_' );
Cache :: write ( 'file_map' , array_filter ( $this -> __map ), '_cake_core_' );
2009-07-25 22:57:49 +00:00
Cache :: write ( 'object_map' , $this -> __objects , '_cake_core_' );
2008-05-30 11:40:08 +00:00
}
}
}
2008-08-27 03:42:17 +00:00
?>