diff options
Diffstat (limited to 'system/libraries/Loader.php')
-rw-r--r-- | system/libraries/Loader.php | 611 |
1 files changed, 611 insertions, 0 deletions
diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php new file mode 100644 index 000000000..e2467fa64 --- /dev/null +++ b/system/libraries/Loader.php @@ -0,0 +1,611 @@ +<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); +/** + * Code Igniter + * + * An open source application development framework for PHP 4.3.2 or newer + * + * @package CodeIgniter + * @author Rick Ellis + * @copyright Copyright (c) 2006, pMachine, Inc. + * @license http://www.codeignitor.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 { + + var $ob_level; + var $cached_vars = array(); + var $helpers = array(); + var $plugins = array(); + var $scripts = array(); + var $languages = array(); + var $view_path = ''; + + /** + * Constructor + * + * Sets the path to the view files and gets the initial output + * buffering level + * + * @access public + */ + function CI_Loader() + { + $this->view_path = APPPATH.'views/'; + $this->ob_level = ob_get_level(); + + log_message('debug', "Loader Class Initialized"); + } + // END CI_Loader() + + // -------------------------------------------------------------------- + + /** + * 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 any initialization parameters + * @return void + */ + function library($class, $param = FALSE) + { + if ($class == '') + return; + + $obj =& get_instance(); + $obj->_ci_initialize($class, $param); + $obj->_ci_assign_to_models(); + } + // END library() + + // -------------------------------------------------------------------- + + /** + * 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 ($model == '') + return; + + $obj =& get_instance(); + $obj->_ci_load_model($model, $name, $db_conn); + } + // END library() + + // -------------------------------------------------------------------- + + /** + * 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 mixed + */ + function database($db = '', $return = FALSE, $active_record = FALSE) + { + $obj =& get_instance(); + + if ($return === TRUE) + { + return $obj->_ci_init_database($db, TRUE, $active_record); + } + else + { + $obj->_ci_init_database($db, FALSE, $active_record); + $obj->_ci_assign_to_models(); + } + } + // END database() + + // -------------------------------------------------------------------- + + /** + * Scaffolding Loader + * + * @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 access when you initialize scaffolding'); + } + + $obj =& get_instance(); + $obj->_ci_init_scaffolding($table); + } + // END scaffolding() + + // -------------------------------------------------------------------- + + /** + * 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 retun 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)); + } + // END view() + + // -------------------------------------------------------------------- + + /** + * 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)); + } + // END file() + + // -------------------------------------------------------------------- + + /** + * Set Variables + * + * Once variables are set they become availabe 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->cached_vars[$key] = $val; + } + } + } + // END vars() + + // -------------------------------------------------------------------- + + /** + * 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) + { + if (isset($this->helpers[$helper])) + { + continue; + } + + $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper'); + + if ( ! file_exists(BASEPATH.'helpers/'.$helper.EXT)) + { + show_error('Unable to load the requested file: helpers/'.$helper.EXT); + } + + include_once(BASEPATH.'helpers/'.$helper.EXT); + + $this->helpers[$helper] = TRUE; + } + + log_message('debug', 'Helpers loaded: '.implode(', ', $helpers)); + } + // END helper() + + // -------------------------------------------------------------------- + + /** + * 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); + } + // END 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) + { + if (isset($this->plugins[$plugin])) + { + continue; + } + + $plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi'); + + if ( ! file_exists(BASEPATH.'plugins/'.$plugin.EXT)) + { + show_error('Unable to load the requested file: plugins/'.$plugin.EXT); + } + + include_once(BASEPATH.'plugins/'.$plugin.EXT); + + $this->plugins[$plugin] = TRUE; + } + + log_message('debug', 'Plugins loaded: '.implode(', ', $plugins)); + } + // END plugin() + + // -------------------------------------------------------------------- + + /** + * Load Script + * + * This function loads the specified include file from the + * application/scripts/ folder + * + * @access public + * @param array + * @return void + */ + function script($scripts = array()) + { + if ( ! is_array($scripts)) + { + $scripts = array($scripts); + } + + foreach ($scripts as $script) + { + if (isset($this->scripts[$script])) + { + continue; + } + + $script = strtolower(str_replace(EXT, '', $script)); + + if ( ! file_exists(APPPATH.'scripts/'.$script.EXT)) + { + show_error('Unable to load the requested script: scripts/'.$script.EXT); + } + + include_once(APPPATH.'scripts/'.$script.EXT); + + $this->scripts[$script] = TRUE; + } + + log_message('debug', 'Scripts loaded: '.implode(', ', $scripts)); + } + // END script() + + // -------------------------------------------------------------------- + + /** + * 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); + } + // END plugins() + + // -------------------------------------------------------------------- + + /** + * Loads a language file + * + * @access public + * @param string + * @return void + */ + function language($file = '', $lang = '', $return = FALSE) + { + $obj =& get_instance(); + return $obj->lang->load($file, $lang, $return); + } + // END language() + + // -------------------------------------------------------------------- + + /** + * Loads a config file + * + * @access public + * @param string + * @return void + */ + function config($file = '') + { + $obj =& get_instance(); + $obj->config->load($file); + } + // END config() + + // -------------------------------------------------------------------- + + /** + * Set the Path to the "views" folder + * + * @access private + * @param string + * @return void + */ + function _ci_set_view_path($path) + { + $this->view_path = $path; + } + // END _ci_set_view_path() + + // -------------------------------------------------------------------- + + /** + * Loader + * + * This function isn't called directly. It's called from + * the two functions above. It's used to load views and files + * + * @access private + * @param array + * @return void + */ + function _ci_load($data) + { + $OUT =& _load_class('CI_Output'); + + // This allows anything loaded using $this->load (viwes, files, etc.) + // to become accessible from within the Controller and Model functions. + $obj =& get_instance(); + foreach ($obj->ci_is_loaded as $val) + { + if ( ! isset($this->$val)) + { + $this->$val =& $obj->$val; + } + } + + // Set the default data variables + foreach (array('view', 'vars', 'path', 'return') as $val) + { + $$val = ( ! isset($data[$val])) ? FALSE : $data[$val]; + } + + /* + * Extract and cached 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->cached_vars = array_merge($this->cached_vars, $vars); + } + extract($this->cached_vars); + + // Set the path to the requested file + if ($path == '') + { + $ext = pathinfo($view, PATHINFO_EXTENSION); + $file = ($ext == '') ? $view.EXT : $view; + $path = $this->view_path.$file; + } + else + { + $x = explode('/', $path); + $file = end($x); + } + + /* + * 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 acurate. + * + */ + + if ( ! file_exists($path)) + { + show_error('Unable to load the requested file: '.$file); + } + + ob_start(); + + include($path); + log_message('debug', 'File loaded: '.$path); + + // Return the file data if requested to + if ($return === TRUE) + { + $buffer = ob_get_contents(); + ob_end_clean(); + + return $buffer; + } + + /* + * Flush the buffer... or buff the flusher? + * + * In order to permit templates (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->ob_level + 1) + { + ob_end_flush(); + } + else + { + $OUT->set_output(ob_get_contents()); + ob_end_clean(); + } + } + // END _load() + + // -------------------------------------------------------------------- + + /** + * Autoloader + * + * The config/autoload.php file contains an array that permits sub-systems, + * plugins, and helpers to be loaded automatically. + * + * @access private + * @param array + * @return void + */ + function _ci_autoloader($autoload) + { + if ($autoload === FALSE) + { + return; + } + + foreach (array('helper', 'plugin', 'script') as $type) + { + if (isset($autoload[$type])) + { + if ( ! is_array($autoload[$type])) + { + $autoload[$type] = array($autoload[$type]); + } + + foreach ($autoload[$type] as $item) + { + $this->$type($item); + } + } + } + } + // END _ci_autoloader() + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and convers the class variables to array key/vals + * + * @access public + * @param object + * @return array + */ + function _ci_object_to_array($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + foreach (get_object_vars($object) as $key => $val) + { + $array[$key] = $val; + } + + return $array; + } + +} +// END Loader Class +?>
\ No newline at end of file |