diff options
-rw-r--r-- | system/libraries/Loader.php | 986 |
1 files changed, 985 insertions, 1 deletions
diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php index 6e4c594e4..2de2bd7f2 100644 --- a/system/libraries/Loader.php +++ b/system/libraries/Loader.php @@ -1 +1,985 @@ -<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 4.3.2 or newer
*
* @package CodeIgniter
* @author Rick Ellis
* @copyright Copyright (c) 2006, EllisLab, Inc.
* @license http://www.codeigniter.com/user_guide/license.html
* @link http://www.codeigniter.com
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
/**
* Loader Class
*
* Loads views and files
*
* @package CodeIgniter
* @subpackage Libraries
* @author Rick Ellis
* @category Loader
* @link http://www.codeigniter.com/user_guide/libraries/loader.html
*/
class CI_Loader {
// All these are set automatically. Don't mess with them.
var $_ci_ob_level;
var $_ci_view_path = '';
var $_ci_is_php5 = FALSE;
var $_ci_is_instance = FALSE; // Whether we should use $this or $CI =& get_instance()
var $_ci_cached_vars = array();
var $_ci_classes = array();
var $_ci_models = array();
var $_ci_helpers = array();
var $_ci_plugins = array();
var $_ci_scripts = array();
var $_ci_varmap = array('unit_test' => 'unit', 'user_agent' => 'agent');
/**
* Constructor
*
* Sets the path to the view files and gets the initial output buffering level
*
* @access public
*/
function CI_Loader()
{
$this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
$this->_ci_view_path = APPPATH.'views/';
$this->_ci_ob_level = ob_get_level();
log_message('debug', "Loader Class Initialized");
}
// --------------------------------------------------------------------
/**
* Class Loader
*
* This function lets users load and instantiate classes.
* It is designed to be called from a user's app controllers.
*
* @access public
* @param string the name of the class
* @param mixed the optional parameters
* @return void
*/
function library($library = '', $params = NULL)
{
if ($library == '')
{
return FALSE;
}
if (is_array($library))
{
foreach ($library as $class)
{
$this->_ci_load_class($class, $params);
}
}
else
{
$this->_ci_load_class($library, $params);
}
$this->_ci_assign_to_models();
}
// --------------------------------------------------------------------
/**
* Model Loader
*
* This function lets users load and instantiate models.
*
* @access public
* @param string the name of the class
* @param mixed any initialization parameters
* @return void
*/
function model($model, $name = '', $db_conn = FALSE)
{
if (is_array($model))
{
foreach($model as $babe)
{
$this->model($babe);
}
return;
}
if ($model == '')
{
return;
}
// Is the model in a sub-folder? If so, parse out the filename and path.
if (strpos($model, '/') === FALSE)
{
$path = '';
}
else
{
$x = explode('/', $model);
$model = end($x);
unset($x[count($x)-1]);
$path = implode('/', $x).'/';
}
if ($name == '')
{
$name = $model;
}
if (in_array($name, $this->_ci_models, TRUE))
{
return;
}
$CI =& get_instance();
if (isset($CI->$name))
{
show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
}
$model = strtolower($model);
if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
{
show_error('Unable to locate the model you have specified: '.$model);
}
if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
{
if ($db_conn === TRUE)
$db_conn = '';
$CI->load->database($db_conn, FALSE, TRUE);
}
if ( ! class_exists('Model'))
{
require_once(BASEPATH.'libraries/Model'.EXT);
}
require_once(APPPATH.'models/'.$path.$model.EXT);
$model = ucfirst($model);
$CI->$name = new $model();
$CI->$name->_assign_libraries();
$this->_ci_models[] = $name;
}
// --------------------------------------------------------------------
/**
* Database Loader
*
* @access public
* @param string the DB credentials
* @param bool whether to return the DB object
* @param bool whether to enable active record (this allows us to override the config setting)
* @return object
*/
function database($params = '', $return = FALSE, $active_record = FALSE)
{
// Do we even need to load the database class?
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE)
{
return FALSE;
}
require_once(BASEPATH.'database/DB'.EXT);
if ($return === TRUE)
{
return DB($params, $active_record);
}
// Grab the super object
$CI =& get_instance();
// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI->db = '';
// Load the DB class
$CI->db =& DB($params, $active_record);
// Assign the DB object to any existing models
$this->_ci_assign_to_models();
}
// --------------------------------------------------------------------
/**
* Load the Utilities Class
*
* @access public
* @return string
*/
function dbutil()
{
if ( ! class_exists('CI_DB'))
{
$this->database();
}
$CI =& get_instance();
require_once(BASEPATH.'database/DB_utility'.EXT);
require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
$class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
$CI->dbutil = new $class();
$CI->load->_ci_assign_to_models();
}
// --------------------------------------------------------------------
/**
* Load View
*
* This function is used to load a "view" file. It has three parameters:
*
* 1. The name of the "view" file to be included.
* 2. An associative array of data to be extracted for use in the view.
* 3. TRUE/FALSE - whether to return the data or load it. In
* some cases it's advantageous to be able to return data so that
* a developer can process it in some way.
*
* @access public
* @param string
* @param array
* @param bool
* @return void
*/
function view($view, $vars = array(), $return = FALSE)
{
return $this->_ci_load(array('view' => $view, 'vars' => $this->_ci_object_to_array($vars), 'return' => $return));
}
// --------------------------------------------------------------------
/**
* Load File
*
* This is a generic file loader
*
* @access public
* @param string
* @param bool
* @return string
*/
function file($path, $return = FALSE)
{
return $this->_ci_load(array('path' => $path, 'return' => $return));
}
// --------------------------------------------------------------------
/**
* Set Variables
*
* Once variables are set they become available within
* the controller class and its "view" files.
*
* @access public
* @param array
* @return void
*/
function vars($vars = array())
{
$vars = $this->_ci_object_to_array($vars);
if (is_array($vars) AND count($vars) > 0)
{
foreach ($vars as $key => $val)
{
$this->_ci_cached_vars[$key] = $val;
}
}
}
// --------------------------------------------------------------------
/**
* Load Helper
*
* This function loads the specified helper file.
*
* @access public
* @param mixed
* @return void
*/
function helper($helpers = array())
{
if ( ! is_array($helpers))
{
$helpers = array($helpers);
}
foreach ($helpers as $helper)
{
$helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
if (isset($this->_ci_helpers[$helper]))
{
continue;
}
if (file_exists(APPPATH.'helpers/'.$helper.EXT))
{
include_once(APPPATH.'helpers/'.$helper.EXT);
}
else
{
if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
{
include(BASEPATH.'helpers/'.$helper.EXT);
}
else
{
show_error('Unable to load the requested file: helpers/'.$helper.EXT);
}
}
$this->_ci_helpers[$helper] = TRUE;
}
log_message('debug', 'Helpers loaded: '.implode(', ', $helpers));
}
// --------------------------------------------------------------------
/**
* Load Helpers
*
* This is simply an alias to the above function in case the
* user has written the plural form of this function.
*
* @access public
* @param array
* @return void
*/
function helpers($helpers = array())
{
$this->helper($helpers);
}
// --------------------------------------------------------------------
/**
* Load Plugin
*
* This function loads the specified plugin.
*
* @access public
* @param array
* @return void
*/
function plugin($plugins = array())
{
if ( ! is_array($plugins))
{
$plugins = array($plugins);
}
foreach ($plugins as $plugin)
{
$plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi');
if (isset($this->_ci_plugins[$plugin]))
{
continue;
}
if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
{
include(APPPATH.'plugins/'.$plugin.EXT);
}
else
{
if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
{
include(BASEPATH.'plugins/'.$plugin.EXT);
}
else
{
show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
}
}
$this->_ci_plugins[$plugin] = TRUE;
}
log_message('debug', 'Plugins loaded: '.implode(', ', $plugins));
}
// --------------------------------------------------------------------
/**
* Load Plugins
*
* This is simply an alias to the above function in case the
* user has written the plural form of this function.
*
* @access public
* @param array
* @return void
*/
function plugins($plugins = array())
{
$this->plugin($plugins);
}
// --------------------------------------------------------------------
/**
* Load Script
*
* This function loads the specified include file from the
* application/scripts/ folder.
*
* NOTE: This feature has been deprecated but it will remain available
* for legacy users.
*
* @access public
* @param array
* @return void
*/
function script($scripts = array())
{
if ( ! is_array($scripts))
{
$scripts = array($scripts);
}
foreach ($scripts as $script)
{
$script = strtolower(str_replace(EXT, '', $script));
if (isset($this->_ci_scripts[$script]))
{
continue;
}
if ( ! file_exists(APPPATH.'scripts/'.$script.EXT))
{
show_error('Unable to load the requested script: scripts/'.$script.EXT);
}
include(APPPATH.'scripts/'.$script.EXT);
}
log_message('debug', 'Scripts loaded: '.implode(', ', $scripts));
}
// --------------------------------------------------------------------
/**
* Loads a language file
*
* @access public
* @param array
* @param string
* @return void
*/
function language($file = array(), $lang = '')
{
$CI =& get_instance();
if ( ! is_array($file))
{
$file = array($file);
}
foreach ($file as $langfile)
{
$CI->lang->load($langfile, $lang);
}
}
/**
* Loads language files for scaffolding
*
* @access public
* @param string
* @return arra
*/
function scaffold_language($file = '', $lang = '', $return = FALSE)
{
$CI =& get_instance();
return $CI->lang->load($file, $lang, $return);
}
// --------------------------------------------------------------------
/**
* Loads a config file
*
* @access public
* @param string
* @return void
*/
function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
{
$CI =& get_instance();
$CI->config->load($file, $use_sections, $fail_gracefully);
}
// --------------------------------------------------------------------
/**
* Scaffolding Loader
*
* This initializing function works a bit different than the
* others. It doesn't load the class. Instead, it simply
* sets a flag indicating that scaffolding is allowed to be
* used. The actual scaffolding function below is
* called by the front controller based on whether the
* second segment of the URL matches the "secret" scaffolding
* word stored in the application/config/routes.php
*
* @access public
* @param string
* @return void
*/
function scaffolding($table = '')
{
if ($table === FALSE)
{
show_error('You must include the name of the table you would like to access when you initialize scaffolding');
}
$CI =& get_instance();
$CI->_ci_scaffolding = TRUE;
$CI->_ci_scaff_table = $table;
}
// --------------------------------------------------------------------
/**
* Loader
*
* This function is used to load views and files.
*
* @access private
* @param array
* @return void
*/
function _ci_load($data)
{
// Set the default data variables
foreach (array('view', 'vars', 'path', 'return') as $val)
{
$$val = ( ! isset($data[$val])) ? FALSE : $data[$val];
}
// Set the path to the requested file
if ($path == '')
{
$ext = pathinfo($view, PATHINFO_EXTENSION);
$file = ($ext == '') ? $view.EXT : $view;
$path = $this->_ci_view_path.$file;
}
else
{
$x = explode('/', $path);
$file = end($x);
}
if ( ! file_exists($path))
{
show_error('Unable to load the requested file: '.$file);
}
// This allows anything loaded using $this->load (views, files, etc.)
// to become accessible from within the Controller and Model functions.
// Only needed when running PHP 5
if ($this->_ci_is_instance())
{
$CI =& get_instance();
foreach (get_object_vars($CI) as $key => $var)
{
if ( ! isset($this->$key))
{
$this->$key =& $CI->$key;
}
}
}
/*
* Extract and cache variables
*
* You can either set variables using the dedicated $this->load_vars()
* function or via the second parameter of this function. We'll merge
* the two types and cache them so that views that are embedded within
* other views can have access to these variables.
*/
if (is_array($vars))
{
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $vars);
}
extract($this->_ci_cached_vars);
/*
* Buffer the output
*
* We buffer the output for two reasons:
* 1. Speed. You get a significant speed boost.
* 2. So that the final rendered template can be
* post-processed by the output class. Why do we
* need post processing? For one thing, in order to
* show the elapsed page load time. Unless we
* can intercept the content right before it's sent to
* the browser and then stop the timer it won't be accurate.
*/
ob_start();
// If the PHP installation does not support short tags we'll
// do a little string replacement, changing the short tags
// to standard PHP echo statements.
if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
{
echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($path))).'<?php ');
}
else
{
include($path);
}
log_message('debug', 'File loaded: '.$path);
// Return the file data if requested
if ($return === TRUE)
{
$buffer = ob_get_contents();
@ob_end_clean();
return $buffer;
}
/*
* Flush the buffer... or buff the flusher?
*
* In order to permit views to be nested within
* other views, we need to flush the content back out whenever
* we are beyond the first level of output buffering so that
* it can be seen and included properly by the first included
* template and any subsequent ones. Oy!
*
*/
if (ob_get_level() > $this->_ci_ob_level + 1)
{
ob_end_flush();
}
else
{
// PHP 4 requires that we use a global
global $OUT;
$OUT->set_output(ob_get_contents());
@ob_end_clean();
}
}
// --------------------------------------------------------------------
/**
* Load class
*
* This function loads the requested class.
*
* @access private
* @param string the item that is being loaded
* @param mixed any additional parameters
* @return void
*/
function _ci_load_class($class, $params = NULL)
{
// Get the class name
$class = str_replace(EXT, '', $class);
// We'll test for both lowercase and capitalized versions of the file name
foreach (array(ucfirst($class), strtolower($class)) as $class)
{
$subclass = APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT;
// Is this a class extension request?
if (file_exists($subclass))
{
$baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
if ( ! file_exists($baseclass))
{
log_message('error', "Unable to load the requested class: ".$class);
show_error("Unable to load the requested class: ".$class);
}
// Safety: Was the class already loaded by a previous call?
if (in_array($subclass, $this->_ci_classes))
{
$is_duplicate = TRUE;
log_message('debug', $class." class already loaded. Second attempt ignored.");
return;
}
include($baseclass);
include($subclass);
$this->_ci_classes[] = $subclass;
return $this->_ci_init_class($class, config_item('subclass_prefix'), $params);
}
// Lets search for the requested library file and load it.
$is_duplicate = FALSE;
for ($i = 1; $i < 3; $i++)
{
$path = ($i % 2) ? APPPATH : BASEPATH;
$filepath = $path.'libraries/'.$class.EXT;
// Does the file exist? No? Bummer...
if ( ! file_exists($filepath))
{
continue;
}
// Safety: Was the class already loaded by a previous call?
if (in_array($filepath, $this->_ci_classes))
{
$is_duplicate = TRUE;
log_message('debug', $class." class already loaded. Second attempt ignored.");
return;
}
include($filepath);
$this->_ci_classes[] = $filepath;
return $this->_ci_init_class($class, '', $params);
}
} // END FOREACH
// If we got this far we were unable to find the requested class.
// We do not issue errors if the load call failed due to a duplicate request
if ($is_duplicate == FALSE)
{
log_message('error', "Unable to load the requested class: ".$class);
show_error("Unable to load the requested class: ".$class);
}
}
// --------------------------------------------------------------------
/**
* Instantiates a class
*
* @access private
* @param string
* @param string
* @return null
*/
function _ci_init_class($class, $prefix = '', $config = FALSE)
{
// Is there an associated config file for this class?
if ($config === NULL)
{
$config = NULL;
if (file_exists(APPPATH.'config/'.$class.EXT))
{
include(APPPATH.'config/'.$class.EXT);
}
}
if ($prefix == '')
{
$name = (class_exists('CI_'.$class)) ? 'CI_'.$class : $class;
}
else
{
$name = $prefix.$class;
}
// Set the variable name we will assign the class to
$class = strtolower($class);
$classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
// Instantiate the class
$CI =& get_instance();
if ($config !== NULL)
{
$CI->$classvar = new $name($config);
}
else
{
$CI->$classvar = new $name;
}
}
// --------------------------------------------------------------------
/**
* Autoloader
*
* The config/autoload.php file contains an array that permits sub-systems,
* libraries, plugins, and helpers to be loaded automatically.
*
* @access private
* @param array
* @return void
*/
function _ci_autoloader()
{
include(APPPATH.'config/autoload'.EXT);
if ( ! isset($autoload))
{
return FALSE;
}
// Load any custom config file
if (count($autoload['config']) > 0)
{
$CI =& get_instance();
foreach ($autoload['config'] as $key => $val)
{
$CI->config->load($val);
}
}
// Autoload plugins, helpers, scripts and languages
foreach (array('helper', 'plugin', 'script', 'language') as $type)
{
if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
{
$this->$type($autoload[$type]);
}
}
// Autoload models
if (isset($autoload['model']))
{
$this->model($autoload['model']);
}
// A little tweak to remain backward compatible
// The $autoload['core'] item was deprecated
if ( ! isset($autoload['libraries']))
{
$autoload['libraries'] = $autoload['core'];
}
// Load libraries
if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
{
// Load the database driver.
if (in_array('database', $autoload['libraries']))
{
$this->database();
$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
}
// Load scaffolding
if (in_array('scaffolding', $autoload['libraries']))
{
$this->scaffolding();
$autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
}
// Load all other libraries
foreach ($autoload['libraries'] as $item)
{
$this->library($item);
}
// Load the model class.
if (in_array('model', $autoload['libraries']))
{
$this->model();
$autoload['libraries'] = array_diff($autoload['libraries'], array('model'));
}
}
}
// --------------------------------------------------------------------
/**
* Assign to Models
*
* Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
* will be available to models, if any exist.
*
* @access private
* @param object
* @return array
*/
function _ci_assign_to_models()
{
if (count($this->_ci_models) == 0)
{
return;
}
if ($this->_ci_is_instance())
{
$CI =& get_instance();
foreach ($this->_ci_models as $model)
{
$CI->$model->_assign_libraries();
}
}
else
{
foreach ($this->_ci_models as $model)
{
$this->$model->_assign_libraries();
}
}
}
// --------------------------------------------------------------------
/**
* Object to Array
*
* Takes an object as input and converts the class variables to array key/vals
*
* @access private
* @param object
* @return array
*/
function _ci_object_to_array($object)
{
return (is_object($object)) ? get_object_vars($object) : $object;
}
// --------------------------------------------------------------------
/**
* Determines whether we should use the CI instance or $this
*
* @access private
* @return bool
*/
function _ci_is_instance()
{
if ($this->_ci_is_php5 == TRUE)
{
return TRUE;
}
global $CI;
return (is_object($CI)) ? TRUE : FALSE;
}
}
?>
\ No newline at end of file +<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author Rick Ellis
+ * @copyright Copyright (c) 2006, EllisLab, Inc.
+ * @license http://www.codeigniter.com/user_guide/license.html
+ * @link http://www.codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Loader Class
+ *
+ * Loads views and files
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @author Rick Ellis
+ * @category Loader
+ * @link http://www.codeigniter.com/user_guide/libraries/loader.html
+ */
+class CI_Loader {
+
+ // All these are set automatically. Don't mess with them.
+ var $_ci_ob_level;
+ var $_ci_view_path = '';
+ var $_ci_is_php5 = FALSE;
+ var $_ci_is_instance = FALSE; // Whether we should use $this or $CI =& get_instance()
+ var $_ci_cached_vars = array();
+ var $_ci_classes = array();
+ var $_ci_models = array();
+ var $_ci_helpers = array();
+ var $_ci_plugins = array();
+ var $_ci_scripts = array();
+ var $_ci_varmap = array('unit_test' => 'unit', 'user_agent' => 'agent');
+
+
+ /**
+ * Constructor
+ *
+ * Sets the path to the view files and gets the initial output buffering level
+ *
+ * @access public
+ */
+ function CI_Loader()
+ {
+ $this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
+ $this->_ci_view_path = APPPATH.'views/';
+ $this->_ci_ob_level = ob_get_level();
+
+ log_message('debug', "Loader Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Class Loader
+ *
+ * This function lets users load and instantiate classes.
+ * It is designed to be called from a user's app controllers.
+ *
+ * @access public
+ * @param string the name of the class
+ * @param mixed the optional parameters
+ * @return void
+ */
+ function library($library = '', $params = NULL)
+ {
+ if ($library == '')
+ {
+ return FALSE;
+ }
+
+ if (is_array($library))
+ {
+ foreach ($library as $class)
+ {
+ $this->_ci_load_class($class, $params);
+ }
+ }
+ else
+ {
+ $this->_ci_load_class($library, $params);
+ }
+
+ $this->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Model Loader
+ *
+ * This function lets users load and instantiate models.
+ *
+ * @access public
+ * @param string the name of the class
+ * @param mixed any initialization parameters
+ * @return void
+ */
+ function model($model, $name = '', $db_conn = FALSE)
+ {
+ if (is_array($model))
+ {
+ foreach($model as $babe)
+ {
+ $this->model($babe);
+ }
+ return;
+ }
+
+ if ($model == '')
+ {
+ return;
+ }
+
+ // Is the model in a sub-folder? If so, parse out the filename and path.
+ if (strpos($model, '/') === FALSE)
+ {
+ $path = '';
+ }
+ else
+ {
+ $x = explode('/', $model);
+ $model = end($x);
+ unset($x[count($x)-1]);
+ $path = implode('/', $x).'/';
+ }
+
+ if ($name == '')
+ {
+ $name = $model;
+ }
+
+ if (in_array($name, $this->_ci_models, TRUE))
+ {
+ return;
+ }
+
+ $CI =& get_instance();
+ if (isset($CI->$name))
+ {
+ show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
+ }
+
+ $model = strtolower($model);
+
+ if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
+ {
+ show_error('Unable to locate the model you have specified: '.$model);
+ }
+
+ if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
+ {
+ if ($db_conn === TRUE)
+ $db_conn = '';
+
+ $CI->load->database($db_conn, FALSE, TRUE);
+ }
+
+ if ( ! class_exists('Model'))
+ {
+ require_once(BASEPATH.'libraries/Model'.EXT);
+ }
+
+ require_once(APPPATH.'models/'.$path.$model.EXT);
+
+ $model = ucfirst($model);
+
+ $CI->$name = new $model();
+ $CI->$name->_assign_libraries();
+
+ $this->_ci_models[] = $name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Database Loader
+ *
+ * @access public
+ * @param string the DB credentials
+ * @param bool whether to return the DB object
+ * @param bool whether to enable active record (this allows us to override the config setting)
+ * @return object
+ */
+ function database($params = '', $return = FALSE, $active_record = FALSE)
+ {
+ // Do we even need to load the database class?
+ if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE)
+ {
+ return FALSE;
+ }
+
+ require_once(BASEPATH.'database/DB'.EXT);
+
+ if ($return === TRUE)
+ {
+ return DB($params, $active_record);
+ }
+
+ // Grab the super object
+ $CI =& get_instance();
+
+ // Initialize the db variable. Needed to prevent
+ // reference errors with some configurations
+ $CI->db = '';
+
+ // Load the DB class
+ $CI->db =& DB($params, $active_record);
+
+ // Assign the DB object to any existing models
+ $this->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load the Utilities Class
+ *
+ * @access public
+ * @return string
+ */
+ function dbutil()
+ {
+ if ( ! class_exists('CI_DB'))
+ {
+ $this->database();
+ }
+
+ $CI =& get_instance();
+
+ require_once(BASEPATH.'database/DB_utility'.EXT);
+ require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
+ $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
+
+ $CI->dbutil = new $class();
+ $CI->load->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load View
+ *
+ * This function is used to load a "view" file. It has three parameters:
+ *
+ * 1. The name of the "view" file to be included.
+ * 2. An associative array of data to be extracted for use in the view.
+ * 3. TRUE/FALSE - whether to return the data or load it. In
+ * some cases it's advantageous to be able to return data so that
+ * a developer can process it in some way.
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @param bool
+ * @return void
+ */
+ function view($view, $vars = array(), $return = FALSE)
+ {
+ return $this->_ci_load(array('view' => $view, 'vars' => $this->_ci_object_to_array($vars), 'return' => $return));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load File
+ *
+ * This is a generic file loader
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function file($path, $return = FALSE)
+ {
+ return $this->_ci_load(array('path' => $path, 'return' => $return));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Variables
+ *
+ * Once variables are set they become available within
+ * the controller class and its "view" files.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function vars($vars = array())
+ {
+ $vars = $this->_ci_object_to_array($vars);
+
+ if (is_array($vars) AND count($vars) > 0)
+ {
+ foreach ($vars as $key => $val)
+ {
+ $this->_ci_cached_vars[$key] = $val;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Helper
+ *
+ * This function loads the specified helper file.
+ *
+ * @access public
+ * @param mixed
+ * @return void
+ */
+ function helper($helpers = array())
+ {
+ if ( ! is_array($helpers))
+ {
+ $helpers = array($helpers);
+ }
+
+ foreach ($helpers as $helper)
+ {
+ $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
+
+ if (isset($this->_ci_helpers[$helper]))
+ {
+ continue;
+ }
+
+ if (file_exists(APPPATH.'helpers/'.$helper.EXT))
+ {
+ include_once(APPPATH.'helpers/'.$helper.EXT);
+ }
+ else
+ {
+ if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
+ {
+ include(BASEPATH.'helpers/'.$helper.EXT);
+ }
+ else
+ {
+ show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+ }
+ }
+
+ $this->_ci_helpers[$helper] = TRUE;
+
+ }
+
+ log_message('debug', 'Helpers loaded: '.implode(', ', $helpers));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Helpers
+ *
+ * This is simply an alias to the above function in case the
+ * user has written the plural form of this function.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function helpers($helpers = array())
+ {
+ $this->helper($helpers);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Plugin
+ *
+ * This function loads the specified plugin.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function plugin($plugins = array())
+ {
+ if ( ! is_array($plugins))
+ {
+ $plugins = array($plugins);
+ }
+
+ foreach ($plugins as $plugin)
+ {
+ $plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi');
+
+ if (isset($this->_ci_plugins[$plugin]))
+ {
+ continue;
+ }
+
+ if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
+ {
+ include(APPPATH.'plugins/'.$plugin.EXT);
+ }
+ else
+ {
+ if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
+ {
+ include(BASEPATH.'plugins/'.$plugin.EXT);
+ }
+ else
+ {
+ show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
+ }
+ }
+
+ $this->_ci_plugins[$plugin] = TRUE;
+ }
+
+ log_message('debug', 'Plugins loaded: '.implode(', ', $plugins));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Plugins
+ *
+ * This is simply an alias to the above function in case the
+ * user has written the plural form of this function.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function plugins($plugins = array())
+ {
+ $this->plugin($plugins);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Script
+ *
+ * This function loads the specified include file from the
+ * application/scripts/ folder.
+ *
+ * NOTE: This feature has been deprecated but it will remain available
+ * for legacy users.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function script($scripts = array())
+ {
+ if ( ! is_array($scripts))
+ {
+ $scripts = array($scripts);
+ }
+
+ foreach ($scripts as $script)
+ {
+ $script = strtolower(str_replace(EXT, '', $script));
+
+ if (isset($this->_ci_scripts[$script]))
+ {
+ continue;
+ }
+
+ if ( ! file_exists(APPPATH.'scripts/'.$script.EXT))
+ {
+ show_error('Unable to load the requested script: scripts/'.$script.EXT);
+ }
+
+ include(APPPATH.'scripts/'.$script.EXT);
+ }
+
+ log_message('debug', 'Scripts loaded: '.implode(', ', $scripts));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loads a language file
+ *
+ * @access public
+ * @param array
+ * @param string
+ * @return void
+ */
+ function language($file = array(), $lang = '')
+ {
+ $CI =& get_instance();
+
+ if ( ! is_array($file))
+ {
+ $file = array($file);
+ }
+
+ foreach ($file as $langfile)
+ {
+ $CI->lang->load($langfile, $lang);
+ }
+ }
+
+ /**
+ * Loads language files for scaffolding
+ *
+ * @access public
+ * @param string
+ * @return arra
+ */
+ function scaffold_language($file = '', $lang = '', $return = FALSE)
+ {
+ $CI =& get_instance();
+ return $CI->lang->load($file, $lang, $return);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loads a config file
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+ {
+ $CI =& get_instance();
+ $CI->config->load($file, $use_sections, $fail_gracefully);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Scaffolding Loader
+ *
+ * This initializing function works a bit different than the
+ * others. It doesn't load the class. Instead, it simply
+ * sets a flag indicating that scaffolding is allowed to be
+ * used. The actual scaffolding function below is
+ * called by the front controller based on whether the
+ * second segment of the URL matches the "secret" scaffolding
+ * word stored in the application/config/routes.php
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function scaffolding($table = '')
+ {
+ if ($table === FALSE)
+ {
+ show_error('You must include the name of the table you would like to access when you initialize scaffolding');
+ }
+
+ $CI =& get_instance();
+ $CI->_ci_scaffolding = TRUE;
+ $CI->_ci_scaff_table = $table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loader
+ *
+ * This function is used to load views and files.
+ *
+ * @access private
+ * @param array
+ * @return void
+ */
+ function _ci_load($data)
+ {
+ // Set the default data variables
+ foreach (array('view', 'vars', 'path', 'return') as $val)
+ {
+ $$val = ( ! isset($data[$val])) ? FALSE : $data[$val];
+ }
+
+ // Set the path to the requested file
+ if ($path == '')
+ {
+ $ext = pathinfo($view, PATHINFO_EXTENSION);
+ $file = ($ext == '') ? $view.EXT : $view;
+ $path = $this->_ci_view_path.$file;
+ }
+ else
+ {
+ $x = explode('/', $path);
+ $file = end($x);
+ }
+
+ if ( ! file_exists($path))
+ {
+ show_error('Unable to load the requested file: '.$file);
+ }
+
+ // This allows anything loaded using $this->load (views, files, etc.)
+ // to become accessible from within the Controller and Model functions.
+ // Only needed when running PHP 5
+
+ if ($this->_ci_is_instance())
+ {
+ $CI =& get_instance();
+ foreach (get_object_vars($CI) as $key => $var)
+ {
+ if ( ! isset($this->$key))
+ {
+ $this->$key =& $CI->$key;
+ }
+ }
+ }
+
+ /*
+ * Extract and cache variables
+ *
+ * You can either set variables using the dedicated $this->load_vars()
+ * function or via the second parameter of this function. We'll merge
+ * the two types and cache them so that views that are embedded within
+ * other views can have access to these variables.
+ */
+ if (is_array($vars))
+ {
+ $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $vars);
+ }
+ extract($this->_ci_cached_vars);
+
+ /*
+ * Buffer the output
+ *
+ * We buffer the output for two reasons:
+ * 1. Speed. You get a significant speed boost.
+ * 2. So that the final rendered template can be
+ * post-processed by the output class. Why do we
+ * need post processing? For one thing, in order to
+ * show the elapsed page load time. Unless we
+ * can intercept the content right before it's sent to
+ * the browser and then stop the timer it won't be accurate.
+ */
+ ob_start();
+
+ // If the PHP installation does not support short tags we'll
+ // do a little string replacement, changing the short tags
+ // to standard PHP echo statements.
+
+ if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
+ {
+ echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($path))).'<?php ');
+ }
+ else
+ {
+ include($path);
+ }
+
+ log_message('debug', 'File loaded: '.$path);
+
+ // Return the file data if requested
+ if ($return === TRUE)
+ {
+ $buffer = ob_get_contents();
+ @ob_end_clean();
+ return $buffer;
+ }
+
+ /*
+ * Flush the buffer... or buff the flusher?
+ *
+ * In order to permit views to be nested within
+ * other views, we need to flush the content back out whenever
+ * we are beyond the first level of output buffering so that
+ * it can be seen and included properly by the first included
+ * template and any subsequent ones. Oy!
+ *
+ */
+ if (ob_get_level() > $this->_ci_ob_level + 1)
+ {
+ ob_end_flush();
+ }
+ else
+ {
+ // PHP 4 requires that we use a global
+ global $OUT;
+ $OUT->set_output(ob_get_contents());
+ @ob_end_clean();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load class
+ *
+ * This function loads the requested class.
+ *
+ * @access private
+ * @param string the item that is being loaded
+ * @param mixed any additional parameters
+ * @return void
+ */
+ function _ci_load_class($class, $params = NULL)
+ {
+ // Get the class name
+ $class = str_replace(EXT, '', $class);
+
+ // We'll test for both lowercase and capitalized versions of the file name
+ foreach (array(ucfirst($class), strtolower($class)) as $class)
+ {
+ $subclass = APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT;
+
+ // Is this a class extension request?
+ if (file_exists($subclass))
+ {
+ $baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
+
+ if ( ! file_exists($baseclass))
+ {
+ log_message('error', "Unable to load the requested class: ".$class);
+ show_error("Unable to load the requested class: ".$class);
+ }
+
+ // Safety: Was the class already loaded by a previous call?
+ if (in_array($subclass, $this->_ci_classes))
+ {
+ $is_duplicate = TRUE;
+ log_message('debug', $class." class already loaded. Second attempt ignored.");
+ return;
+ }
+
+ include($baseclass);
+ include($subclass);
+ $this->_ci_classes[] = $subclass;
+
+ return $this->_ci_init_class($class, config_item('subclass_prefix'), $params);
+ }
+
+ // Lets search for the requested library file and load it.
+ $is_duplicate = FALSE;
+ for ($i = 1; $i < 3; $i++)
+ {
+ $path = ($i % 2) ? APPPATH : BASEPATH;
+ $filepath = $path.'libraries/'.$class.EXT;
+
+ // Does the file exist? No? Bummer...
+ if ( ! file_exists($filepath))
+ {
+ continue;
+ }
+
+ // Safety: Was the class already loaded by a previous call?
+ if (in_array($filepath, $this->_ci_classes))
+ {
+ $is_duplicate = TRUE;
+ log_message('debug', $class." class already loaded. Second attempt ignored.");
+ return;
+ }
+
+ include($filepath);
+ $this->_ci_classes[] = $filepath;
+ return $this->_ci_init_class($class, '', $params);
+ }
+ } // END FOREACH
+
+ // If we got this far we were unable to find the requested class.
+ // We do not issue errors if the load call failed due to a duplicate request
+ if ($is_duplicate == FALSE)
+ {
+ log_message('error', "Unable to load the requested class: ".$class);
+ show_error("Unable to load the requested class: ".$class);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Instantiates a class
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return null
+ */
+ function _ci_init_class($class, $prefix = '', $config = FALSE)
+ {
+ // Is there an associated config file for this class?
+ if ($config === NULL)
+ {
+ if (file_exists(APPPATH.'config/'.$class.EXT))
+ {
+ include(APPPATH.'config/'.$class.EXT);
+ }
+ }
+
+ if ($prefix == '')
+ {
+ $name = (class_exists('CI_'.$class)) ? 'CI_'.$class : $class;
+ }
+ else
+ {
+ $name = $prefix.$class;
+ }
+
+ // Set the variable name we will assign the class to
+ $class = strtolower($class);
+ $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
+
+ // Instantiate the class
+ $CI =& get_instance();
+ if ($config !== NULL)
+ {
+ $CI->$classvar = new $name($config);
+ }
+ else
+ {
+ $CI->$classvar = new $name;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Autoloader
+ *
+ * The config/autoload.php file contains an array that permits sub-systems,
+ * libraries, plugins, and helpers to be loaded automatically.
+ *
+ * @access private
+ * @param array
+ * @return void
+ */
+ function _ci_autoloader()
+ {
+ include(APPPATH.'config/autoload'.EXT);
+
+ if ( ! isset($autoload))
+ {
+ return FALSE;
+ }
+
+ // Load any custom config file
+ if (count($autoload['config']) > 0)
+ {
+ $CI =& get_instance();
+ foreach ($autoload['config'] as $key => $val)
+ {
+ $CI->config->load($val);
+ }
+ }
+
+ // Autoload plugins, helpers, scripts and languages
+ foreach (array('helper', 'plugin', 'script', 'language') as $type)
+ {
+ if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
+ {
+ $this->$type($autoload[$type]);
+ }
+ }
+
+ // Autoload models
+ if (isset($autoload['model']))
+ {
+ $this->model($autoload['model']);
+ }
+
+ // A little tweak to remain backward compatible
+ // The $autoload['core'] item was deprecated
+ if ( ! isset($autoload['libraries']))
+ {
+ $autoload['libraries'] = $autoload['core'];
+ }
+
+ // Load libraries
+ if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
+ {
+ // Load the database driver.
+ if (in_array('database', $autoload['libraries']))
+ {
+ $this->database();
+ $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
+ }
+
+ // Load scaffolding
+ if (in_array('scaffolding', $autoload['libraries']))
+ {
+ $this->scaffolding();
+ $autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
+ }
+
+ // Load all other libraries
+ foreach ($autoload['libraries'] as $item)
+ {
+ $this->library($item);
+ }
+
+ // Load the model class.
+ if (in_array('model', $autoload['libraries']))
+ {
+ $this->model();
+ $autoload['libraries'] = array_diff($autoload['libraries'], array('model'));
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Assign to Models
+ *
+ * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
+ * will be available to models, if any exist.
+ *
+ * @access private
+ * @param object
+ * @return array
+ */
+ function _ci_assign_to_models()
+ {
+ if (count($this->_ci_models) == 0)
+ {
+ return;
+ }
+
+ if ($this->_ci_is_instance())
+ {
+ $CI =& get_instance();
+ foreach ($this->_ci_models as $model)
+ {
+ $CI->$model->_assign_libraries();
+ }
+ }
+ else
+ {
+ foreach ($this->_ci_models as $model)
+ {
+ $this->$model->_assign_libraries();
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Object to Array
+ *
+ * Takes an object as input and converts the class variables to array key/vals
+ *
+ * @access private
+ * @param object
+ * @return array
+ */
+ function _ci_object_to_array($object)
+ {
+ return (is_object($object)) ? get_object_vars($object) : $object;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determines whether we should use the CI instance or $this
+ *
+ * @access private
+ * @return bool
+ */
+ function _ci_is_instance()
+ {
+ if ($this->_ci_is_php5 == TRUE)
+ {
+ return TRUE;
+ }
+
+ global $CI;
+ return (is_object($CI)) ? TRUE : FALSE;
+ }
+
+}
+?>
\ No newline at end of file |