blob: 808fa80df9d9d927309026c989a46d11549351ca [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
Greg Aker0defe5d2012-01-01 18:46:41 -060021 * @copyright Copyright (c) 2008 - 2012, 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 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040055 protected $_ci_view_paths = array();
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 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040062 protected $_ci_library_paths = array();
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 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040069 protected $_ci_model_paths = array();
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 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040076 protected $_ci_helper_paths = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030077
David Behlercda768a2011-08-14 23:52:48 +020078 /**
79 * List of loaded base classes
David Behlercda768a2011-08-14 23:52:48 +020080 *
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 $_base_classes = array(); // Set by the controller class
Andrey Andreev92ebfb62012-05-17 12:49:24 +030084
David Behlercda768a2011-08-14 23:52:48 +020085 /**
86 * List of cached variables
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_cached_vars = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030091
David Behlercda768a2011-08-14 23:52:48 +020092 /**
93 * List of loaded classes
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_classes = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030098
David Behlercda768a2011-08-14 23:52:48 +020099 /**
100 * List of loaded files
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_loaded_files = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300105
David Behlercda768a2011-08-14 23:52:48 +0200106 /**
107 * List of loaded models
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_models = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300112
David Behlercda768a2011-08-14 23:52:48 +0200113 /**
114 * List of loaded helpers
115 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300116 * @var array
David Behlercda768a2011-08-14 23:52:48 +0200117 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -0400118 protected $_ci_helpers = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300119
David Behlercda768a2011-08-14 23:52:48 +0200120 /**
121 * List of class name mappings
122 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300123 * @var array
David Behlercda768a2011-08-14 23:52:48 +0200124 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -0400125 protected $_ci_varmap = array(
Timothy Warren40403d22012-04-19 16:38:50 -0400126 'unit_test' => 'unit',
127 'user_agent' => 'agent'
128 );
Derek Allard2067d1a2008-11-13 22:59:24 +0000129
130 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300131 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +0000132 *
Andrey Andreevcdac2482012-11-03 18:09:01 +0200133 * Sets component load paths, gets the initial output buffering level.
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300134 *
135 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000136 */
Greg Akerf5c84022011-04-19 17:13:03 -0500137 public function __construct()
Barry Mienydd671972010-10-04 16:33:58 +0200138 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500139 $this->_ci_ob_level = ob_get_level();
Derek Jones32bf1862010-03-02 13:46:07 -0600140 $this->_ci_library_paths = array(APPPATH, BASEPATH);
141 $this->_ci_helper_paths = array(APPPATH, BASEPATH);
142 $this->_ci_model_paths = array(APPPATH);
Joe Cianflone8eef9c72011-08-21 10:39:06 -0400143 $this->_ci_view_paths = array(VIEWPATH => TRUE);
David Behlercda768a2011-08-14 23:52:48 +0200144
Andrey Andreevd7297352012-01-07 22:53:14 +0200145 log_message('debug', 'Loader Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000146 }
Barry Mienydd671972010-10-04 16:33:58 +0200147
Derek Allard2067d1a2008-11-13 22:59:24 +0000148 // --------------------------------------------------------------------
David Behlercda768a2011-08-14 23:52:48 +0200149
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500150 /**
Andrey Andreevcdac2482012-11-03 18:09:01 +0200151 * Initializer
152 *
153 * @todo Figure out a way to move this to the constructor
154 * without breaking *package_path*() methods.
155 * @uses CI_Loader::_ci_autoloader()
156 * @used-by CI_Controller::__construct()
157 * @return void
158 */
159 public function initialize()
160 {
161 $this->_base_classes =& is_loaded();
162 $this->_ci_autoloader();
163 }
164
165 // --------------------------------------------------------------------
166
167 /**
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500168 * Is Loaded
169 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300170 * A utility method to test if a class is in the self::$_ci_classes array.
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500171 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300172 * @used-by Mainly used by Form Helper function _get_validation_object().
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500173 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300174 * @param string $class Class name to check for
175 * @return string|bool Class object name if loaded or FALSE
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500176 */
177 public function is_loaded($class)
178 {
Andrey Andreev92ebfb62012-05-17 12:49:24 +0300179 return isset($this->_ci_classes[$class]) ? $this->_ci_classes[$class] : FALSE;
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500180 }
181
182 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200183
Derek Allard2067d1a2008-11-13 22:59:24 +0000184 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300185 * Library Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000186 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300187 * Loads and instantiates libraries.
188 * Designed to be called from application controllers.
Derek Allard2067d1a2008-11-13 22:59:24 +0000189 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300190 * @param string $library Library name
191 * @param array $params Optional parameters to pass to the library class constructor
192 * @param string $object_name An optional object name to assign to
Derek Allard2067d1a2008-11-13 22:59:24 +0000193 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200194 */
Greg Aker0c9ee4a2011-04-20 09:40:17 -0500195 public function library($library = '', $params = NULL, $object_name = NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 {
Greg Akerce433962010-10-12 09:29:35 -0500197 if (is_array($library))
198 {
Phil Sturgeon08b51692011-04-03 18:05:42 +0100199 foreach ($library as $class)
Greg Akerce433962010-10-12 09:29:35 -0500200 {
Kellas Reeves3c6e4852011-02-09 11:57:56 -0600201 $this->library($class, $params);
Greg Akerce433962010-10-12 09:29:35 -0500202 }
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000203
Greg Akerce433962010-10-12 09:29:35 -0500204 return;
205 }
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000206
Alex Bilbieed944a32012-06-02 11:07:47 +0100207 if ($library === '' OR isset($this->_base_classes[$library]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000208 {
Andrey Andreeved4b2582012-10-27 17:46:52 +0300209 return;
Derek Allard2067d1a2008-11-13 22:59:24 +0000210 }
211
Derek Jones32bf1862010-03-02 13:46:07 -0600212 if ( ! is_null($params) && ! is_array($params))
Derek Allard2067d1a2008-11-13 22:59:24 +0000213 {
214 $params = NULL;
215 }
216
Kellas Reeves3c6e4852011-02-09 11:57:56 -0600217 $this->_ci_load_class($library, $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000218 }
219
220 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200221
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 /**
223 * Model Loader
224 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300225 * Loads and instantiates libraries.
Derek Allard2067d1a2008-11-13 22:59:24 +0000226 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300227 * @param string $model Model name
228 * @param string $name An optional object name to assign to
229 * @param bool $db_conn An optional database connection configuration to initialize
Derek Allard2067d1a2008-11-13 22:59:24 +0000230 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200231 */
Greg Akerf5c84022011-04-19 17:13:03 -0500232 public function model($model, $name = '', $db_conn = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200233 {
Andrey Andreeved4b2582012-10-27 17:46:52 +0300234 if (empty($model))
235 {
236 return;
237 }
238 elseif (is_array($model))
Derek Allard2067d1a2008-11-13 22:59:24 +0000239 {
Joel Limberg3cf174b2012-07-13 20:49:57 +0300240 foreach ($model as $class)
Derek Allard2067d1a2008-11-13 22:59:24 +0000241 {
Joel Limberg3cf174b2012-07-13 20:49:57 +0300242 $this->model($class);
Derek Allard2067d1a2008-11-13 22:59:24 +0000243 }
244 return;
245 }
246
Derek Jones32bf1862010-03-02 13:46:07 -0600247 $path = '';
Barry Mienydd671972010-10-04 16:33:58 +0200248
Derek Allard2067d1a2008-11-13 22:59:24 +0000249 // Is the model in a sub-folder? If so, parse out the filename and path.
Derek Jones32bf1862010-03-02 13:46:07 -0600250 if (($last_slash = strrpos($model, '/')) !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000251 {
Derek Jones32bf1862010-03-02 13:46:07 -0600252 // The path is in front of the last slash
Andrey Andreevd47baab2012-01-09 16:56:46 +0200253 $path = substr($model, 0, ++$last_slash);
Derek Jones32bf1862010-03-02 13:46:07 -0600254
255 // And the model name behind it
Andrey Andreevd47baab2012-01-09 16:56:46 +0200256 $model = substr($model, $last_slash);
Derek Allard2067d1a2008-11-13 22:59:24 +0000257 }
Barry Mienydd671972010-10-04 16:33:58 +0200258
Phil Sturgeon10d78f62012-06-04 14:41:53 -0500259 if (empty($name))
Derek Allard2067d1a2008-11-13 22:59:24 +0000260 {
261 $name = $model;
262 }
Barry Mienydd671972010-10-04 16:33:58 +0200263
Derek Allard2067d1a2008-11-13 22:59:24 +0000264 if (in_array($name, $this->_ci_models, TRUE))
265 {
266 return;
267 }
Barry Mienydd671972010-10-04 16:33:58 +0200268
Derek Allard2067d1a2008-11-13 22:59:24 +0000269 $CI =& get_instance();
270 if (isset($CI->$name))
271 {
272 show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
273 }
Barry Mienydd671972010-10-04 16:33:58 +0200274
Derek Allard2067d1a2008-11-13 22:59:24 +0000275 $model = strtolower($model);
Derek Allard2067d1a2008-11-13 22:59:24 +0000276
Derek Jones32bf1862010-03-02 13:46:07 -0600277 foreach ($this->_ci_model_paths as $mod_path)
278 {
Greg Aker3a746652011-04-19 10:59:47 -0500279 if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
Derek Jones32bf1862010-03-02 13:46:07 -0600280 {
281 continue;
282 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000283
Andrey Andreev94af3552012-03-26 23:10:42 +0300284 if ($db_conn !== FALSE && ! class_exists('CI_DB'))
Derek Jones32bf1862010-03-02 13:46:07 -0600285 {
286 if ($db_conn === TRUE)
Pascal Kriete287781e2010-11-10 15:43:49 -0500287 {
Derek Jones32bf1862010-03-02 13:46:07 -0600288 $db_conn = '';
Pascal Kriete287781e2010-11-10 15:43:49 -0500289 }
Derek Jones32bf1862010-03-02 13:46:07 -0600290
291 $CI->load->database($db_conn, FALSE, TRUE);
292 }
293
Greg Akerbce13482010-10-11 15:37:16 -0500294 if ( ! class_exists('CI_Model'))
Derek Jones32bf1862010-03-02 13:46:07 -0600295 {
296 load_class('Model', 'core');
297 }
298
Greg Aker3a746652011-04-19 10:59:47 -0500299 require_once($mod_path.'models/'.$path.$model.'.php');
Derek Jones32bf1862010-03-02 13:46:07 -0600300
301 $model = ucfirst($model);
Derek Jones32bf1862010-03-02 13:46:07 -0600302 $CI->$name = new $model();
Derek Jones32bf1862010-03-02 13:46:07 -0600303 $this->_ci_models[] = $name;
304 return;
305 }
Barry Mienydd671972010-10-04 16:33:58 +0200306
Derek Jones32bf1862010-03-02 13:46:07 -0600307 // couldn't find the model
308 show_error('Unable to locate the model you have specified: '.$model);
Derek Allard2067d1a2008-11-13 22:59:24 +0000309 }
Barry Mienydd671972010-10-04 16:33:58 +0200310
Derek Allard2067d1a2008-11-13 22:59:24 +0000311 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200312
Derek Allard2067d1a2008-11-13 22:59:24 +0000313 /**
314 * Database Loader
315 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300316 * @param mixed $params Database configuration options
317 * @param bool $return Whether to return the database object
318 * @param bool $query_builder Whether to enable Query Builder
319 * (overrides the configuration setting)
320 *
321 * @return void|object|bool Database object if $return is set to TRUE,
322 * FALSE on failure, void in any other case
Barry Mienydd671972010-10-04 16:33:58 +0200323 */
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000324 public function database($params = '', $return = FALSE, $query_builder = NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000325 {
326 // Grab the super object
327 $CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200328
Derek Allard2067d1a2008-11-13 22:59:24 +0000329 // Do we even need to load the database class?
Andrey Andreev9d0ab042012-10-24 21:47:39 +0300330 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 +0000331 {
332 return FALSE;
Barry Mienydd671972010-10-04 16:33:58 +0200333 }
334
Greg Aker3a746652011-04-19 10:59:47 -0500335 require_once(BASEPATH.'database/DB.php');
Derek Allard2067d1a2008-11-13 22:59:24 +0000336
337 if ($return === TRUE)
338 {
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000339 return DB($params, $query_builder);
Derek Allard2067d1a2008-11-13 22:59:24 +0000340 }
Barry Mienydd671972010-10-04 16:33:58 +0200341
Andrey Andreevd7297352012-01-07 22:53:14 +0200342 // Initialize the db variable. Needed to prevent
Derek Allard2067d1a2008-11-13 22:59:24 +0000343 // reference errors with some configurations
344 $CI->db = '';
Barry Mienydd671972010-10-04 16:33:58 +0200345
Derek Allard2067d1a2008-11-13 22:59:24 +0000346 // Load the DB class
Jamie Rumbelow7efad202012-02-19 12:37:00 +0000347 $CI->db =& DB($params, $query_builder);
Derek Allard2067d1a2008-11-13 22:59:24 +0000348 }
Barry Mienydd671972010-10-04 16:33:58 +0200349
Derek Allard2067d1a2008-11-13 22:59:24 +0000350 // --------------------------------------------------------------------
351
352 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300353 * Load the Database Utilities Class
Derek Allard2067d1a2008-11-13 22:59:24 +0000354 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300355 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200356 */
Greg Akerf5c84022011-04-19 17:13:03 -0500357 public function dbutil()
Derek Allard2067d1a2008-11-13 22:59:24 +0000358 {
359 if ( ! class_exists('CI_DB'))
360 {
361 $this->database();
362 }
Barry Mienydd671972010-10-04 16:33:58 +0200363
Derek Allard2067d1a2008-11-13 22:59:24 +0000364 $CI =& get_instance();
365
366 // for backwards compatibility, load dbforge so we can extend dbutils off it
367 // this use is deprecated and strongly discouraged
368 $CI->load->dbforge();
Barry Mienydd671972010-10-04 16:33:58 +0200369
Greg Aker3a746652011-04-19 10:59:47 -0500370 require_once(BASEPATH.'database/DB_utility.php');
371 require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility.php');
Derek Allard2067d1a2008-11-13 22:59:24 +0000372 $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
373
Pascal Kriete58560022010-11-10 16:01:20 -0500374 $CI->dbutil = new $class();
Derek Allard2067d1a2008-11-13 22:59:24 +0000375 }
Barry Mienydd671972010-10-04 16:33:58 +0200376
Derek Allard2067d1a2008-11-13 22:59:24 +0000377 // --------------------------------------------------------------------
378
379 /**
380 * Load the Database Forge Class
381 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300382 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200383 */
Greg Akerf5c84022011-04-19 17:13:03 -0500384 public function dbforge()
Derek Allard2067d1a2008-11-13 22:59:24 +0000385 {
386 if ( ! class_exists('CI_DB'))
387 {
388 $this->database();
389 }
Barry Mienydd671972010-10-04 16:33:58 +0200390
Derek Allard2067d1a2008-11-13 22:59:24 +0000391 $CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200392
Greg Aker3a746652011-04-19 10:59:47 -0500393 require_once(BASEPATH.'database/DB_forge.php');
394 require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php');
Andrey Andreeva287a342012-11-05 23:19:59 +0200395
396 if ( ! empty($CI->db->subdriver))
397 {
398 $driver_path = BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/subdrivers/'.$CI->db->dbdriver.'_'.$CI->db->subdriver.'_forge.php';
399 if (file_exists($driver_path))
400 {
401 require_once($driver_path);
402 $class = 'CI_DB_'.$CI->db->dbdriver.'_'.$CI->db->subdriver.'_forge';
403 }
404 }
405 else
406 {
407 $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
408 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000409
410 $CI->dbforge = new $class();
Derek Allard2067d1a2008-11-13 22:59:24 +0000411 }
Barry Mienydd671972010-10-04 16:33:58 +0200412
Derek Allard2067d1a2008-11-13 22:59:24 +0000413 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200414
Derek Allard2067d1a2008-11-13 22:59:24 +0000415 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300416 * View Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000417 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300418 * Loads "view" files.
Derek Allard2067d1a2008-11-13 22:59:24 +0000419 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300420 * @param string $view View name
421 * @param array $vars An associative array of data
422 * to be extracted for use in the view
423 * @param bool $return Whether to return the view output
424 * or leave it to the Output class
Derek Allard2067d1a2008-11-13 22:59:24 +0000425 * @return void
426 */
Greg Akerf5c84022011-04-19 17:13:03 -0500427 public function view($view, $vars = array(), $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000428 {
429 return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
430 }
Barry Mienydd671972010-10-04 16:33:58 +0200431
Derek Allard2067d1a2008-11-13 22:59:24 +0000432 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200433
Derek Allard2067d1a2008-11-13 22:59:24 +0000434 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300435 * Generic File Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000436 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300437 * @param string $path File path
438 * @param bool $return Whether to return the file output
439 * @return void|string
Derek Allard2067d1a2008-11-13 22:59:24 +0000440 */
Greg Akerf5c84022011-04-19 17:13:03 -0500441 public function file($path, $return = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000442 {
443 return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
444 }
Barry Mienydd671972010-10-04 16:33:58 +0200445
Derek Allard2067d1a2008-11-13 22:59:24 +0000446 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200447
Derek Allard2067d1a2008-11-13 22:59:24 +0000448 /**
449 * Set Variables
450 *
451 * Once variables are set they become available within
452 * the controller class and its "view" files.
453 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300454 * @param array|object|string $vars
455 * An associative array or object containing values
456 * to be set, or a value's name if string
457 * @param string $val Value to set, only used if $vars is a string
Derek Allard2067d1a2008-11-13 22:59:24 +0000458 * @return void
459 */
Greg Akerf5c84022011-04-19 17:13:03 -0500460 public function vars($vars = array(), $val = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000461 {
Alex Bilbieed944a32012-06-02 11:07:47 +0100462 if ($val !== '' && is_string($vars))
Derek Allard2067d1a2008-11-13 22:59:24 +0000463 {
464 $vars = array($vars => $val);
465 }
Barry Mienydd671972010-10-04 16:33:58 +0200466
Derek Allard2067d1a2008-11-13 22:59:24 +0000467 $vars = $this->_ci_object_to_array($vars);
Barry Mienydd671972010-10-04 16:33:58 +0200468
Andrey Andreev94af3552012-03-26 23:10:42 +0300469 if (is_array($vars) && count($vars) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000470 {
471 foreach ($vars as $key => $val)
472 {
473 $this->_ci_cached_vars[$key] = $val;
474 }
475 }
476 }
Barry Mienydd671972010-10-04 16:33:58 +0200477
Derek Allard2067d1a2008-11-13 22:59:24 +0000478 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200479
Derek Allard2067d1a2008-11-13 22:59:24 +0000480 /**
Phil Sturgeon8731f642011-07-22 16:11:34 -0600481 * Get Variable
482 *
483 * Check if a variable is set and retrieve it.
484 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300485 * @param string $key Variable name
486 * @return mixed The variable or NULL if not found
Phil Sturgeon8731f642011-07-22 16:11:34 -0600487 */
488 public function get_var($key)
489 {
490 return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL;
491 }
492
493 // --------------------------------------------------------------------
494
495 /**
Shane Pearson81dd2232011-11-18 20:49:35 -0600496 * Get Variables
497 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300498 * Retrieves all loaded variables.
Shane Pearson81dd2232011-11-18 20:49:35 -0600499 *
500 * @return array
501 */
502 public function get_vars()
503 {
504 return $this->_ci_cached_vars;
505 }
506
507 // --------------------------------------------------------------------
508
509 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300510 * Helper Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000511 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300512 * @param string|string[] $helpers Helper name(s)
Derek Allard2067d1a2008-11-13 22:59:24 +0000513 * @return void
514 */
Greg Akerf5c84022011-04-19 17:13:03 -0500515 public function helper($helpers = array())
Barry Mienydd671972010-10-04 16:33:58 +0200516 {
Derek Jones32bf1862010-03-02 13:46:07 -0600517 foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)
Barry Mienydd671972010-10-04 16:33:58 +0200518 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000519 if (isset($this->_ci_helpers[$helper]))
520 {
521 continue;
522 }
Derek Jones32bf1862010-03-02 13:46:07 -0600523
Greg Aker3a746652011-04-19 10:59:47 -0500524 $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php';
Derek Allard2067d1a2008-11-13 22:59:24 +0000525
Barry Mienydd671972010-10-04 16:33:58 +0200526 // Is this a helper extension request?
Derek Allard2067d1a2008-11-13 22:59:24 +0000527 if (file_exists($ext_helper))
528 {
Greg Aker3a746652011-04-19 10:59:47 -0500529 $base_helper = BASEPATH.'helpers/'.$helper.'.php';
Barry Mienydd671972010-10-04 16:33:58 +0200530
Derek Allard2067d1a2008-11-13 22:59:24 +0000531 if ( ! file_exists($base_helper))
532 {
Greg Aker3a746652011-04-19 10:59:47 -0500533 show_error('Unable to load the requested file: helpers/'.$helper.'.php');
Derek Allard2067d1a2008-11-13 22:59:24 +0000534 }
Barry Mienydd671972010-10-04 16:33:58 +0200535
Derek Allard2067d1a2008-11-13 22:59:24 +0000536 include_once($ext_helper);
537 include_once($base_helper);
Barry Mienydd671972010-10-04 16:33:58 +0200538
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
Derek Jones32bf1862010-03-02 13:46:07 -0600544 // Try to load the helper
545 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
Derek Jonesd5e0cb52010-03-09 20:20:46 -0600654 // We can save the loader some time since Drivers will *always* be in a subfolder,
655 // and typically identically named to the library
656 if ( ! strpos($library, '/'))
657 {
Greg Akerd25e66a2010-03-28 01:07:09 -0500658 $library = ucfirst($library).'/'.$library;
Derek Jones8dca0412010-03-05 13:01:44 -0600659 }
Barry Mienydd671972010-10-04 16:33:58 +0200660
Derek Jones8dca0412010-03-05 13:01:44 -0600661 return $this->library($library, $params, $object_name);
662 }
663
664 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200665
Derek Jones8dca0412010-03-05 13:01:44 -0600666 /**
Derek Jones32bf1862010-03-02 13:46:07 -0600667 * Add Package Path
Derek Allard2067d1a2008-11-13 22:59:24 +0000668 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300669 * Prepends a parent path to the library, model, helper and config
670 * path arrays.
Derek Allard2067d1a2008-11-13 22:59:24 +0000671 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300672 * @see CI_Loader::$_ci_library_paths
673 * @see CI_Loader::$_ci_model_paths
674 * @see CI_Loader::$_ci_helper_paths
675 * @see CI_Config::$_config_paths
676 *
677 * @param string $path Path to add
678 * @param bool $view_cascade (default: TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000679 * @return void
Derek Jones32bf1862010-03-02 13:46:07 -0600680 */
Andrey Andreevcce91802012-06-12 13:25:31 +0300681 public function add_package_path($path, $view_cascade = TRUE)
Derek Jones32bf1862010-03-02 13:46:07 -0600682 {
Pascal Kriete6b6c2742010-11-09 13:12:22 -0500683 $path = rtrim($path, '/').'/';
David Behlercda768a2011-08-14 23:52:48 +0200684
Derek Jones32bf1862010-03-02 13:46:07 -0600685 array_unshift($this->_ci_library_paths, $path);
686 array_unshift($this->_ci_model_paths, $path);
687 array_unshift($this->_ci_helper_paths, $path);
Barry Mienydd671972010-10-04 16:33:58 +0200688
Greg Akerf5c84022011-04-19 17:13:03 -0500689 $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
690
Derek Jones32bf1862010-03-02 13:46:07 -0600691 // Add config file path
692 $config =& $this->_ci_get_component('config');
Korri3684d342012-04-17 00:35:08 -0400693 array_push($config->_config_paths, $path);
Derek Allard2067d1a2008-11-13 22:59:24 +0000694 }
695
696 // --------------------------------------------------------------------
Derek Jones32bf1862010-03-02 13:46:07 -0600697
698 /**
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000699 * Get Package Paths
700 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300701 * Return a list of all package paths.
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000702 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300703 * @param bool $include_base Whether to include BASEPATH (default: TRUE)
704 * @return array
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000705 */
Greg Akerf5c84022011-04-19 17:13:03 -0500706 public function get_package_paths($include_base = FALSE)
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000707 {
Andrey Andreev5fd3ae82012-10-24 14:55:35 +0300708 return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths;
Phil Sturgeonde3dbc32010-12-27 17:41:02 +0000709 }
710
711 // --------------------------------------------------------------------
712
713 /**
Derek Jones32bf1862010-03-02 13:46:07 -0600714 * Remove Package Path
715 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300716 * Remove a path from the library, model, helper and/or config
717 * path arrays if it exists. If no path is provided, the most recently
718 * added path will be removed removed.
Derek Jones32bf1862010-03-02 13:46:07 -0600719 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300720 * @param string $path Path to remove
Andrey Andreev94af3552012-03-26 23:10:42 +0300721 * @return void
Derek Jones32bf1862010-03-02 13:46:07 -0600722 */
Andrey Andreeved4b2582012-10-27 17:46:52 +0300723 public function remove_package_path($path = '')
Derek Jones32bf1862010-03-02 13:46:07 -0600724 {
725 $config =& $this->_ci_get_component('config');
Barry Mienydd671972010-10-04 16:33:58 +0200726
Alex Bilbieed944a32012-06-02 11:07:47 +0100727 if ($path === '')
Derek Jones32bf1862010-03-02 13:46:07 -0600728 {
Andrey Andreevd7297352012-01-07 22:53:14 +0200729 array_shift($this->_ci_library_paths);
730 array_shift($this->_ci_model_paths);
731 array_shift($this->_ci_helper_paths);
732 array_shift($this->_ci_view_paths);
Korri3684d342012-04-17 00:35:08 -0400733 array_pop($config->_config_paths);
Derek Jones32bf1862010-03-02 13:46:07 -0600734 }
735 else
736 {
Pascal Kriete6b6c2742010-11-09 13:12:22 -0500737 $path = rtrim($path, '/').'/';
Derek Jones32bf1862010-03-02 13:46:07 -0600738 foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
739 {
740 if (($key = array_search($path, $this->{$var})) !== FALSE)
741 {
742 unset($this->{$var}[$key]);
743 }
744 }
David Behlercda768a2011-08-14 23:52:48 +0200745
Greg Akerf5c84022011-04-19 17:13:03 -0500746 if (isset($this->_ci_view_paths[$path.'views/']))
747 {
748 unset($this->_ci_view_paths[$path.'views/']);
749 }
Barry Mienydd671972010-10-04 16:33:58 +0200750
Derek Jones32bf1862010-03-02 13:46:07 -0600751 if (($key = array_search($path, $config->_config_paths)) !== FALSE)
752 {
753 unset($config->_config_paths[$key]);
754 }
755 }
Barry Mienydd671972010-10-04 16:33:58 +0200756
Derek Jones32bf1862010-03-02 13:46:07 -0600757 // make sure the application default paths are still in the array
758 $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
759 $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
760 $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
Greg Akerf5c84022011-04-19 17:13:03 -0500761 $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
Derek Jones32bf1862010-03-02 13:46:07 -0600762 $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
763 }
764
765 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200766
Derek Allard2067d1a2008-11-13 22:59:24 +0000767 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300768 * Internal CI Data Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000769 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300770 * Used to load views and files.
771 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000772 * Variables are prefixed with _ci_ to avoid symbol collision with
Andrey Andreeved4b2582012-10-27 17:46:52 +0300773 * variables made available to view files.
Derek Allard2067d1a2008-11-13 22:59:24 +0000774 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300775 * @used-by CI_Loader::view()
776 * @used-by CI_Loader::file()
777 * @param array $_ci_data Data to load
Derek Allard2067d1a2008-11-13 22:59:24 +0000778 * @return void
779 */
Greg Akerf5c84022011-04-19 17:13:03 -0500780 protected function _ci_load($_ci_data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000781 {
782 // Set the default data variables
783 foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
784 {
Andrey Andreev94af3552012-03-26 23:10:42 +0300785 $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000786 }
David Behlercda768a2011-08-14 23:52:48 +0200787
Greg Akerf5c84022011-04-19 17:13:03 -0500788 $file_exists = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000789
790 // Set the path to the requested file
Alex Bilbie40bd2a72012-06-02 16:04:15 +0100791 if (is_string($_ci_path) && $_ci_path !== '')
Greg Aker8807be32011-04-21 13:06:15 -0500792 {
793 $_ci_x = explode('/', $_ci_path);
794 $_ci_file = end($_ci_x);
795 }
796 else
Derek Allard2067d1a2008-11-13 22:59:24 +0000797 {
798 $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
Alex Bilbieed944a32012-06-02 11:07:47 +0100799 $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view;
Greg Akerf5c84022011-04-19 17:13:03 -0500800
Joe McFrederick64f470b2012-08-18 12:29:56 -0400801 foreach ($this->_ci_view_paths as $_ci_view_file => $cascade)
Greg Akerf5c84022011-04-19 17:13:03 -0500802 {
Joe McFrederick64f470b2012-08-18 12:29:56 -0400803 if (file_exists($_ci_view_file.$_ci_file))
Greg Akerf5c84022011-04-19 17:13:03 -0500804 {
Joe McFrederick64f470b2012-08-18 12:29:56 -0400805 $_ci_path = $_ci_view_file.$_ci_file;
Greg Akerf5c84022011-04-19 17:13:03 -0500806 $file_exists = TRUE;
807 break;
808 }
David Behlercda768a2011-08-14 23:52:48 +0200809
Greg Akerf5c84022011-04-19 17:13:03 -0500810 if ( ! $cascade)
811 {
812 break;
David Behlercda768a2011-08-14 23:52:48 +0200813 }
Greg Akerf5c84022011-04-19 17:13:03 -0500814 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000815 }
Barry Mienydd671972010-10-04 16:33:58 +0200816
Greg Akerf5c84022011-04-19 17:13:03 -0500817 if ( ! $file_exists && ! file_exists($_ci_path))
Derek Allard2067d1a2008-11-13 22:59:24 +0000818 {
819 show_error('Unable to load the requested file: '.$_ci_file);
820 }
Barry Mienydd671972010-10-04 16:33:58 +0200821
Derek Allard2067d1a2008-11-13 22:59:24 +0000822 // This allows anything loaded using $this->load (views, files, etc.)
823 // to become accessible from within the Controller and Model functions.
Pascal Kriete89ace432010-11-10 15:49:10 -0500824 $_ci_CI =& get_instance();
825 foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
Derek Allard2067d1a2008-11-13 22:59:24 +0000826 {
Pascal Kriete89ace432010-11-10 15:49:10 -0500827 if ( ! isset($this->$_ci_key))
Derek Allard2067d1a2008-11-13 22:59:24 +0000828 {
Pascal Kriete89ace432010-11-10 15:49:10 -0500829 $this->$_ci_key =& $_ci_CI->$_ci_key;
Derek Allard2067d1a2008-11-13 22:59:24 +0000830 }
831 }
832
833 /*
834 * Extract and cache variables
835 *
vlakoff02506182012-07-03 07:28:50 +0200836 * You can either set variables using the dedicated $this->load->vars()
Derek Allard2067d1a2008-11-13 22:59:24 +0000837 * function or via the second parameter of this function. We'll merge
838 * the two types and cache them so that views that are embedded within
839 * other views can have access to these variables.
Barry Mienydd671972010-10-04 16:33:58 +0200840 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000841 if (is_array($_ci_vars))
842 {
843 $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
844 }
845 extract($this->_ci_cached_vars);
Barry Mienydd671972010-10-04 16:33:58 +0200846
Derek Allard2067d1a2008-11-13 22:59:24 +0000847 /*
848 * Buffer the output
849 *
850 * We buffer the output for two reasons:
851 * 1. Speed. You get a significant speed boost.
Andrey Andreevd7297352012-01-07 22:53:14 +0200852 * 2. So that the final rendered template can be post-processed by
dchill425628ba02012-08-08 12:05:45 -0400853 * the output class. Why do we need post processing? For one thing,
854 * in order to show the elapsed page load time. Unless we can
855 * intercept the content right before it's sent to the browser and
856 * then stop the timer it won't be accurate.
Derek Allard2067d1a2008-11-13 22:59:24 +0000857 */
858 ob_start();
Barry Mienydd671972010-10-04 16:33:58 +0200859
Derek Allard2067d1a2008-11-13 22:59:24 +0000860 // If the PHP installation does not support short tags we'll
861 // do a little string replacement, changing the short tags
862 // to standard PHP echo statements.
Alex Bilbieed944a32012-06-02 11:07:47 +0100863 if ( ! is_php('5.4') && (bool) @ini_get('short_open_tag') === FALSE && config_item('rewrite_short_tags') === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000864 {
Andrey Andreevd47baab2012-01-09 16:56:46 +0200865 echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
Derek Allard2067d1a2008-11-13 22:59:24 +0000866 }
867 else
868 {
869 include($_ci_path); // include() vs include_once() allows for multiple views with the same name
870 }
Barry Mienydd671972010-10-04 16:33:58 +0200871
Derek Allard2067d1a2008-11-13 22:59:24 +0000872 log_message('debug', 'File loaded: '.$_ci_path);
Barry Mienydd671972010-10-04 16:33:58 +0200873
Derek Allard2067d1a2008-11-13 22:59:24 +0000874 // Return the file data if requested
875 if ($_ci_return === TRUE)
Barry Mienydd671972010-10-04 16:33:58 +0200876 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000877 $buffer = ob_get_contents();
878 @ob_end_clean();
879 return $buffer;
880 }
881
882 /*
883 * Flush the buffer... or buff the flusher?
884 *
885 * In order to permit views to be nested within
886 * other views, we need to flush the content back out whenever
887 * we are beyond the first level of output buffering so that
888 * it can be seen and included properly by the first included
889 * template and any subsequent ones. Oy!
Barry Mienydd671972010-10-04 16:33:58 +0200890 */
Derek Allard2067d1a2008-11-13 22:59:24 +0000891 if (ob_get_level() > $this->_ci_ob_level + 1)
892 {
893 ob_end_flush();
894 }
895 else
896 {
Greg Aker22f1a632010-11-10 15:34:35 -0600897 $_ci_CI->output->append_output(ob_get_contents());
Derek Allard2067d1a2008-11-13 22:59:24 +0000898 @ob_end_clean();
899 }
900 }
901
902 // --------------------------------------------------------------------
903
904 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +0300905 * Internal CI Class Loader
Derek Allard2067d1a2008-11-13 22:59:24 +0000906 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300907 * @used-by CI_Loader::library()
908 * @uses CI_Loader::_ci_init_class()
Derek Allard2067d1a2008-11-13 22:59:24 +0000909 *
Andrey Andreeved4b2582012-10-27 17:46:52 +0300910 * @param string $class Class name to load
911 * @param mixed $params Optional parameters to pass to the class constructor
912 * @param string $object_name Optional object name to assign to
Barry Mienydd671972010-10-04 16:33:58 +0200913 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000914 */
Greg Akerf5c84022011-04-19 17:13:03 -0500915 protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
Barry Mienydd671972010-10-04 16:33:58 +0200916 {
917 // Get the class name, and while we're at it trim any slashes.
918 // The directory path can be included as part of the class name,
Derek Allard2067d1a2008-11-13 22:59:24 +0000919 // but we don't want a leading slash
Greg Aker3a746652011-04-19 10:59:47 -0500920 $class = str_replace('.php', '', trim($class, '/'));
Barry Mienydd671972010-10-04 16:33:58 +0200921
Derek Allard2067d1a2008-11-13 22:59:24 +0000922 // Was the path included with the class name?
923 // We look for a slash to determine this
924 $subdir = '';
Derek Jones32bf1862010-03-02 13:46:07 -0600925 if (($last_slash = strrpos($class, '/')) !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000926 {
Derek Jones32bf1862010-03-02 13:46:07 -0600927 // Extract the path
Andrey Andreevd7297352012-01-07 22:53:14 +0200928 $subdir = substr($class, 0, ++$last_slash);
Barry Mienydd671972010-10-04 16:33:58 +0200929
Derek Jones32bf1862010-03-02 13:46:07 -0600930 // Get the filename from the path
Andrey Andreevd7297352012-01-07 22:53:14 +0200931 $class = substr($class, $last_slash);
dchill425628ba02012-08-08 12:05:45 -0400932
933 // Check for match and driver base class
dchill42aee92652012-08-26 21:45:35 -0400934 if (strtolower(trim($subdir, '/')) == strtolower($class) && ! class_exists('CI_Driver_Library'))
dchill425628ba02012-08-08 12:05:45 -0400935 {
936 // We aren't instantiating an object here, just making the base class available
937 require BASEPATH.'libraries/Driver.php';
938 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000939 }
940
941 // We'll test for both lowercase and capitalized versions of the file name
942 foreach (array(ucfirst($class), strtolower($class)) as $class)
943 {
Greg Aker3a746652011-04-19 10:59:47 -0500944 $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';
Derek Allard2067d1a2008-11-13 22:59:24 +0000945
Barry Mienydd671972010-10-04 16:33:58 +0200946 // Is this a class extension request?
Derek Allard2067d1a2008-11-13 22:59:24 +0000947 if (file_exists($subclass))
948 {
Greg Aker3a746652011-04-19 10:59:47 -0500949 $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php';
Barry Mienydd671972010-10-04 16:33:58 +0200950
Derek Allard2067d1a2008-11-13 22:59:24 +0000951 if ( ! file_exists($baseclass))
952 {
Andrey Andreevd7297352012-01-07 22:53:14 +0200953 log_message('error', 'Unable to load the requested class: '.$class);
954 show_error('Unable to load the requested class: '.$class);
Derek Allard2067d1a2008-11-13 22:59:24 +0000955 }
956
Andrey Andreevd7297352012-01-07 22:53:14 +0200957 // Safety: Was the class already loaded by a previous call?
Derek Allard2067d1a2008-11-13 22:59:24 +0000958 if (in_array($subclass, $this->_ci_loaded_files))
959 {
960 // Before we deem this to be a duplicate request, let's see
Andrey Andreevd7297352012-01-07 22:53:14 +0200961 // if a custom object name is being supplied. If so, we'll
Derek Allard2067d1a2008-11-13 22:59:24 +0000962 // return a new instance of the object
963 if ( ! is_null($object_name))
964 {
965 $CI =& get_instance();
966 if ( ! isset($CI->$object_name))
967 {
Barry Mienydd671972010-10-04 16:33:58 +0200968 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000969 }
970 }
Barry Mienydd671972010-10-04 16:33:58 +0200971
Derek Allard2067d1a2008-11-13 22:59:24 +0000972 $is_duplicate = TRUE;
Andrey Andreevd7297352012-01-07 22:53:14 +0200973 log_message('debug', $class.' class already loaded. Second attempt ignored.');
Derek Allard2067d1a2008-11-13 22:59:24 +0000974 return;
975 }
Barry Mienydd671972010-10-04 16:33:58 +0200976
977 include_once($baseclass);
Derek Allard2067d1a2008-11-13 22:59:24 +0000978 include_once($subclass);
979 $this->_ci_loaded_files[] = $subclass;
Barry Mienydd671972010-10-04 16:33:58 +0200980
981 return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +0000982 }
Barry Mienydd671972010-10-04 16:33:58 +0200983
Derek Allard2067d1a2008-11-13 22:59:24 +0000984 // Lets search for the requested library file and load it.
Derek Jones32bf1862010-03-02 13:46:07 -0600985 $is_duplicate = FALSE;
986 foreach ($this->_ci_library_paths as $path)
Derek Allard2067d1a2008-11-13 22:59:24 +0000987 {
Greg Aker3a746652011-04-19 10:59:47 -0500988 $filepath = $path.'libraries/'.$subdir.$class.'.php';
Derek Jones32bf1862010-03-02 13:46:07 -0600989
Andrey Andreevd7297352012-01-07 22:53:14 +0200990 // Does the file exist? No? Bummer...
Derek Allard2067d1a2008-11-13 22:59:24 +0000991 if ( ! file_exists($filepath))
992 {
993 continue;
994 }
Barry Mienydd671972010-10-04 16:33:58 +0200995
Andrey Andreevd7297352012-01-07 22:53:14 +0200996 // Safety: Was the class already loaded by a previous call?
Derek Allard2067d1a2008-11-13 22:59:24 +0000997 if (in_array($filepath, $this->_ci_loaded_files))
998 {
999 // Before we deem this to be a duplicate request, let's see
Andrey Andreevd7297352012-01-07 22:53:14 +02001000 // if a custom object name is being supplied. If so, we'll
Derek Allard2067d1a2008-11-13 22:59:24 +00001001 // return a new instance of the object
1002 if ( ! is_null($object_name))
1003 {
1004 $CI =& get_instance();
1005 if ( ! isset($CI->$object_name))
1006 {
1007 return $this->_ci_init_class($class, '', $params, $object_name);
1008 }
1009 }
Barry Mienydd671972010-10-04 16:33:58 +02001010
Derek Allard2067d1a2008-11-13 22:59:24 +00001011 $is_duplicate = TRUE;
Andrey Andreevd7297352012-01-07 22:53:14 +02001012 log_message('debug', $class.' class already loaded. Second attempt ignored.');
Derek Allard2067d1a2008-11-13 22:59:24 +00001013 return;
1014 }
Barry Mienydd671972010-10-04 16:33:58 +02001015
Derek Allard2067d1a2008-11-13 22:59:24 +00001016 include_once($filepath);
1017 $this->_ci_loaded_files[] = $filepath;
Barry Mienydd671972010-10-04 16:33:58 +02001018 return $this->_ci_init_class($class, '', $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +00001019 }
1020 } // END FOREACH
1021
Andrey Andreevd7297352012-01-07 22:53:14 +02001022 // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?
Alex Bilbieed944a32012-06-02 11:07:47 +01001023 if ($subdir === '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001024 {
1025 $path = strtolower($class).'/'.$class;
dchill420fc3be52012-08-27 20:54:23 -04001026 return $this->_ci_load_class($path, $params, $object_name);
Derek Allard2067d1a2008-11-13 22:59:24 +00001027 }
Andrey Andreev5fd3ae82012-10-24 14:55:35 +03001028 elseif (ucfirst($subdir) != $subdir)
dchill42aee92652012-08-26 21:45:35 -04001029 {
1030 // Lowercase subdir failed - retry capitalized
1031 $path = ucfirst($subdir).$class;
dchill420fc3be52012-08-27 20:54:23 -04001032 return $this->_ci_load_class($path, $params, $object_name);
dchill42aee92652012-08-26 21:45:35 -04001033 }
Barry Mienydd671972010-10-04 16:33:58 +02001034
Derek Allard2067d1a2008-11-13 22:59:24 +00001035 // If we got this far we were unable to find the requested class.
1036 // We do not issue errors if the load call failed due to a duplicate request
Alex Bilbieed944a32012-06-02 11:07:47 +01001037 if ($is_duplicate === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +00001038 {
Andrey Andreevd7297352012-01-07 22:53:14 +02001039 log_message('error', 'Unable to load the requested class: '.$class);
1040 show_error('Unable to load the requested class: '.$class);
Derek Allard2067d1a2008-11-13 22:59:24 +00001041 }
1042 }
Barry Mienydd671972010-10-04 16:33:58 +02001043
Derek Allard2067d1a2008-11-13 22:59:24 +00001044 // --------------------------------------------------------------------
1045
1046 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001047 * Internal CI Class Instantiator
Derek Allard2067d1a2008-11-13 22:59:24 +00001048 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001049 * @used-by CI_Loader::_ci_load_class()
1050 *
1051 * @param string $class Class name
1052 * @param string $prefix Class name prefix
1053 * @param array|null|bool $config Optional configuration to pass to the class constructor:
1054 * FALSE to skip;
1055 * NULL to search in config paths;
1056 * array containing configuration data
1057 * @param string $object_name Optional object name to assign to
Andrey Andreev94af3552012-03-26 23:10:42 +03001058 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +00001059 */
Greg Aker0c9ee4a2011-04-20 09:40:17 -05001060 protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
Barry Mienydd671972010-10-04 16:33:58 +02001061 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001062 // Is there an associated config file for this class? Note: these should always be lowercase
Derek Allard2067d1a2008-11-13 22:59:24 +00001063 if ($config === NULL)
1064 {
Eric Barnes5e16ec62011-01-04 17:25:23 -05001065 // Fetch the config paths containing any package paths
1066 $config_component = $this->_ci_get_component('config');
1067
1068 if (is_array($config_component->_config_paths))
Derek Allard2067d1a2008-11-13 22:59:24 +00001069 {
Eric Barnes5e16ec62011-01-04 17:25:23 -05001070 // Break on the first found file, thus package files
1071 // are not overridden by default paths
1072 foreach ($config_component->_config_paths as $path)
1073 {
1074 // We test for both uppercase and lowercase, for servers that
joelcox1bfd9fa2011-01-16 18:49:39 +01001075 // are case-sensitive with regard to file names. Check for environment
1076 // first, global next
Andrey Andreev94af3552012-03-26 23:10:42 +03001077 if (defined('ENVIRONMENT') && file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'))
joelcox1bfd9fa2011-01-16 18:49:39 +01001078 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001079 include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php');
joelcox1bfd9fa2011-01-16 18:49:39 +01001080 break;
1081 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001082 elseif (defined('ENVIRONMENT') && file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'))
joelcox1bfd9fa2011-01-16 18:49:39 +01001083 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001084 include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php');
joelcox1bfd9fa2011-01-16 18:49:39 +01001085 break;
1086 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001087 elseif (file_exists($path.'config/'.strtolower($class).'.php'))
Eric Barnes5e16ec62011-01-04 17:25:23 -05001088 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001089 include($path.'config/'.strtolower($class).'.php');
Eric Barnes5e16ec62011-01-04 17:25:23 -05001090 break;
1091 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001092 elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php'))
Eric Barnes5e16ec62011-01-04 17:25:23 -05001093 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001094 include($path.'config/'.ucfirst(strtolower($class)).'.php');
Eric Barnes5e16ec62011-01-04 17:25:23 -05001095 break;
1096 }
1097 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001098 }
1099 }
Barry Mienydd671972010-10-04 16:33:58 +02001100
Alex Bilbieed944a32012-06-02 11:07:47 +01001101 if ($prefix === '')
Barry Mienydd671972010-10-04 16:33:58 +02001102 {
1103 if (class_exists('CI_'.$class))
Derek Allard2067d1a2008-11-13 22:59:24 +00001104 {
1105 $name = 'CI_'.$class;
1106 }
Barry Mienydd671972010-10-04 16:33:58 +02001107 elseif (class_exists(config_item('subclass_prefix').$class))
Derek Allard2067d1a2008-11-13 22:59:24 +00001108 {
1109 $name = config_item('subclass_prefix').$class;
1110 }
1111 else
1112 {
1113 $name = $class;
1114 }
1115 }
1116 else
1117 {
1118 $name = $prefix.$class;
1119 }
Barry Mienydd671972010-10-04 16:33:58 +02001120
Derek Allard2067d1a2008-11-13 22:59:24 +00001121 // Is the class name valid?
1122 if ( ! class_exists($name))
1123 {
Andrey Andreevd7297352012-01-07 22:53:14 +02001124 log_message('error', 'Non-existent class: '.$name);
jonnueee2df62012-07-16 13:06:16 +01001125 show_error('Non-existent class: '.$name);
Derek Allard2067d1a2008-11-13 22:59:24 +00001126 }
Barry Mienydd671972010-10-04 16:33:58 +02001127
Derek Allard2067d1a2008-11-13 22:59:24 +00001128 // Set the variable name we will assign the class to
Andrey Andreevd7297352012-01-07 22:53:14 +02001129 // Was a custom class name supplied? If so we'll use it
Derek Allard2067d1a2008-11-13 22:59:24 +00001130 $class = strtolower($class);
Barry Mienydd671972010-10-04 16:33:58 +02001131
Derek Allard2067d1a2008-11-13 22:59:24 +00001132 if (is_null($object_name))
1133 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001134 $classvar = isset($this->_ci_varmap[$class]) ? $this->_ci_varmap[$class] : $class;
Derek Allard2067d1a2008-11-13 22:59:24 +00001135 }
1136 else
1137 {
1138 $classvar = $object_name;
1139 }
1140
Barry Mienydd671972010-10-04 16:33:58 +02001141 // Save the class name and object name
Derek Allard2067d1a2008-11-13 22:59:24 +00001142 $this->_ci_classes[$class] = $classvar;
1143
Barry Mienydd671972010-10-04 16:33:58 +02001144 // Instantiate the class
Derek Allard2067d1a2008-11-13 22:59:24 +00001145 $CI =& get_instance();
1146 if ($config !== NULL)
1147 {
1148 $CI->$classvar = new $name($config);
1149 }
1150 else
Barry Mienydd671972010-10-04 16:33:58 +02001151 {
Andrey Andreeva11b16b2012-03-28 12:22:04 +03001152 $CI->$classvar = new $name();
Barry Mienydd671972010-10-04 16:33:58 +02001153 }
1154 }
1155
Derek Allard2067d1a2008-11-13 22:59:24 +00001156 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001157
Derek Allard2067d1a2008-11-13 22:59:24 +00001158 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001159 * CI Autoloader
Derek Allard2067d1a2008-11-13 22:59:24 +00001160 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001161 * Loads component listed in the config/autoload.php file.
Derek Allard2067d1a2008-11-13 22:59:24 +00001162 *
Andrey Andreevcdac2482012-11-03 18:09:01 +02001163 * @used-by CI_Loader::initialize()
Derek Allard2067d1a2008-11-13 22:59:24 +00001164 * @return void
1165 */
Shane Pearson665baec2011-08-22 18:52:19 -05001166 protected function _ci_autoloader()
Barry Mienydd671972010-10-04 16:33:58 +02001167 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001168 if (defined('ENVIRONMENT') && file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
bubbafoley0ea04142011-03-17 14:55:41 -05001169 {
Shane Pearson6adfe632011-08-10 16:42:53 -05001170 include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
bubbafoley0ea04142011-03-17 14:55:41 -05001171 }
1172 else
1173 {
Shane Pearson6adfe632011-08-10 16:42:53 -05001174 include(APPPATH.'config/autoload.php');
bubbafoley0ea04142011-03-17 14:55:41 -05001175 }
Barry Mienydd671972010-10-04 16:33:58 +02001176
Derek Allard2067d1a2008-11-13 22:59:24 +00001177 if ( ! isset($autoload))
1178 {
1179 return FALSE;
1180 }
Barry Mienydd671972010-10-04 16:33:58 +02001181
Phil Sturgeon9730c752010-12-15 10:50:15 +00001182 // Autoload packages
1183 if (isset($autoload['packages']))
1184 {
1185 foreach ($autoload['packages'] as $package_path)
1186 {
1187 $this->add_package_path($package_path);
1188 }
1189 }
1190
Derek Allard2067d1a2008-11-13 22:59:24 +00001191 // Load any custom config file
1192 if (count($autoload['config']) > 0)
Barry Mienydd671972010-10-04 16:33:58 +02001193 {
Derek Allard2067d1a2008-11-13 22:59:24 +00001194 $CI =& get_instance();
1195 foreach ($autoload['config'] as $key => $val)
1196 {
1197 $CI->config->load($val);
1198 }
Barry Mienydd671972010-10-04 16:33:58 +02001199 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001200
Derek Jonesc6da5032010-03-09 20:44:27 -06001201 // Autoload helpers and languages
1202 foreach (array('helper', 'language') as $type)
Barry Mienydd671972010-10-04 16:33:58 +02001203 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001204 if (isset($autoload[$type]) && count($autoload[$type]) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +00001205 {
1206 $this->$type($autoload[$type]);
Barry Mienydd671972010-10-04 16:33:58 +02001207 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001208 }
1209
Derek Allard2067d1a2008-11-13 22:59:24 +00001210 // Load libraries
Andrey Andreev94af3552012-03-26 23:10:42 +03001211 if (isset($autoload['libraries']) && count($autoload['libraries']) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +00001212 {
1213 // Load the database driver.
1214 if (in_array('database', $autoload['libraries']))
1215 {
1216 $this->database();
1217 $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
1218 }
Barry Mienydd671972010-10-04 16:33:58 +02001219
Derek Allard2067d1a2008-11-13 22:59:24 +00001220 // Load all other libraries
1221 foreach ($autoload['libraries'] as $item)
1222 {
1223 $this->library($item);
1224 }
Barry Mienydd671972010-10-04 16:33:58 +02001225 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001226
Darren Hillc4e266b2011-08-30 15:40:27 -04001227 // Autoload drivers
1228 if (isset($autoload['drivers']))
1229 {
Darren Hillca3be1d2011-08-31 08:31:18 -04001230 foreach ($autoload['drivers'] as $item)
1231 {
1232 $this->driver($item);
1233 }
Darren Hillc4e266b2011-08-30 15:40:27 -04001234 }
1235
Derek Allard2067d1a2008-11-13 22:59:24 +00001236 // Autoload models
1237 if (isset($autoload['model']))
1238 {
1239 $this->model($autoload['model']);
1240 }
Barry Mienydd671972010-10-04 16:33:58 +02001241 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001242
1243 // --------------------------------------------------------------------
1244
1245 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001246 * CI Object to Array translator
Derek Allard2067d1a2008-11-13 22:59:24 +00001247 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001248 * Takes an object as input and converts the class variables to
1249 * an associative array with key/value pairs.
Derek Allard2067d1a2008-11-13 22:59:24 +00001250 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001251 * @param object $object Object data to translate
Derek Allard2067d1a2008-11-13 22:59:24 +00001252 * @return array
1253 */
Greg Akerf5c84022011-04-19 17:13:03 -05001254 protected function _ci_object_to_array($object)
Derek Allard2067d1a2008-11-13 22:59:24 +00001255 {
Andrey Andreev94af3552012-03-26 23:10:42 +03001256 return is_object($object) ? get_object_vars($object) : $object;
Derek Allard2067d1a2008-11-13 22:59:24 +00001257 }
1258
1259 // --------------------------------------------------------------------
1260
1261 /**
Andrey Andreeved4b2582012-10-27 17:46:52 +03001262 * CI Component getter
Derek Jones32bf1862010-03-02 13:46:07 -06001263 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001264 * Get a reference to a specific library or model.
1265 *
1266 * @param string $component Component name
Derek Jones32bf1862010-03-02 13:46:07 -06001267 * @return bool
1268 */
Greg Akerf5c84022011-04-19 17:13:03 -05001269 protected function &_ci_get_component($component)
Derek Jones32bf1862010-03-02 13:46:07 -06001270 {
Pascal Kriete89ace432010-11-10 15:49:10 -05001271 $CI =& get_instance();
1272 return $CI->$component;
Derek Jones32bf1862010-03-02 13:46:07 -06001273 }
1274
1275 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001276
Derek Jones32bf1862010-03-02 13:46:07 -06001277 /**
1278 * Prep filename
1279 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001280 * This function prepares filenames of various items to
1281 * make their loading more reliable.
Derek Jones32bf1862010-03-02 13:46:07 -06001282 *
Andrey Andreeved4b2582012-10-27 17:46:52 +03001283 * @param string|string[] $filename Filename(s)
1284 * @param string $extension Filename extension
Derek Jones32bf1862010-03-02 13:46:07 -06001285 * @return array
1286 */
Greg Akerf5c84022011-04-19 17:13:03 -05001287 protected function _ci_prep_filename($filename, $extension)
Derek Jones32bf1862010-03-02 13:46:07 -06001288 {
1289 if ( ! is_array($filename))
Barry Mienydd671972010-10-04 16:33:58 +02001290 {
Andrey Andreevd47baab2012-01-09 16:56:46 +02001291 return array(strtolower(str_replace(array($extension, '.php'), '', $filename).$extension));
Derek Jones32bf1862010-03-02 13:46:07 -06001292 }
1293 else
1294 {
1295 foreach ($filename as $key => $val)
1296 {
Andrey Andreevd47baab2012-01-09 16:56:46 +02001297 $filename[$key] = strtolower(str_replace(array($extension, '.php'), '', $val).$extension);
Derek Jones32bf1862010-03-02 13:46:07 -06001298 }
Barry Mienydd671972010-10-04 16:33:58 +02001299
Derek Jones32bf1862010-03-02 13:46:07 -06001300 return $filename;
1301 }
1302 }
Andrey Andreev94af3552012-03-26 23:10:42 +03001303
Derek Allard2067d1a2008-11-13 22:59:24 +00001304}
1305
1306/* End of file Loader.php */
Andrey Andreev9438e262012-10-05 13:16:27 +03001307/* Location: ./system/core/Loader.php */