blob: a218e79fb4e9d859ba87791dc13540d3bb2722ce [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreevd7297352012-01-07 22:53:14 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreevd7297352012-01-07 22:53:14 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
Derek Allard2067d1a2008-11-13 22:59:24 +000018 *
19 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Andrey Andreev80500af2013-01-01 08:16:53 +020021 * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000028
Derek Allard2067d1a2008-11-13 22:59:24 +000029/**
30 * Loader Class
31 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030032 * Loads framework components.
Derek Allard2067d1a2008-11-13 22:59:24 +000033 *
34 * @package CodeIgniter
35 * @subpackage Libraries
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @category Loader
Andrey Andreev92ebfb62012-05-17 12:49:24 +030037 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000038 * @link http://codeigniter.com/user_guide/libraries/loader.html
39 */
40class CI_Loader {
41
42 // All these are set automatically. Don't mess with them.
David Behlercda768a2011-08-14 23:52:48 +020043 /**
44 * Nesting level of the output buffering mechanism
45 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030046 * @var int
David Behlercda768a2011-08-14 23:52:48 +020047 */
Greg Aker0c9ee4a2011-04-20 09:40:17 -050048 protected $_ci_ob_level;
Andrey Andreev92ebfb62012-05-17 12:49:24 +030049
David Behlercda768a2011-08-14 23:52:48 +020050 /**
51 * List of paths to load views from
52 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030053 * @var array
David Behlercda768a2011-08-14 23:52:48 +020054 */
Ted Wood4c223642013-01-05 16:50:31 -080055 protected $_ci_view_paths = array(VIEWPATH => TRUE);
Andrey Andreev92ebfb62012-05-17 12:49:24 +030056
David Behlercda768a2011-08-14 23:52:48 +020057 /**
58 * List of paths to load libraries from
59 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030060 * @var array
David Behlercda768a2011-08-14 23:52:48 +020061 */
Ted Wood4c223642013-01-05 16:50:31 -080062 protected $_ci_library_paths = array(APPPATH, BASEPATH);
Andrey Andreev92ebfb62012-05-17 12:49:24 +030063
David Behlercda768a2011-08-14 23:52:48 +020064 /**
65 * List of paths to load models from
66 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030067 * @var array
David Behlercda768a2011-08-14 23:52:48 +020068 */
Ted Wood4c223642013-01-05 16:50:31 -080069 protected $_ci_model_paths = array(APPPATH);
Andrey Andreev92ebfb62012-05-17 12:49:24 +030070
David Behlercda768a2011-08-14 23:52:48 +020071 /**
72 * List of paths to load helpers from
73 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030074 * @var array
David Behlercda768a2011-08-14 23:52:48 +020075 */
Ted Wood4c223642013-01-05 16:50:31 -080076 protected $_ci_helper_paths = array(APPPATH, BASEPATH);
Andrey Andreev92ebfb62012-05-17 12:49:24 +030077
David Behlercda768a2011-08-14 23:52:48 +020078 /**
David Behlercda768a2011-08-14 23:52:48 +020079 * List of cached variables
80 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030081 * @var array
David Behlercda768a2011-08-14 23:52:48 +020082 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040083 protected $_ci_cached_vars = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030084
David Behlercda768a2011-08-14 23:52:48 +020085 /**
86 * List of loaded classes
87 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030088 * @var array
David Behlercda768a2011-08-14 23:52:48 +020089 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040090 protected $_ci_classes = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030091
David Behlercda768a2011-08-14 23:52:48 +020092 /**
David Behlercda768a2011-08-14 23:52:48 +020093 * List of loaded models
94 *
Andrey Andreeved4b2582012-10-27 17:46:52 +030095 * @var array
David Behlercda768a2011-08-14 23:52:48 +020096 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040097 protected $_ci_models = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030098
David Behlercda768a2011-08-14 23:52:48 +020099 /**
100 * List of loaded helpers
101 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300102 * @var array
David Behlercda768a2011-08-14 23:52:48 +0200103 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -0400104 protected $_ci_helpers = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300105
David Behlercda768a2011-08-14 23:52:48 +0200106 /**
107 * List of class name mappings
108 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300109 * @var array
David Behlercda768a2011-08-14 23:52:48 +0200110 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -0400111 protected $_ci_varmap = array(
Timothy Warren40403d22012-04-19 16:38:50 -0400112 'unit_test' => 'unit',
113 'user_agent' => 'agent'
114 );
Derek Allard2067d1a2008-11-13 22:59:24 +0000115
Andrey Andreev519f87a2013-07-23 17:16:10 +0300116 // --------------------------------------------------------------------
117
Derek Allard2067d1a2008-11-13 22:59:24 +0000118 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300119 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +0000120 *
Andrey Andreevcdac2482012-11-03 18:09:01 +0200121 * Sets component load paths, gets the initial output buffering level.
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300122 *
123 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000124 */
Greg Akerf5c84022011-04-19 17:13:03 -0500125 public function __construct()
Barry Mienydd671972010-10-04 16:33:58 +0200126 {
Andrey Andreev519f87a2013-07-23 17:16:10 +0300127 $this->_ci_ob_level = ob_get_level();
128 $this->_ci_classes =& is_loaded();
David Behlercda768a2011-08-14 23:52:48 +0200129
Andrey Andreevd7297352012-01-07 22:53:14 +0200130 log_message('debug', 'Loader Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000131 }
Barry Mienydd671972010-10-04 16:33:58 +0200132
Derek Allard2067d1a2008-11-13 22:59:24 +0000133 // --------------------------------------------------------------------
David Behlercda768a2011-08-14 23:52:48 +0200134
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500135 /**
Andrey Andreevcdac2482012-11-03 18:09:01 +0200136 * Initializer
137 *
138 * @todo Figure out a way to move this to the constructor
139 * without breaking *package_path*() methods.
140 * @uses CI_Loader::_ci_autoloader()
141 * @used-by CI_Controller::__construct()
142 * @return void
143 */
144 public function initialize()
145 {
Andrey Andreevcdac2482012-11-03 18:09:01 +0200146 $this->_ci_autoloader();
147 }
148
149 // --------------------------------------------------------------------
150
151 /**
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500152 * Is Loaded
153 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300154 * A utility method to test if a class is in the self::$_ci_classes array.
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500155 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300156 * @used-by Mainly used by Form Helper function _get_validation_object().
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500157 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300158 * @param string $class Class name to check for
159 * @return string|bool Class object name if loaded or FALSE
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500160 */
161 public function is_loaded($class)
162 {
Andrey Andreev519f87a2013-07-23 17:16:10 +0300163 return array_search(ucfirst($class), $this->_ci_classes, TRUE);
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500164 }
165
166 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200167
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300169 * Library Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000170 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300171 * Loads and instantiates libraries.
172 * Designed to be called from application controllers.
Derek Allard2067d1a2008-11-13 22:59:24 +0000173 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300174 * @param string $library Library name
175 * @param array $params Optional parameters to pass to the library class constructor
176 * @param string $object_name An optional object name to assign to
Derek Allard2067d1a2008-11-13 22:59:24 +0000177 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200178 */
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500179 public function library($library = '', $params = NULL, $object_name = NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000180 {
Andrey Andreev519f87a2013-07-23 17:16:10 +0300181 if (empty($library))
182 {
183 return;
184 }
185 elseif (is_array($library))
Greg Akerce433962010-10-12 09:29:35 -0500186 {
Phil Sturgeon08b51692011-04-03 18:05:42 +0100187 foreach ($library as $class)
Greg Akerce433962010-10-12 09:29:35 -0500188 {
Kellas Reeves3c6e4852011-02-09 11:57:56 -0600189 $this->library($class, $params);
Greg Akerce433962010-10-12 09:29:35 -0500190 }
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000191
Greg Akerce433962010-10-12 09:29:35 -0500192 return;
193 }
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000194
vlakoff1228fe22013-01-14 01:30:09 +0100195 if ($params !== NULL && ! is_array($params))
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 {
197 $params = NULL;
198 }
199
Kellas Reeves3c6e4852011-02-09 11:57:56 -0600200 $this->_ci_load_class($library, $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 }
202
203 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200204
Derek Allard2067d1a2008-11-13 22:59:24 +0000205 /**
206 * Model Loader
207 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300208 * Loads and instantiates libraries.
Derek Allard2067d1a2008-11-13 22:59:24 +0000209 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300210 * @param string $model Model name
211 * @param string $name An optional object name to assign to
212 * @param bool $db_conn An optional database connection configuration to initialize
Derek Allard2067d1a2008-11-13 22:59:24 +0000213 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200214 */
Greg Akerf5c84022011-04-19 17:13:03 -0500215 public function model($model, $name = '', $db_conn = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200216 {
Andrey Andreeved4b2582012-10-27 17:46:52 +0300217 if (empty($model))
218 {
219 return;
220 }
221 elseif (is_array($model))
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 {
Andrey Andreev5a519db2013-01-12 04:19:19 +0200223 foreach ($model as $key => $value)
Derek Allard2067d1a2008-11-13 22:59:24 +0000224 {
Ahmad Anbar4005e3c2013-09-12 23:33:28 +0300225 is_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn);
Derek Allard2067d1a2008-11-13 22:59:24 +0000226 }
227 return;
228 }
229
Derek Jones32bf1862010-03-02 13:46:07 -0600230 $path = '';
Barry Mienydd671972010-10-04 16:33:58 +0200231
Derek Allard2067d1a2008-11-13 22:59:24 +0000232 // Is the model in a sub-folder? If so, parse out the filename and path.
Derek Jones32bf1862010-03-02 13:46:07 -0600233 if (($last_slash = strrpos($model, '/')) !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000234 {
Derek Jones32bf1862010-03-02 13:46:07 -0600235 // The path is in front of the last slash
Andrey Andreevd47baab2012-01-09 16:56:46 +0200236 $path = substr($model, 0, ++$last_slash);
Derek Jones32bf1862010-03-02 13:46:07 -0600237
238 // And the model name behind it
Andrey Andreevd47baab2012-01-09 16:56:46 +0200239 $model = substr($model, $last_slash);
Derek Allard2067d1a2008-11-13 22:59:24 +0000240 }
Barry Mienydd671972010-10-04 16:33:58 +0200241
Phil Sturgeon10d78f62012-06-04 14:41:53 -0500242 if (empty($name))
Derek Allard2067d1a2008-11-13 22:59:24 +0000243 {
244 $name = $model;
245 }
Barry Mienydd671972010-10-04 16:33:58 +0200246
Derek Allard2067d1a2008-11-13 22:59:24 +0000247 if (in_array($name, $this->_ci_models, TRUE))
248 {
249 return;
250 }
Barry Mienydd671972010-10-04 16:33:58 +0200251
Derek Allard2067d1a2008-11-13 22:59:24 +0000252 $CI =& get_instance();
253 if (isset($CI->$name))
254 {
255 show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
256 }
Barry Mienydd671972010-10-04 16:33:58 +0200257
Andrey Andreev20292312013-07-22 14:29:10 +0300258 if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE))
259 {
260 if ($db_conn === TRUE)
261 {
262 $db_conn = '';
263 }
264
265 $CI->load->database($db_conn, FALSE, TRUE);
266 }
267
268 if ( ! class_exists('CI_Model', FALSE))
269 {
270 load_class('Model', 'core');
271 }
272
273 $model = ucfirst(strtolower($model));
Derek Allard2067d1a2008-11-13 22:59:24 +0000274
Derek Jones32bf1862010-03-02 13:46:07 -0600275 foreach ($this->_ci_model_paths as $mod_path)
276 {
Greg Aker3a746652011-04-19 10:59:47 -0500277 if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
Derek Jones32bf1862010-03-02 13:46:07 -0600278 {
279 continue;
280 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000281
Greg Aker3a746652011-04-19 10:59:47 -0500282 require_once($mod_path.'models/'.$path.$model.'.php');
Derek Jones32bf1862010-03-02 13:46:07 -0600283
Derek Jones32bf1862010-03-02 13:46:07 -0600284 $CI->$name = new $model();
Derek Jones32bf1862010-03-02 13:46:07 -0600285 $this->_ci_models[] = $name;
286 return;
287 }
Barry Mienydd671972010-10-04 16:33:58 +0200288
Derek Jones32bf1862010-03-02 13:46:07 -0600289 // couldn't find the model
290 show_error('Unable to locate the model you have specified: '.$model);
Derek Allard2067d1a2008-11-13 22:59:24 +0000291 }
Barry Mienydd671972010-10-04 16:33:58 +0200292
Derek Allard2067d1a2008-11-13 22:59:24 +0000293 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200294
Derek Allard2067d1a2008-11-13 22:59:24 +0000295 /**
296 * Database Loader
297 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300298 * @param mixed $params Database configuration options
299 * @param bool $return Whether to return the database object
300 * @param bool $query_builder Whether to enable Query Builder
301 * (overrides the configuration setting)
302 *
303 * @return void|object|bool Database object if $return is set to TRUE,
304 * FALSE on failure, void in any other case
Barry Mienydd671972010-10-04 16:33:58 +0200305 */
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000306 public function database($params = '', $return = FALSE, $query_builder = NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000307 {
308 // Grab the super object
309 $CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200310
Derek Allard2067d1a2008-11-13 22:59:24 +0000311 // Do we even need to load the database class?
Andrey Andreev9d0ab042012-10-24 21:47:39 +0300312 if ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id))
Derek Allard2067d1a2008-11-13 22:59:24 +0000313 {
314 return FALSE;
Barry Mienydd671972010-10-04 16:33:58 +0200315 }
316
Greg Aker3a746652011-04-19 10:59:47 -0500317 require_once(BASEPATH.'database/DB.php');
Derek Allard2067d1a2008-11-13 22:59:24 +0000318
319 if ($return === TRUE)
320 {
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000321 return DB($params, $query_builder);
Derek Allard2067d1a2008-11-13 22:59:24 +0000322 }
Barry Mienydd671972010-10-04 16:33:58 +0200323
Andrey Andreevd7297352012-01-07 22:53:14 +0200324 // Initialize the db variable. Needed to prevent
Derek Allard2067d1a2008-11-13 22:59:24 +0000325 // reference errors with some configurations
326 $CI->db = '';
Barry Mienydd671972010-10-04 16:33:58 +0200327
Derek Allard2067d1a2008-11-13 22:59:24 +0000328 // Load the DB class
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000329 $CI->db =& DB($params, $query_builder);
Derek Allard2067d1a2008-11-13 22:59:24 +0000330 }
Barry Mienydd671972010-10-04 16:33:58 +0200331
Derek Allard2067d1a2008-11-13 22:59:24 +0000332 // --------------------------------------------------------------------
333
334 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300335 * Load the Database Utilities Class
Derek Allard2067d1a2008-11-13 22:59:24 +0000336 *
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200337 * @param object $db Database object
338 * @param bool $return Whether to return the DB Forge class object or not
339 * @return void|object
Barry Mienydd671972010-10-04 16:33:58 +0200340 */
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200341 public function dbutil($db = NULL, $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000342 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000343 $CI =& get_instance();
344
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200345 if ( ! is_object($db) OR ! ($db instanceof CI_DB))
346 {
347 class_exists('CI_DB', FALSE) OR $this->database();
348 $db =& $CI->db;
349 }
Barry Mienydd671972010-10-04 16:33:58 +0200350
Greg Aker3a746652011-04-19 10:59:47 -0500351 require_once(BASEPATH.'database/DB_utility.php');
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200352 require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php');
353 $class = 'CI_DB_'.$db->dbdriver.'_utility';
Derek Allard2067d1a2008-11-13 22:59:24 +0000354
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200355 if ($return === TRUE)
356 {
357 return new $class($db);
358 }
359
360 $CI->dbutil = new $class($db);
Derek Allard2067d1a2008-11-13 22:59:24 +0000361 }
Barry Mienydd671972010-10-04 16:33:58 +0200362
Derek Allard2067d1a2008-11-13 22:59:24 +0000363 // --------------------------------------------------------------------
364
365 /**
366 * Load the Database Forge Class
367 *
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200368 * @param object $db Database object
369 * @param bool $return Whether to return the DB Forge class object or not
370 * @return void|object
Barry Mienydd671972010-10-04 16:33:58 +0200371 */
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200372 public function dbforge($db = NULL, $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000373 {
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200374 $CI =& get_instance();
375 if ( ! is_object($db) OR ! ($db instanceof CI_DB))
Derek Allard2067d1a2008-11-13 22:59:24 +0000376 {
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200377 class_exists('CI_DB', FALSE) OR $this->database();
378 $db =& $CI->db;
Derek Allard2067d1a2008-11-13 22:59:24 +0000379 }
Barry Mienydd671972010-10-04 16:33:58 +0200380
Greg Aker3a746652011-04-19 10:59:47 -0500381 require_once(BASEPATH.'database/DB_forge.php');
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200382 require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php');
Andrey Andreeva287a342012-11-05 23:19:59 +0200383
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200384 if ( ! empty($db->subdriver))
Andrey Andreeva287a342012-11-05 23:19:59 +0200385 {
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200386 $driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php';
Andrey Andreeva287a342012-11-05 23:19:59 +0200387 if (file_exists($driver_path))
388 {
389 require_once($driver_path);
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200390 $class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge';
Andrey Andreeva287a342012-11-05 23:19:59 +0200391 }
392 }
393 else
394 {
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200395 $class = 'CI_DB_'.$db->dbdriver.'_forge';
Andrey Andreeva287a342012-11-05 23:19:59 +0200396 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000397
Andrey Andreeveaa60c72012-11-06 01:11:22 +0200398 if ($return === TRUE)
399 {
400 return new $class($db);
401 }
402
403 $CI->dbforge = new $class($db);
Derek Allard2067d1a2008-11-13 22:59:24 +0000404 }
Barry Mienydd671972010-10-04 16:33:58 +0200405
Derek Allard2067d1a2008-11-13 22:59:24 +0000406 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200407
Derek Allard2067d1a2008-11-13 22:59:24 +0000408 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300409 * View Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000410 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300411 * Loads "view" files.
Derek Allard2067d1a2008-11-13 22:59:24 +0000412 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300413 * @param string $view View name
414 * @param array $vars An associative array of data
415 * to be extracted for use in the view
416 * @param bool $return Whether to return the view output
417 * or leave it to the Output class
Derek Allard2067d1a2008-11-13 22:59:24 +0000418 * @return void
419 */
Greg Akerf5c84022011-04-19 17:13:03 -0500420 public function view($view, $vars = array(), $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000421 {
422 return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
423 }
Barry Mienydd671972010-10-04 16:33:58 +0200424
Derek Allard2067d1a2008-11-13 22:59:24 +0000425 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200426
Derek Allard2067d1a2008-11-13 22:59:24 +0000427 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300428 * Generic File Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000429 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300430 * @param string $path File path
431 * @param bool $return Whether to return the file output
432 * @return void|string
Derek Allard2067d1a2008-11-13 22:59:24 +0000433 */
Greg Akerf5c84022011-04-19 17:13:03 -0500434 public function file($path, $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000435 {
436 return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
437 }
Barry Mienydd671972010-10-04 16:33:58 +0200438
Derek Allard2067d1a2008-11-13 22:59:24 +0000439 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200440
Derek Allard2067d1a2008-11-13 22:59:24 +0000441 /**
442 * Set Variables
443 *
444 * Once variables are set they become available within
445 * the controller class and its "view" files.
446 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300447 * @param array|object|string $vars
448 * An associative array or object containing values
449 * to be set, or a value's name if string
450 * @param string $val Value to set, only used if $vars is a string
Derek Allard2067d1a2008-11-13 22:59:24 +0000451 * @return void
452 */
Greg Akerf5c84022011-04-19 17:13:03 -0500453 public function vars($vars = array(), $val = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000454 {
vlakoffa5e0ea82013-02-27 18:17:35 +0100455 if (is_string($vars))
Derek Allard2067d1a2008-11-13 22:59:24 +0000456 {
457 $vars = array($vars => $val);
458 }
Barry Mienydd671972010-10-04 16:33:58 +0200459
Derek Allard2067d1a2008-11-13 22:59:24 +0000460 $vars = $this->_ci_object_to_array($vars);
Barry Mienydd671972010-10-04 16:33:58 +0200461
Andrey Andreev94af3552012-03-26 23:10:42 +0300462 if (is_array($vars) && count($vars) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000463 {
464 foreach ($vars as $key => $val)
465 {
466 $this->_ci_cached_vars[$key] = $val;
467 }
468 }
469 }
Barry Mienydd671972010-10-04 16:33:58 +0200470
Derek Allard2067d1a2008-11-13 22:59:24 +0000471 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200472
Derek Allard2067d1a2008-11-13 22:59:24 +0000473 /**
Phil Sturgeon8731f642011-07-22 16:11:34 -0600474 * Get Variable
475 *
476 * Check if a variable is set and retrieve it.
477 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300478 * @param string $key Variable name
479 * @return mixed The variable or NULL if not found
Phil Sturgeon8731f642011-07-22 16:11:34 -0600480 */
481 public function get_var($key)
482 {
483 return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;
484 }
485
486 // --------------------------------------------------------------------
487
488 /**
Shane Pearson81dd2232011-11-18 20:49:35 -0600489 * Get Variables
490 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300491 * Retrieves all loaded variables.
Shane Pearson81dd2232011-11-18 20:49:35 -0600492 *
493 * @return array
494 */
495 public function get_vars()
496 {
497 return $this->_ci_cached_vars;
498 }
499
500 // --------------------------------------------------------------------
501
502 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300503 * Helper Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000504 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300505 * @param string|string[] $helpers Helper name(s)
Derek Allard2067d1a2008-11-13 22:59:24 +0000506 * @return void
507 */
Greg Akerf5c84022011-04-19 17:13:03 -0500508 public function helper($helpers = array())
Barry Mienydd671972010-10-04 16:33:58 +0200509 {
Derek Jones32bf1862010-03-02 13:46:07 -0600510 foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)
Barry Mienydd671972010-10-04 16:33:58 +0200511 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000512 if (isset($this->_ci_helpers[$helper]))
513 {
514 continue;
515 }
Derek Jones32bf1862010-03-02 13:46:07 -0600516
Barry Mienydd671972010-10-04 16:33:58 +0200517 // Is this a helper extension request?
Andrey Andreev12d7b462012-11-12 13:42:09 +0200518 $ext_helper = config_item('subclass_prefix').$helper;
519 $ext_loaded = FALSE;
520 foreach ($this->_ci_helper_paths as $path)
521 {
522 if (file_exists($path.'helpers/'.$ext_helper.'.php'))
523 {
524 include_once($path.'helpers/'.$ext_helper.'.php');
525 $ext_loaded = TRUE;
526 }
527 }
528
529 // If we have loaded extensions - check if the base one is here
530 if ($ext_loaded === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000531 {
Greg Aker3a746652011-04-19 10:59:47 -0500532 $base_helper = BASEPATH.'helpers/'.$helper.'.php';
Derek Allard2067d1a2008-11-13 22:59:24 +0000533 if ( ! file_exists($base_helper))
534 {
Greg Aker3a746652011-04-19 10:59:47 -0500535 show_error('Unable to load the requested file: helpers/'.$helper.'.php');
Derek Allard2067d1a2008-11-13 22:59:24 +0000536 }
Barry Mienydd671972010-10-04 16:33:58 +0200537
Derek Allard2067d1a2008-11-13 22:59:24 +0000538 include_once($base_helper);
Derek Jones32bf1862010-03-02 13:46:07 -0600539 $this->_ci_helpers[$helper] = TRUE;
540 log_message('debug', 'Helper loaded: '.$helper);
541 continue;
Derek Allard2067d1a2008-11-13 22:59:24 +0000542 }
Barry Mienydd671972010-10-04 16:33:58 +0200543
Andrey Andreev12d7b462012-11-12 13:42:09 +0200544 // No extensions found ... try loading regular helpers and/or overrides
Derek Jones32bf1862010-03-02 13:46:07 -0600545 foreach ($this->_ci_helper_paths as $path)
546 {
Greg Aker3a746652011-04-19 10:59:47 -0500547 if (file_exists($path.'helpers/'.$helper.'.php'))
Barry Mienydd671972010-10-04 16:33:58 +0200548 {
Greg Aker3a746652011-04-19 10:59:47 -0500549 include_once($path.'helpers/'.$helper.'.php');
Derek Jones32bf1862010-03-02 13:46:07 -0600550
551 $this->_ci_helpers[$helper] = TRUE;
Barry Mienydd671972010-10-04 16:33:58 +0200552 log_message('debug', 'Helper loaded: '.$helper);
Derek Jones32bf1862010-03-02 13:46:07 -0600553 break;
Derek Allard2067d1a2008-11-13 22:59:24 +0000554 }
555 }
556
Derek Jones32bf1862010-03-02 13:46:07 -0600557 // unable to load the helper
558 if ( ! isset($this->_ci_helpers[$helper]))
559 {
Greg Aker3a746652011-04-19 10:59:47 -0500560 show_error('Unable to load the requested file: helpers/'.$helper.'.php');
Derek Jones32bf1862010-03-02 13:46:07 -0600561 }
Barry Mienydd671972010-10-04 16:33:58 +0200562 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000563 }
Barry Mienydd671972010-10-04 16:33:58 +0200564
Derek Allard2067d1a2008-11-13 22:59:24 +0000565 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200566
Derek Allard2067d1a2008-11-13 22:59:24 +0000567 /**
568 * Load Helpers
569 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300570 * An alias for the helper() method in case the developer has
571 * written the plural form of it.
Derek Allard2067d1a2008-11-13 22:59:24 +0000572 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300573 * @uses CI_Loader::helper()
574 * @param string|string[] $helpers Helper name(s)
Derek Allard2067d1a2008-11-13 22:59:24 +0000575 * @return void
576 */
Greg Akerf5c84022011-04-19 17:13:03 -0500577 public function helpers($helpers = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000578 {
579 $this->helper($helpers);
580 }
Barry Mienydd671972010-10-04 16:33:58 +0200581
Derek Allard2067d1a2008-11-13 22:59:24 +0000582 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200583
Derek Allard2067d1a2008-11-13 22:59:24 +0000584 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300585 * Language Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000586 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300587 * Loads language files.
588 *
589 * @param string|string[] $files List of language file names to load
590 * @param string Language name
Derek Allard2067d1a2008-11-13 22:59:24 +0000591 * @return void
592 */
Andrey Andreeved4b2582012-10-27 17:46:52 +0300593 public function language($files = array(), $lang = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000594 {
595 $CI =& get_instance();
596
Andrey Andreeved4b2582012-10-27 17:46:52 +0300597 is_array($files) OR $files = array($files);
Derek Allard2067d1a2008-11-13 22:59:24 +0000598
Andrey Andreeved4b2582012-10-27 17:46:52 +0300599 foreach ($files as $langfile)
Barry Mienydd671972010-10-04 16:33:58 +0200600 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000601 $CI->lang->load($langfile, $lang);
602 }
603 }
Barry Mienydd671972010-10-04 16:33:58 +0200604
Derek Allard2067d1a2008-11-13 22:59:24 +0000605 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200606
Derek Allard2067d1a2008-11-13 22:59:24 +0000607 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300608 * Config Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000609 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300610 * Loads a config file (an alias for CI_Config::load()).
611 *
612 * @uses CI_Config::load()
613 * @param string $file Configuration file name
614 * @param bool $use_sections Whether configuration values should be loaded into their own section
615 * @param bool $fail_gracefully Whether to just return FALSE or display an error message
616 * @return bool TRUE if the file was loaded correctly or FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000617 */
Greg Akerf5c84022011-04-19 17:13:03 -0500618 public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200619 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000620 $CI =& get_instance();
Andrey Andreeved4b2582012-10-27 17:46:52 +0300621 return $CI->config->load($file, $use_sections, $fail_gracefully);
Derek Allard2067d1a2008-11-13 22:59:24 +0000622 }
623
624 // --------------------------------------------------------------------
Derek Jones32bf1862010-03-02 13:46:07 -0600625
Derek Allard2067d1a2008-11-13 22:59:24 +0000626 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300627 * Driver Loader
Derek Jones8dca0412010-03-05 13:01:44 -0600628 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300629 * Loads a driver library.
Derek Jones8dca0412010-03-05 13:01:44 -0600630 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300631 * @param string|string[] $library Driver name(s)
632 * @param array $params Optional parameters to pass to the driver
633 * @param string $object_name An optional object name to assign to
634 *
635 * @return void|object|bool Object or FALSE on failure if $library is a string
636 * and $object_name is set. void otherwise.
Derek Jones8dca0412010-03-05 13:01:44 -0600637 */
Greg Akerf5c84022011-04-19 17:13:03 -0500638 public function driver($library = '', $params = NULL, $object_name = NULL)
Derek Jones8dca0412010-03-05 13:01:44 -0600639 {
Christopher Guineyb54d3552012-03-10 08:38:10 -0800640 if (is_array($library))
Christopher Guiney9929d6f2012-03-09 19:53:24 -0800641 {
Christopher Guineyb54d3552012-03-10 08:38:10 -0800642 foreach ($library as $driver)
Christopher Guiney9929d6f2012-03-09 19:53:24 -0800643 {
644 $this->driver($driver);
645 }
dchill420fc3be52012-08-27 20:54:23 -0400646 return;
Christopher Guiney9929d6f2012-03-09 19:53:24 -0800647 }
648
Alex Bilbieed944a32012-06-02 11:07:47 +0100649 if ($library === '')
Tom Klingenberg6a15b2d2011-10-07 20:03:30 +0200650 {
651 return FALSE;
652 }
653
vlakofffadb8222013-05-12 10:57:09 +0200654 if ( ! class_exists('CI_Driver_Library', FALSE))
dchill426262d052012-11-24 18:41:13 -0500655 {
656 // We aren't instantiating an object here, just making the base class available
657 require BASEPATH.'libraries/Driver.php';
658 }
659
Derek Jonesd5e0cb52010-03-09 20:20:46 -0600660 // We can save the loader some time since Drivers will *always* be in a subfolder,
661 // and typically identically named to the library
662 if ( ! strpos($library, '/'))
663 {
Greg Akerd25e66a2010-03-28 01:07:09 -0500664 $library = ucfirst($library).'/'.$library;
Derek Jones8dca0412010-03-05 13:01:44 -0600665 }
Barry Mienydd671972010-10-04 16:33:58 +0200666
Derek Jones8dca0412010-03-05 13:01:44 -0600667 return $this->library($library, $params, $object_name);
668 }
669
670 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200671
Derek Jones8dca0412010-03-05 13:01:44 -0600672 /**
Derek Jones32bf1862010-03-02 13:46:07 -0600673 * Add Package Path
Derek Allard2067d1a2008-11-13 22:59:24 +0000674 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300675 * Prepends a parent path to the library, model, helper and config
676 * path arrays.
Derek Allard2067d1a2008-11-13 22:59:24 +0000677 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300678 * @see CI_Loader::$_ci_library_paths
679 * @see CI_Loader::$_ci_model_paths
680 * @see CI_Loader::$_ci_helper_paths
681 * @see CI_Config::$_config_paths
682 *
683 * @param string $path Path to add
684 * @param bool $view_cascade (default: TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000685 * @return void
Derek Jones32bf1862010-03-02 13:46:07 -0600686 */
Andrey Andreevcce91802012-06-12 13:25:31 +0300687 public function add_package_path($path, $view_cascade = TRUE)
Derek Jones32bf1862010-03-02 13:46:07 -0600688 {
Pascal Kriete6b6c2742010-11-09 13:12:22 -0500689 $path = rtrim($path, '/').'/';
David Behlercda768a2011-08-14 23:52:48 +0200690
Derek Jones32bf1862010-03-02 13:46:07 -0600691 array_unshift($this->_ci_library_paths, $path);
692 array_unshift($this->_ci_model_paths, $path);
693 array_unshift($this->_ci_helper_paths, $path);
Barry Mienydd671972010-10-04 16:33:58 +0200694
Greg Akerf5c84022011-04-19 17:13:03 -0500695 $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
696
Derek Jones32bf1862010-03-02 13:46:07 -0600697 // Add config file path
698 $config =& $this->_ci_get_component('config');
and-ersb3ec9422013-01-03 16:05:12 +0100699 $config->_config_paths[] = $path;
Derek Allard2067d1a2008-11-13 22:59:24 +0000700 }
701
702 // --------------------------------------------------------------------
Derek Jones32bf1862010-03-02 13:46:07 -0600703
704 /**
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000705 * Get Package Paths
706 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300707 * Return a list of all package paths.
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000708 *
vlakoffcdc61132013-05-10 16:47:47 +0200709 * @param bool $include_base Whether to include BASEPATH (default: FALSE)
Andrey Andreeved4b2582012-10-27 17:46:52 +0300710 * @return array
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000711 */
Greg Akerf5c84022011-04-19 17:13:03 -0500712 public function get_package_paths($include_base = FALSE)
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000713 {
Andrey Andreev5fd3ae82012-10-24 14:55:35 +0300714 return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths;
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000715 }
716
717 // --------------------------------------------------------------------
718
719 /**
Derek Jones32bf1862010-03-02 13:46:07 -0600720 * Remove Package Path
721 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300722 * Remove a path from the library, model, helper and/or config
723 * path arrays if it exists. If no path is provided, the most recently
724 * added path will be removed removed.
Derek Jones32bf1862010-03-02 13:46:07 -0600725 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300726 * @param string $path Path to remove
Andrey Andreev94af3552012-03-26 23:10:42 +0300727 * @return void
Derek Jones32bf1862010-03-02 13:46:07 -0600728 */
Andrey Andreeved4b2582012-10-27 17:46:52 +0300729 public function remove_package_path($path = '')
Derek Jones32bf1862010-03-02 13:46:07 -0600730 {
731 $config =& $this->_ci_get_component('config');
Barry Mienydd671972010-10-04 16:33:58 +0200732
Alex Bilbieed944a32012-06-02 11:07:47 +0100733 if ($path === '')
Derek Jones32bf1862010-03-02 13:46:07 -0600734 {
Andrey Andreevd7297352012-01-07 22:53:14 +0200735 array_shift($this->_ci_library_paths);
736 array_shift($this->_ci_model_paths);
737 array_shift($this->_ci_helper_paths);
738 array_shift($this->_ci_view_paths);
Korri3684d342012-04-17 00:35:08 -0400739 array_pop($config->_config_paths);
Derek Jones32bf1862010-03-02 13:46:07 -0600740 }
741 else
742 {
Pascal Kriete6b6c2742010-11-09 13:12:22 -0500743 $path = rtrim($path, '/').'/';
Derek Jones32bf1862010-03-02 13:46:07 -0600744 foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
745 {
746 if (($key = array_search($path, $this->{$var})) !== FALSE)
747 {
748 unset($this->{$var}[$key]);
749 }
750 }
David Behlercda768a2011-08-14 23:52:48 +0200751
Greg Akerf5c84022011-04-19 17:13:03 -0500752 if (isset($this->_ci_view_paths[$path.'views/']))
753 {
754 unset($this->_ci_view_paths[$path.'views/']);
755 }
Barry Mienydd671972010-10-04 16:33:58 +0200756
Derek Jones32bf1862010-03-02 13:46:07 -0600757 if (($key = array_search($path, $config->_config_paths)) !== FALSE)
758 {
759 unset($config->_config_paths[$key]);
760 }
761 }
Barry Mienydd671972010-10-04 16:33:58 +0200762
Derek Jones32bf1862010-03-02 13:46:07 -0600763 // make sure the application default paths are still in the array
764 $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
765 $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
766 $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
Greg Akerf5c84022011-04-19 17:13:03 -0500767 $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
Derek Jones32bf1862010-03-02 13:46:07 -0600768 $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
769 }
770
771 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200772
Derek Allard2067d1a2008-11-13 22:59:24 +0000773 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300774 * Internal CI Data Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000775 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300776 * Used to load views and files.
777 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000778 * Variables are prefixed with _ci_ to avoid symbol collision with
Andrey Andreeved4b2582012-10-27 17:46:52 +0300779 * variables made available to view files.
Derek Allard2067d1a2008-11-13 22:59:24 +0000780 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300781 * @used-by CI_Loader::view()
782 * @used-by CI_Loader::file()
783 * @param array $_ci_data Data to load
Derek Allard2067d1a2008-11-13 22:59:24 +0000784 * @return void
785 */
Greg Akerf5c84022011-04-19 17:13:03 -0500786 protected function _ci_load($_ci_data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000787 {
788 // Set the default data variables
789 foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
790 {
Andrey Andreev94af3552012-03-26 23:10:42 +0300791 $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000792 }
David Behlercda768a2011-08-14 23:52:48 +0200793
Greg Akerf5c84022011-04-19 17:13:03 -0500794 $file_exists = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000795
796 // Set the path to the requested file
Alex Bilbie40bd2a72012-06-02 16:04:15 +0100797 if (is_string($_ci_path) && $_ci_path !== '')
Greg Aker8807be32011-04-21 13:06:15 -0500798 {
799 $_ci_x = explode('/', $_ci_path);
800 $_ci_file = end($_ci_x);
801 }
802 else
Derek Allard2067d1a2008-11-13 22:59:24 +0000803 {
804 $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
Alex Bilbieed944a32012-06-02 11:07:47 +0100805 $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view;
Greg Akerf5c84022011-04-19 17:13:03 -0500806
Joe McFrederick64f470b2012-08-18 12:29:56 -0400807 foreach ($this->_ci_view_paths as $_ci_view_file => $cascade)
Greg Akerf5c84022011-04-19 17:13:03 -0500808 {
Joe McFrederick64f470b2012-08-18 12:29:56 -0400809 if (file_exists($_ci_view_file.$_ci_file))
Greg Akerf5c84022011-04-19 17:13:03 -0500810 {
Joe McFrederick64f470b2012-08-18 12:29:56 -0400811 $_ci_path = $_ci_view_file.$_ci_file;
Greg Akerf5c84022011-04-19 17:13:03 -0500812 $file_exists = TRUE;
813 break;
814 }
David Behlercda768a2011-08-14 23:52:48 +0200815
Greg Akerf5c84022011-04-19 17:13:03 -0500816 if ( ! $cascade)
817 {
818 break;
David Behlercda768a2011-08-14 23:52:48 +0200819 }
Greg Akerf5c84022011-04-19 17:13:03 -0500820 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000821 }
Barry Mienydd671972010-10-04 16:33:58 +0200822
Greg Akerf5c84022011-04-19 17:13:03 -0500823 if ( ! $file_exists && ! file_exists($_ci_path))
Derek Allard2067d1a2008-11-13 22:59:24 +0000824 {
825 show_error('Unable to load the requested file: '.$_ci_file);
826 }
Barry Mienydd671972010-10-04 16:33:58 +0200827
Derek Allard2067d1a2008-11-13 22:59:24 +0000828 // This allows anything loaded using $this->load (views, files, etc.)
829 // to become accessible from within the Controller and Model functions.
Pascal Kriete89ace432010-11-10 15:49:10 -0500830 $_ci_CI =& get_instance();
831 foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
Derek Allard2067d1a2008-11-13 22:59:24 +0000832 {
Pascal Kriete89ace432010-11-10 15:49:10 -0500833 if ( ! isset($this->$_ci_key))
Derek Allard2067d1a2008-11-13 22:59:24 +0000834 {
Pascal Kriete89ace432010-11-10 15:49:10 -0500835 $this->$_ci_key =& $_ci_CI->$_ci_key;
Derek Allard2067d1a2008-11-13 22:59:24 +0000836 }
837 }
838
839 /*
840 * Extract and cache variables
841 *
vlakoff02506182012-07-03 07:28:50 +0200842 * You can either set variables using the dedicated $this->load->vars()
Derek Allard2067d1a2008-11-13 22:59:24 +0000843 * function or via the second parameter of this function. We'll merge
844 * the two types and cache them so that views that are embedded within
845 * other views can have access to these variables.
Barry Mienydd671972010-10-04 16:33:58 +0200846 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000847 if (is_array($_ci_vars))
848 {
849 $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
850 }
851 extract($this->_ci_cached_vars);
Barry Mienydd671972010-10-04 16:33:58 +0200852
Derek Allard2067d1a2008-11-13 22:59:24 +0000853 /*
854 * Buffer the output
855 *
856 * We buffer the output for two reasons:
857 * 1. Speed. You get a significant speed boost.
Andrey Andreevd7297352012-01-07 22:53:14 +0200858 * 2. So that the final rendered template can be post-processed by
dchill425628ba02012-08-08 12:05:45 -0400859 * the output class. Why do we need post processing? For one thing,
860 * in order to show the elapsed page load time. Unless we can
861 * intercept the content right before it's sent to the browser and
862 * then stop the timer it won't be accurate.
Derek Allard2067d1a2008-11-13 22:59:24 +0000863 */
864 ob_start();
Barry Mienydd671972010-10-04 16:33:58 +0200865
Derek Allard2067d1a2008-11-13 22:59:24 +0000866 // If the PHP installation does not support short tags we'll
867 // do a little string replacement, changing the short tags
868 // to standard PHP echo statements.
Andrey Andreeve9d2dc82012-11-07 14:23:29 +0200869 if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE
870 && config_item('rewrite_short_tags') === TRUE && function_usable('eval')
871 )
Derek Allard2067d1a2008-11-13 22:59:24 +0000872 {
Andrey Andreevd47baab2012-01-09 16:56:46 +0200873 echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
Derek Allard2067d1a2008-11-13 22:59:24 +0000874 }
875 else
876 {
877 include($_ci_path); // include() vs include_once() allows for multiple views with the same name
878 }
Barry Mienydd671972010-10-04 16:33:58 +0200879
Derek Allard2067d1a2008-11-13 22:59:24 +0000880 log_message('debug', 'File loaded: '.$_ci_path);
Barry Mienydd671972010-10-04 16:33:58 +0200881
Derek Allard2067d1a2008-11-13 22:59:24 +0000882 // Return the file data if requested
883 if ($_ci_return === TRUE)
Barry Mienydd671972010-10-04 16:33:58 +0200884 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000885 $buffer = ob_get_contents();
886 @ob_end_clean();
887 return $buffer;
888 }
889
890 /*
891 * Flush the buffer... or buff the flusher?
892 *
893 * In order to permit views to be nested within
894 * other views, we need to flush the content back out whenever
895 * we are beyond the first level of output buffering so that
896 * it can be seen and included properly by the first included
897 * template and any subsequent ones. Oy!
Barry Mienydd671972010-10-04 16:33:58 +0200898 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000899 if (ob_get_level() > $this->_ci_ob_level + 1)
900 {
901 ob_end_flush();
902 }
903 else
904 {
Greg Aker22f1a632010-11-10 15:34:35 -0600905 $_ci_CI->output->append_output(ob_get_contents());
Derek Allard2067d1a2008-11-13 22:59:24 +0000906 @ob_end_clean();
907 }
908 }
909
910 // --------------------------------------------------------------------
911
912 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300913 * Internal CI Class Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000914 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300915 * @used-by CI_Loader::library()
916 * @uses CI_Loader::_ci_init_class()
Derek Allard2067d1a2008-11-13 22:59:24 +0000917 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300918 * @param string $class Class name to load
919 * @param mixed $params Optional parameters to pass to the class constructor
920 * @param string $object_name Optional object name to assign to
Barry Mienydd671972010-10-04 16:33:58 +0200921 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000922 */
Greg Akerf5c84022011-04-19 17:13:03 -0500923 protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
Barry Mienydd671972010-10-04 16:33:58 +0200924 {
925 // Get the class name, and while we're at it trim any slashes.
926 // The directory path can be included as part of the class name,
Derek Allard2067d1a2008-11-13 22:59:24 +0000927 // but we don't want a leading slash
Greg Aker3a746652011-04-19 10:59:47 -0500928 $class = str_replace('.php', '', trim($class, '/'));
Barry Mienydd671972010-10-04 16:33:58 +0200929
Derek Allard2067d1a2008-11-13 22:59:24 +0000930 // Was the path included with the class name?
931 // We look for a slash to determine this
Derek Jones32bf1862010-03-02 13:46:07 -0600932 if (($last_slash = strrpos($class, '/')) !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000933 {
Derek Jones32bf1862010-03-02 13:46:07 -0600934 // Extract the path
Andrey Andreevc26d34f2013-01-28 21:46:08 +0200935 $subdir = substr($class, 0, ++$last_slash);
Barry Mienydd671972010-10-04 16:33:58 +0200936
Derek Jones32bf1862010-03-02 13:46:07 -0600937 // Get the filename from the path
Andrey Andreevd7297352012-01-07 22:53:14 +0200938 $class = substr($class, $last_slash);
Derek Allard2067d1a2008-11-13 22:59:24 +0000939 }
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200940 else
Derek Allard2067d1a2008-11-13 22:59:24 +0000941 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200942 $subdir = '';
943 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000944
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200945 $class = ucfirst($class);
946 $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';
947
948 // Is this a class extension request?
949 if (file_exists($subclass))
950 {
Daniel1d3752c2013-04-14 16:41:57 -0400951 $baseclass = BASEPATH.'libraries/'.$subdir.$class.'.php';
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200952
953 if ( ! file_exists($baseclass))
Derek Allard2067d1a2008-11-13 22:59:24 +0000954 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200955 log_message('error', 'Unable to load the requested class: '.$class);
956 show_error('Unable to load the requested class: '.$class);
Derek Allard2067d1a2008-11-13 22:59:24 +0000957 }
Barry Mienydd671972010-10-04 16:33:58 +0200958
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200959 // Safety: Was the class already loaded by a previous call?
960 if (class_exists(config_item('subclass_prefix').$class, FALSE))
Derek Allard2067d1a2008-11-13 22:59:24 +0000961 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200962 // Before we deem this to be a duplicate request, let's see
963 // if a custom object name is being supplied. If so, we'll
964 // return a new instance of the object
965 if ($object_name !== NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000966 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200967 $CI =& get_instance();
968 if ( ! isset($CI->$object_name))
Derek Allard2067d1a2008-11-13 22:59:24 +0000969 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200970 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000971 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000972 }
Barry Mienydd671972010-10-04 16:33:58 +0200973
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200974 log_message('debug', $class.' class already loaded. Second attempt ignored.');
975 return;
Derek Allard2067d1a2008-11-13 22:59:24 +0000976 }
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200977
978 include_once($baseclass);
979 include_once($subclass);
980
981 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
982 }
983
vlakoff35672462013-02-15 01:36:04 +0100984 // Let's search for the requested library file and load it.
Andrey Andreev3608e1a2013-01-28 16:27:30 +0200985 foreach ($this->_ci_library_paths as $path)
986 {
987 $filepath = $path.'libraries/'.$subdir.$class.'.php';
988
989 // Safety: Was the class already loaded by a previous call?
990 if (class_exists($class, FALSE))
991 {
992 // Before we deem this to be a duplicate request, let's see
993 // if a custom object name is being supplied. If so, we'll
994 // return a new instance of the object
995 if ($object_name !== NULL)
996 {
997 $CI =& get_instance();
998 if ( ! isset($CI->$object_name))
999 {
1000 return $this->_ci_init_class($class, '', $params, $object_name);
1001 }
1002 }
1003
1004 log_message('debug', $class.' class already loaded. Second attempt ignored.');
1005 return;
1006 }
1007 // Does the file exist? No? Bummer...
1008 elseif ( ! file_exists($filepath))
1009 {
1010 continue;
1011 }
1012
1013 include_once($filepath);
1014 return $this->_ci_init_class($class, '', $params, $object_name);
1015 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001016
Andrey Andreevd7297352012-01-07 22:53:14 +02001017 // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?
Alex Bilbieed944a32012-06-02 11:07:47 +01001018 if ($subdir === '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001019 {
Andrey Andreev3608e1a2013-01-28 16:27:30 +02001020 return $this->_ci_load_class($class.'/'.$class, $params, $object_name);
dchill42aee92652012-08-26 21:45:35 -04001021 }
Barry Mienydd671972010-10-04 16:33:58 +02001022
Derek Allard2067d1a2008-11-13 22:59:24 +00001023 // If we got this far we were unable to find the requested class.
Andrey Andreev3608e1a2013-01-28 16:27:30 +02001024 log_message('error', 'Unable to load the requested class: '.$class);
1025 show_error('Unable to load the requested class: '.$class);
Derek Allard2067d1a2008-11-13 22:59:24 +00001026 }
Barry Mienydd671972010-10-04 16:33:58 +02001027
Derek Allard2067d1a2008-11-13 22:59:24 +00001028 // --------------------------------------------------------------------
1029
1030 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001031 * Internal CI Class Instantiator
Derek Allard2067d1a2008-11-13 22:59:24 +00001032 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001033 * @used-by CI_Loader::_ci_load_class()
1034 *
1035 * @param string $class Class name
1036 * @param string $prefix Class name prefix
1037 * @param array|null|bool $config Optional configuration to pass to the class constructor:
1038 * FALSE to skip;
1039 * NULL to search in config paths;
1040 * array containing configuration data
1041 * @param string $object_name Optional object name to assign to
Andrey Andreev94af3552012-03-26 23:10:42 +03001042 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +00001043 */
Greg Aker0c9ee4a2011-04-20 09:40:17 -05001044 protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
Barry Mienydd671972010-10-04 16:33:58 +02001045 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001046 // Is there an associated config file for this class? Note: these should always be lowercase
Derek Allard2067d1a2008-11-13 22:59:24 +00001047 if ($config === NULL)
1048 {
Eric Barnes5e16ec62011-01-04 17:25:23 -05001049 // Fetch the config paths containing any package paths
1050 $config_component = $this->_ci_get_component('config');
1051
1052 if (is_array($config_component->_config_paths))
Derek Allard2067d1a2008-11-13 22:59:24 +00001053 {
Eric Barnes5e16ec62011-01-04 17:25:23 -05001054 // Break on the first found file, thus package files
1055 // are not overridden by default paths
1056 foreach ($config_component->_config_paths as $path)
1057 {
1058 // We test for both uppercase and lowercase, for servers that
joelcox1bfd9fa2011-01-16 18:49:39 +01001059 // are case-sensitive with regard to file names. Check for environment
1060 // first, global next
Andrey Andreevdb529ca2013-01-28 11:00:02 +02001061 if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
joelcox1bfd9fa2011-01-16 18:49:39 +01001062 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001063 include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');
joelcox1bfd9fa2011-01-16 18:49:39 +01001064 break;
1065 }
Andrey Andreevdb529ca2013-01-28 11:00:02 +02001066 elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
joelcox1bfd9fa2011-01-16 18:49:39 +01001067 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001068 include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');
joelcox1bfd9fa2011-01-16 18:49:39 +01001069 break;
1070 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001071 elseif (file_exists($path.'config/'.strtolower($class).'.php'))
Eric Barnes5e16ec62011-01-04 17:25:23 -05001072 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001073 include($path.'config/'.strtolower($class).'.php');
Eric Barnes5e16ec62011-01-04 17:25:23 -05001074 break;
1075 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001076 elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php'))
Eric Barnes5e16ec62011-01-04 17:25:23 -05001077 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001078 include($path.'config/'.ucfirst(strtolower($class)).'.php');
Eric Barnes5e16ec62011-01-04 17:25:23 -05001079 break;
1080 }
1081 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001082 }
1083 }
Barry Mienydd671972010-10-04 16:33:58 +02001084
Alex Bilbieed944a32012-06-02 11:07:47 +01001085 if ($prefix === '')
Barry Mienydd671972010-10-04 16:33:58 +02001086 {
Andrey Andreev49e68de2013-02-21 16:30:55 +02001087 if (class_exists('CI_'.$class, FALSE))
Derek Allard2067d1a2008-11-13 22:59:24 +00001088 {
1089 $name = 'CI_'.$class;
1090 }
Andrey Andreev49e68de2013-02-21 16:30:55 +02001091 elseif (class_exists(config_item('subclass_prefix').$class, FALSE))
Derek Allard2067d1a2008-11-13 22:59:24 +00001092 {
1093 $name = config_item('subclass_prefix').$class;
1094 }
1095 else
1096 {
1097 $name = $class;
1098 }
1099 }
1100 else
1101 {
1102 $name = $prefix.$class;
1103 }
Barry Mienydd671972010-10-04 16:33:58 +02001104
Derek Allard2067d1a2008-11-13 22:59:24 +00001105 // Is the class name valid?
Andrey Andreev49e68de2013-02-21 16:30:55 +02001106 if ( ! class_exists($name, FALSE))
Derek Allard2067d1a2008-11-13 22:59:24 +00001107 {
Andrey Andreevd7297352012-01-07 22:53:14 +02001108 log_message('error', 'Non-existent class: '.$name);
jonnueee2df62012-07-16 13:06:16 +01001109 show_error('Non-existent class: '.$name);
Derek Allard2067d1a2008-11-13 22:59:24 +00001110 }
Barry Mienydd671972010-10-04 16:33:58 +02001111
Derek Allard2067d1a2008-11-13 22:59:24 +00001112 // Set the variable name we will assign the class to
Andrey Andreevd7297352012-01-07 22:53:14 +02001113 // Was a custom class name supplied? If so we'll use it
Andrey Andreev519f87a2013-07-23 17:16:10 +03001114 if (empty($object_name))
Derek Allard2067d1a2008-11-13 22:59:24 +00001115 {
Andrey Andreev519f87a2013-07-23 17:16:10 +03001116 $object_name = strtolower($class);
1117 if (isset($this->_ci_varmap[$object_name]))
1118 {
1119 $object_name = $this->_ci_varmap[$object_name];
1120 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001121 }
Andrey Andreev519f87a2013-07-23 17:16:10 +03001122
1123 // Don't overwrite existing properties
1124 $CI =& get_instance();
1125 if (isset($CI->$object_name))
Derek Allard2067d1a2008-11-13 22:59:24 +00001126 {
Andrey Andreev519f87a2013-07-23 17:16:10 +03001127 if ($CI->$object_name instanceof $name)
1128 {
1129 log_message('debug', $class." has already been instantiated as '".$object_name."'. Second attempt aborted.");
1130 return;
1131 }
1132
1133 show_error("Resource '".$object_name."' already exists and is not a ".$class." instance.");
Derek Allard2067d1a2008-11-13 22:59:24 +00001134 }
1135
Barry Mienydd671972010-10-04 16:33:58 +02001136 // Save the class name and object name
Andrey Andreev519f87a2013-07-23 17:16:10 +03001137 $this->_ci_classes[$object_name] = $class;
Derek Allard2067d1a2008-11-13 22:59:24 +00001138
Barry Mienydd671972010-10-04 16:33:58 +02001139 // Instantiate the class
Andrey Andreev519f87a2013-07-23 17:16:10 +03001140 $CI->$object_name = isset($config)
1141 ? new $name($config)
1142 : new $name();
Barry Mienydd671972010-10-04 16:33:58 +02001143 }
1144
Derek Allard2067d1a2008-11-13 22:59:24 +00001145 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001146
Derek Allard2067d1a2008-11-13 22:59:24 +00001147 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001148 * CI Autoloader
Derek Allard2067d1a2008-11-13 22:59:24 +00001149 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001150 * Loads component listed in the config/autoload.php file.
Derek Allard2067d1a2008-11-13 22:59:24 +00001151 *
Andrey Andreevcdac2482012-11-03 18:09:01 +02001152 * @used-by CI_Loader::initialize()
Derek Allard2067d1a2008-11-13 22:59:24 +00001153 * @return void
1154 */
Shane Pearson665baec2011-08-22 18:52:19 -05001155 protected function _ci_autoloader()
Barry Mienydd671972010-10-04 16:33:58 +02001156 {
Andrey Andreevdb529ca2013-01-28 11:00:02 +02001157 if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
bubbafoley0ea04142011-03-17 14:55:41 -05001158 {
Shane Pearson6adfe632011-08-10 16:42:53 -05001159 include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
bubbafoley0ea04142011-03-17 14:55:41 -05001160 }
1161 else
1162 {
Shane Pearson6adfe632011-08-10 16:42:53 -05001163 include(APPPATH.'config/autoload.php');
bubbafoley0ea04142011-03-17 14:55:41 -05001164 }
Barry Mienydd671972010-10-04 16:33:58 +02001165
Derek Allard2067d1a2008-11-13 22:59:24 +00001166 if ( ! isset($autoload))
1167 {
1168 return FALSE;
1169 }
Barry Mienydd671972010-10-04 16:33:58 +02001170
Phil Sturgeon9730c752010-12-15 10:50:15 +00001171 // Autoload packages
1172 if (isset($autoload['packages']))
1173 {
1174 foreach ($autoload['packages'] as $package_path)
1175 {
1176 $this->add_package_path($package_path);
1177 }
1178 }
1179
Derek Allard2067d1a2008-11-13 22:59:24 +00001180 // Load any custom config file
1181 if (count($autoload['config']) > 0)
Barry Mienydd671972010-10-04 16:33:58 +02001182 {
Derek Allard2067d1a2008-11-13 22:59:24 +00001183 $CI =& get_instance();
1184 foreach ($autoload['config'] as $key => $val)
1185 {
1186 $CI->config->load($val);
1187 }
Barry Mienydd671972010-10-04 16:33:58 +02001188 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001189
Derek Jonesc6da5032010-03-09 20:44:27 -06001190 // Autoload helpers and languages
1191 foreach (array('helper', 'language') as $type)
Barry Mienydd671972010-10-04 16:33:58 +02001192 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001193 if (isset($autoload[$type]) && count($autoload[$type]) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +00001194 {
1195 $this->$type($autoload[$type]);
Barry Mienydd671972010-10-04 16:33:58 +02001196 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001197 }
1198
Andrey Andreev9ab70a82013-07-23 00:09:26 +03001199 // Autoload drivers
1200 if (isset($autoload['drivers']))
1201 {
1202 foreach ($autoload['drivers'] as $item)
1203 {
1204 $this->driver($item);
1205 }
1206 }
1207
Derek Allard2067d1a2008-11-13 22:59:24 +00001208 // Load libraries
Andrey Andreev94af3552012-03-26 23:10:42 +03001209 if (isset($autoload['libraries']) && count($autoload['libraries']) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +00001210 {
1211 // Load the database driver.
1212 if (in_array('database', $autoload['libraries']))
1213 {
1214 $this->database();
1215 $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
1216 }
Barry Mienydd671972010-10-04 16:33:58 +02001217
Derek Allard2067d1a2008-11-13 22:59:24 +00001218 // Load all other libraries
1219 foreach ($autoload['libraries'] as $item)
1220 {
1221 $this->library($item);
1222 }
Barry Mienydd671972010-10-04 16:33:58 +02001223 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001224
1225 // Autoload models
1226 if (isset($autoload['model']))
1227 {
1228 $this->model($autoload['model']);
1229 }
Barry Mienydd671972010-10-04 16:33:58 +02001230 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001231
1232 // --------------------------------------------------------------------
1233
1234 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001235 * CI Object to Array translator
Derek Allard2067d1a2008-11-13 22:59:24 +00001236 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001237 * Takes an object as input and converts the class variables to
1238 * an associative array with key/value pairs.
Derek Allard2067d1a2008-11-13 22:59:24 +00001239 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001240 * @param object $object Object data to translate
Derek Allard2067d1a2008-11-13 22:59:24 +00001241 * @return array
1242 */
Greg Akerf5c84022011-04-19 17:13:03 -05001243 protected function _ci_object_to_array($object)
Derek Allard2067d1a2008-11-13 22:59:24 +00001244 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001245 return is_object($object) ? get_object_vars($object) : $object;
Derek Allard2067d1a2008-11-13 22:59:24 +00001246 }
1247
1248 // --------------------------------------------------------------------
1249
1250 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001251 * CI Component getter
Derek Jones32bf1862010-03-02 13:46:07 -06001252 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001253 * Get a reference to a specific library or model.
1254 *
1255 * @param string $component Component name
Derek Jones32bf1862010-03-02 13:46:07 -06001256 * @return bool
1257 */
Greg Akerf5c84022011-04-19 17:13:03 -05001258 protected function &_ci_get_component($component)
Derek Jones32bf1862010-03-02 13:46:07 -06001259 {
Pascal Kriete89ace432010-11-10 15:49:10 -05001260 $CI =& get_instance();
1261 return $CI->$component;
Derek Jones32bf1862010-03-02 13:46:07 -06001262 }
1263
1264 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001265
Derek Jones32bf1862010-03-02 13:46:07 -06001266 /**
1267 * Prep filename
1268 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001269 * This function prepares filenames of various items to
1270 * make their loading more reliable.
Derek Jones32bf1862010-03-02 13:46:07 -06001271 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001272 * @param string|string[] $filename Filename(s)
1273 * @param string $extension Filename extension
Derek Jones32bf1862010-03-02 13:46:07 -06001274 * @return array
1275 */
Greg Akerf5c84022011-04-19 17:13:03 -05001276 protected function _ci_prep_filename($filename, $extension)
Derek Jones32bf1862010-03-02 13:46:07 -06001277 {
1278 if ( ! is_array($filename))
Barry Mienydd671972010-10-04 16:33:58 +02001279 {
Andrey Andreevd47baab2012-01-09 16:56:46 +02001280 return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension));
Derek Jones32bf1862010-03-02 13:46:07 -06001281 }
1282 else
1283 {
1284 foreach ($filename as $key => $val)
1285 {
Andrey Andreevd47baab2012-01-09 16:56:46 +02001286 $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension);
Derek Jones32bf1862010-03-02 13:46:07 -06001287 }
Barry Mienydd671972010-10-04 16:33:58 +02001288
Derek Jones32bf1862010-03-02 13:46:07 -06001289 return $filename;
1290 }
1291 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001292
Derek Allard2067d1a2008-11-13 22:59:24 +00001293}
1294
1295/* End of file Loader.php */
Ahmad Anbar4005e3c2013-09-12 23:33:28 +03001296/* Location: ./system/core/Loader.php */