summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorGreg Aker <greg.aker@ellislab.com>2011-04-20 00:13:03 +0200
committerGreg Aker <greg.aker@ellislab.com>2011-04-20 00:13:03 +0200
commitf5c840241084e03d49e521bfcb62d2adbe9fce7d (patch)
tree5293805c077662e53439244d12e01f67cd80eaf3 /system
parent4488538665d37b07a08d7fe4ce6f4156a9899211 (diff)
Altering the loader to be able to load views from packages when adding the package path with add_package_path().
Diffstat (limited to 'system')
-rw-r--r--system/core/Controller.php2
-rw-r--r--system/core/Loader.php110
2 files changed, 59 insertions, 53 deletions
diff --git a/system/core/Controller.php b/system/core/Controller.php
index 469663f09..fd9c8b580 100644
--- a/system/core/Controller.php
+++ b/system/core/Controller.php
@@ -50,7 +50,7 @@ class CI_Controller {
$this->load->_base_classes =& is_loaded();
- $this->load->_ci_autoloader();
+ $this->load->ci_autoloader();
log_message('debug', "Controller Class Initialized");
diff --git a/system/core/Loader.php b/system/core/Loader.php
index 59415b72a..8146cd563 100644
--- a/system/core/Loader.php
+++ b/system/core/Loader.php
@@ -30,8 +30,8 @@ class CI_Loader {
// All these are set automatically. Don't mess with them.
var $_ci_ob_level;
- var $_ci_view_path = '';
- var $_ci_library_paths = array();
+ var $_ci_view_paths = array();
+ protected $_ci_library_paths = array();
var $_ci_model_paths = array();
var $_ci_helper_paths = array();
var $_base_classes = array(); // Set by the controller class
@@ -47,17 +47,15 @@ class CI_Loader {
* Constructor
*
* Sets the path to the view files and gets the initial output buffering level
- *
- * @access public
*/
- function __construct()
+ public function __construct()
{
- $this->_ci_view_path = APPPATH.'views/';
$this->_ci_ob_level = ob_get_level();
$this->_ci_library_paths = array(APPPATH, BASEPATH);
$this->_ci_helper_paths = array(APPPATH, BASEPATH);
$this->_ci_model_paths = array(APPPATH);
-
+ $this->_ci_view_paths = array(APPPATH.'views/' => TRUE);
+
log_message('debug', "Loader Class Initialized");
}
@@ -107,13 +105,12 @@ class CI_Loader {
*
* This function lets users load and instantiate models.
*
- * @access public
* @param string the name of the class
* @param string name for the model
* @param bool database connection
* @return void
*/
- function model($model, $name = '', $db_conn = FALSE)
+ public function model($model, $name = '', $db_conn = FALSE)
{
if (is_array($model))
{
@@ -200,13 +197,12 @@ class CI_Loader {
/**
* 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 = NULL)
+ public function database($params = '', $return = FALSE, $active_record = NULL)
{
// Grab the super object
$CI =& get_instance();
@@ -237,10 +233,9 @@ class CI_Loader {
/**
* Load the Utilities Class
*
- * @access public
* @return string
*/
- function dbutil()
+ public function dbutil()
{
if ( ! class_exists('CI_DB'))
{
@@ -265,10 +260,9 @@ class CI_Loader {
/**
* Load the Database Forge Class
*
- * @access public
* @return string
*/
- function dbforge()
+ public function dbforge()
{
if ( ! class_exists('CI_DB'))
{
@@ -297,13 +291,12 @@ class CI_Loader {
* 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)
+ public function view($view, $vars = array(), $return = FALSE)
{
return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
}
@@ -315,12 +308,11 @@ class CI_Loader {
*
* This is a generic file loader
*
- * @access public
* @param string
* @param bool
* @return string
*/
- function file($path, $return = FALSE)
+ public function file($path, $return = FALSE)
{
return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
}
@@ -333,11 +325,10 @@ class CI_Loader {
* 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(), $val = '')
+ public function vars($vars = array(), $val = '')
{
if ($val != '' AND is_string($vars))
{
@@ -362,11 +353,10 @@ class CI_Loader {
*
* This function loads the specified helper file.
*
- * @access public
* @param mixed
* @return void
*/
- function helper($helpers = array())
+ public function helper($helpers = array())
{
foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)
{
@@ -424,11 +414,10 @@ class CI_Loader {
* 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())
+ public function helpers($helpers = array())
{
$this->helper($helpers);
}
@@ -438,12 +427,11 @@ class CI_Loader {
/**
* Loads a language file
*
- * @access public
* @param array
* @param string
* @return void
*/
- function language($file = array(), $lang = '')
+ public function language($file = array(), $lang = '')
{
$CI =& get_instance();
@@ -463,11 +451,10 @@ class CI_Loader {
/**
* Loads a config file
*
- * @access public
* @param string
* @return void
*/
- function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+ public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
{
$CI =& get_instance();
$CI->config->load($file, $use_sections, $fail_gracefully);
@@ -485,7 +472,7 @@ class CI_Loader {
* @param string an optional object name
* @return void
*/
- function driver($library = '', $params = NULL, $object_name = NULL)
+ public function driver($library = '', $params = NULL, $object_name = NULL)
{
if ( ! class_exists('CI_Driver_Library'))
{
@@ -510,18 +497,20 @@ class CI_Loader {
*
* Prepends a parent path to the library, model, helper, and config path arrays
*
- * @access public
* @param string
+ * @param boolean
* @return void
*/
- function add_package_path($path)
+ public function add_package_path($path, $view_cascade=TRUE)
{
$path = rtrim($path, '/').'/';
-
+
array_unshift($this->_ci_library_paths, $path);
array_unshift($this->_ci_model_paths, $path);
array_unshift($this->_ci_helper_paths, $path);
+ $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
+
// Add config file path
$config =& $this->_ci_get_component('config');
array_unshift($config->_config_paths, $path);
@@ -534,11 +523,10 @@ class CI_Loader {
*
* Return a list of all package paths, by default it will ignore BASEPATH.
*
- * @access public
* @param string
* @return void
*/
- function get_package_paths($include_base = FALSE)
+ public function get_package_paths($include_base = FALSE)
{
return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths;
}
@@ -551,11 +539,10 @@ class CI_Loader {
* Remove a path from the library, model, and helper path arrays if it exists
* If no path is provided, the most recently added path is removed.
*
- * @access public
* @param type
* @return type
*/
- function remove_package_path($path = '', $remove_config_path = TRUE)
+ public function remove_package_path($path = '', $remove_config_path = TRUE)
{
$config =& $this->_ci_get_component('config');
@@ -564,12 +551,12 @@ class CI_Loader {
$void = array_shift($this->_ci_library_paths);
$void = array_shift($this->_ci_model_paths);
$void = array_shift($this->_ci_helper_paths);
+ $void = array_shift($this->_ci_view_paths);
$void = array_shift($config->_config_paths);
}
else
{
$path = rtrim($path, '/').'/';
-
foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
{
if (($key = array_search($path, $this->{$var})) !== FALSE)
@@ -577,6 +564,11 @@ class CI_Loader {
unset($this->{$var}[$key]);
}
}
+
+ if (isset($this->_ci_view_paths[$path.'views/']))
+ {
+ unset($this->_ci_view_paths[$path.'views/']);
+ }
if (($key = array_search($path, $config->_config_paths)) !== FALSE)
{
@@ -588,6 +580,7 @@ class CI_Loader {
$this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
$this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
$this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
+ $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
$config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
}
@@ -600,24 +593,39 @@ class CI_Loader {
* Variables are prefixed with _ci_ to avoid symbol collision with
* variables made available to view files
*
- * @access private
* @param array
* @return void
*/
- function _ci_load($_ci_data)
+ protected function _ci_load($_ci_data)
{
// Set the default data variables
foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
{
$$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
}
+
+ $file_exists = FALSE;
// Set the path to the requested file
if ($_ci_path == '')
{
$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
$_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;
- $_ci_path = $this->_ci_view_path.$_ci_file;
+
+ foreach ($this->_ci_view_paths as $view_file => $cascade)
+ {
+ if (file_exists($view_file.$_ci_file))
+ {
+ $_ci_path = $view_file.$_ci_file;
+ $file_exists = TRUE;
+ break;
+ }
+
+ if ( ! $cascade)
+ {
+ break;
+ }
+ }
}
else
{
@@ -625,7 +633,7 @@ class CI_Loader {
$_ci_file = end($_ci_x);
}
- if ( ! file_exists($_ci_path))
+ if ( ! $file_exists && ! file_exists($_ci_path))
{
show_error('Unable to load the requested file: '.$_ci_file);
}
@@ -721,13 +729,12 @@ class CI_Loader {
*
* This function loads the requested class.
*
- * @access private
* @param string the item that is being loaded
* @param mixed any additional parameters
* @param string an optional object name
* @return void
*/
- function _ci_load_class($class, $params = NULL, $object_name = NULL)
+ protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
{
// Get the class name, and while we're at it trim any slashes.
// The directory path can be included as part of the class name,
@@ -959,11 +966,13 @@ class CI_Loader {
* The config/autoload.php file contains an array that permits sub-systems,
* libraries, and helpers to be loaded automatically.
*
- * @access private
+ * This function is public, as it's used in the CI_Controller class.
+ * However, there is no reason you should ever needs to use it.
+ *
* @param array
* @return void
*/
- function _ci_autoloader()
+ public function ci_autoloader()
{
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
{
@@ -1046,11 +1055,10 @@ class CI_Loader {
*
* 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)
+ protected function _ci_object_to_array($object)
{
return (is_object($object)) ? get_object_vars($object) : $object;
}
@@ -1060,10 +1068,9 @@ class CI_Loader {
/**
* Get a reference to a specific library or model
*
- * @access private
* @return bool
*/
- function &_ci_get_component($component)
+ protected function &_ci_get_component($component)
{
$CI =& get_instance();
return $CI->$component;
@@ -1076,11 +1083,10 @@ class CI_Loader {
*
* This function preps the name of various items to make loading them more reliable.
*
- * @access private
* @param mixed
* @return array
*/
- function _ci_prep_filename($filename, $extension)
+ protected function _ci_prep_filename($filename, $extension)
{
if ( ! is_array($filename))
{