Subversion Repositories Applications.papyrus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2005 Aurelien 1
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2
/**
3
 * CodeIgniter
4
 *
5
 * An open source application development framework for PHP 4.3.2 or newer
6
 *
7
 * @package		CodeIgniter
8
 * @author		ExpressionEngine Dev Team
9
 * @copyright	Copyright (c) 2008, EllisLab, Inc.
10
 * @license		http://codeigniter.com/user_guide/license.html
11
 * @link		http://codeigniter.com
12
 * @since		Version 1.0
13
 * @filesource
14
 */
15
16
// ------------------------------------------------------------------------
17
18
/**
19
 * Loader Class
20
 *
21
 * Loads views and files
22
 *
23
 * @package		CodeIgniter
24
 * @subpackage	Libraries
25
 * @author		ExpressionEngine Dev Team
26
 * @category	Loader
27
 * @link		http://codeigniter.com/user_guide/libraries/loader.html
28
 */
29
class CI_Loader {
30
31
	// All these are set automatically. Don't mess with them.
32
	var $_ci_ob_level;
33
	var $_ci_view_path		= '';
34
	var $_ci_is_php5		= FALSE;
35
	var $_ci_is_instance 	= FALSE; // Whether we should use $this or $CI =& get_instance()
36
	var $_ci_cached_vars	= array();
37
	var $_ci_classes		= array();
38
	var $_ci_loaded_files	= array();
39
	var $_ci_models			= array();
40
	var $_ci_helpers		= array();
41
	var $_ci_plugins		= array();
42
	var $_ci_varmap			= array('unit_test' => 'unit', 'user_agent' => 'agent');
43
44
45
	/**
46
	 * Constructor
47
	 *
48
	 * Sets the path to the view files and gets the initial output buffering level
49
	 *
50
	 * @access	public
51
	 */
52
	function CI_Loader()
53
	{
54
		$this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
55
		$this->_ci_view_path = APPPATH.'views/';
56
		$this->_ci_ob_level  = ob_get_level();
57
58
		log_message('debug', "Loader Class Initialized");
59
	}
60
61
	// --------------------------------------------------------------------
62
63
	/**
64
	 * Class Loader
65
	 *
66
	 * This function lets users load and instantiate classes.
67
	 * It is designed to be called from a user's app controllers.
68
	 *
69
	 * @access	public
70
	 * @param	string	the name of the class
71
	 * @param	mixed	the optional parameters
72
	 * @param	string	an optional object name
73
	 * @return	void
74
	 */
75
	function library($library = '', $params = NULL, $object_name = NULL)
76
	{
77
		if ($library == '')
78
		{
79
			return FALSE;
80
		}
81
82
		if ( ! is_null($params) AND ! is_array($params))
83
		{
84
			$params = NULL;
85
		}
86
87
		if (is_array($library))
88
		{
89
			foreach ($library as $class)
90
			{
91
				$this->_ci_load_class($class, $params, $object_name);
92
			}
93
		}
94
		else
95
		{
96
			$this->_ci_load_class($library, $params, $object_name);
97
		}
98
99
		$this->_ci_assign_to_models();
100
	}
101
102
	// --------------------------------------------------------------------
103
104
	/**
105
	 * Model Loader
106
	 *
107
	 * This function lets users load and instantiate models.
108
	 *
109
	 * @access	public
110
	 * @param	string	the name of the class
111
	 * @param	string	name for the model
112
	 * @param	bool	database connection
113
	 * @return	void
114
	 */
115
	function model($model, $name = '', $db_conn = FALSE)
116
	{
117
		if (is_array($model))
118
		{
119
			foreach($model as $babe)
120
			{
121
				$this->model($babe);
122
			}
123
			return;
124
		}
125
126
		if ($model == '')
127
		{
128
			return;
129
		}
130
131
		// Is the model in a sub-folder? If so, parse out the filename and path.
132
		if (strpos($model, '/') === FALSE)
133
		{
134
			$path = '';
135
		}
136
		else
137
		{
138
			$x = explode('/', $model);
139
			$model = end($x);
140
			unset($x[count($x)-1]);
141
			$path = implode('/', $x).'/';
142
		}
143
144
		if ($name == '')
145
		{
146
			$name = $model;
147
		}
148
149
		if (in_array($name, $this->_ci_models, TRUE))
150
		{
151
			return;
152
		}
153
154
		$CI =& get_instance();
155
		if (isset($CI->$name))
156
		{
157
			show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
158
		}
159
160
		$model = strtolower($model);
161
162
		if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
163
		{
164
			show_error('Unable to locate the model you have specified: '.$model);
165
		}
166
167
		if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
168
		{
169
			if ($db_conn === TRUE)
170
				$db_conn = '';
171
172
			$CI->load->database($db_conn, FALSE, TRUE);
173
		}
174
175
		if ( ! class_exists('Model'))
176
		{
177
			load_class('Model', FALSE);
178
		}
179
180
		require_once(APPPATH.'models/'.$path.$model.EXT);
181
182
		$model = ucfirst($model);
183
184
		$CI->$name = new $model();
185
		$CI->$name->_assign_libraries();
186
187
		$this->_ci_models[] = $name;
188
	}
189
190
	// --------------------------------------------------------------------
191
192
	/**
193
	 * Database Loader
194
	 *
195
	 * @access	public
196
	 * @param	string	the DB credentials
197
	 * @param	bool	whether to return the DB object
198
	 * @param	bool	whether to enable active record (this allows us to override the config setting)
199
	 * @return	object
200
	 */
201
	function database($params = '', $return = FALSE, $active_record = FALSE)
202
	{
203
		// Grab the super object
204
		$CI =& get_instance();
205
206
		// Do we even need to load the database class?
207
		if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE AND isset($CI->db) AND is_object($CI->db))
208
		{
209
			return FALSE;
210
		}
211
212
		require_once(BASEPATH.'database/DB'.EXT);
213
214
		if ($return === TRUE)
215
		{
216
			return DB($params, $active_record);
217
		}
218
219
		// Initialize the db variable.  Needed to prevent
220
		// reference errors with some configurations
221
		$CI->db = '';
222
223
		// Load the DB class
224
		$CI->db =& DB($params, $active_record);
225
226
		// Assign the DB object to any existing models
227
		$this->_ci_assign_to_models();
228
	}
229
230
	// --------------------------------------------------------------------
231
232
	/**
233
	 * Load the Utilities Class
234
	 *
235
	 * @access	public
236
	 * @return	string
237
	 */
238
	function dbutil()
239
	{
240
		if ( ! class_exists('CI_DB'))
241
		{
242
			$this->database();
243
		}
244
245
		$CI =& get_instance();
246
247
		// for backwards compatibility, load dbforge so we can extend dbutils off it
248
		// this use is deprecated and strongly discouraged
249
		$CI->load->dbforge();
250
251
		require_once(BASEPATH.'database/DB_utility'.EXT);
252
		require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
253
		$class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
254
255
		$CI->dbutil =& new $class();
256
257
		$CI->load->_ci_assign_to_models();
258
	}
259
260
	// --------------------------------------------------------------------
261
262
	/**
263
	 * Load the Database Forge Class
264
	 *
265
	 * @access	public
266
	 * @return	string
267
	 */
268
	function dbforge()
269
	{
270
		if ( ! class_exists('CI_DB'))
271
		{
272
			$this->database();
273
		}
274
275
		$CI =& get_instance();
276
277
		require_once(BASEPATH.'database/DB_forge'.EXT);
278
		require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge'.EXT);
279
		$class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
280
281
		$CI->dbforge = new $class();
282
283
		$CI->load->_ci_assign_to_models();
284
	}
285
286
	// --------------------------------------------------------------------
287
288
	/**
289
	 * Load View
290
	 *
291
	 * This function is used to load a "view" file.  It has three parameters:
292
	 *
293
	 * 1. The name of the "view" file to be included.
294
	 * 2. An associative array of data to be extracted for use in the view.
295
	 * 3. TRUE/FALSE - whether to return the data or load it.  In
296
	 * some cases it's advantageous to be able to return data so that
297
	 * a developer can process it in some way.
298
	 *
299
	 * @access	public
300
	 * @param	string
301
	 * @param	array
302
	 * @param	bool
303
	 * @return	void
304
	 */
305
	function view($view, $vars = array(), $return = FALSE)
306
	{
307
		return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
308
	}
309
310
	// --------------------------------------------------------------------
311
312
	/**
313
	 * Load File
314
	 *
315
	 * This is a generic file loader
316
	 *
317
	 * @access	public
318
	 * @param	string
319
	 * @param	bool
320
	 * @return	string
321
	 */
322
	function file($path, $return = FALSE)
323
	{
324
		return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
325
	}
326
327
	// --------------------------------------------------------------------
328
329
	/**
330
	 * Set Variables
331
	 *
332
	 * Once variables are set they become available within
333
	 * the controller class and its "view" files.
334
	 *
335
	 * @access	public
336
	 * @param	array
337
	 * @return	void
338
	 */
339
	function vars($vars = array(), $val = '')
340
	{
341
		if ($val != '' AND is_string($vars))
342
		{
343
			$vars = array($vars => $val);
344
		}
345
346
		$vars = $this->_ci_object_to_array($vars);
347
348
		if (is_array($vars) AND count($vars) > 0)
349
		{
350
			foreach ($vars as $key => $val)
351
			{
352
				$this->_ci_cached_vars[$key] = $val;
353
			}
354
		}
355
	}
356
357
	// --------------------------------------------------------------------
358
359
	/**
360
	 * Load Helper
361
	 *
362
	 * This function loads the specified helper file.
363
	 *
364
	 * @access	public
365
	 * @param	mixed
366
	 * @return	void
367
	 */
368
	function helper($helpers = array())
369
	{
370
		if ( ! is_array($helpers))
371
		{
372
			$helpers = array($helpers);
373
		}
374
375
		foreach ($helpers as $helper)
376
		{
377
			$helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
378
379
			if (isset($this->_ci_helpers[$helper]))
380
			{
381
				continue;
382
			}
383
384
			$ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.EXT;
385
386
			// Is this a helper extension request?
387
			if (file_exists($ext_helper))
388
			{
389
				$base_helper = BASEPATH.'helpers/'.$helper.EXT;
390
391
				if ( ! file_exists($base_helper))
392
				{
393
					show_error('Unable to load the requested file: helpers/'.$helper.EXT);
394
				}
395
396
				include_once($ext_helper);
397
				include_once($base_helper);
398
			}
399
			elseif (file_exists(APPPATH.'helpers/'.$helper.EXT))
400
			{
401
				include_once(APPPATH.'helpers/'.$helper.EXT);
402
			}
403
			else
404
			{
405
				if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
406
				{
407
					include_once(BASEPATH.'helpers/'.$helper.EXT);
408
				}
409
				else
410
				{
411
					show_error('Unable to load the requested file: helpers/'.$helper.EXT);
412
				}
413
			}
414
415
			$this->_ci_helpers[$helper] = TRUE;
416
			log_message('debug', 'Helper loaded: '.$helper);
417
		}
418
	}
419
420
	// --------------------------------------------------------------------
421
422
	/**
423
	 * Load Helpers
424
	 *
425
	 * This is simply an alias to the above function in case the
426
	 * user has written the plural form of this function.
427
	 *
428
	 * @access	public
429
	 * @param	array
430
	 * @return	void
431
	 */
432
	function helpers($helpers = array())
433
	{
434
		$this->helper($helpers);
435
	}
436
437
	// --------------------------------------------------------------------
438
439
	/**
440
	 * Load Plugin
441
	 *
442
	 * This function loads the specified plugin.
443
	 *
444
	 * @access	public
445
	 * @param	array
446
	 * @return	void
447
	 */
448
	function plugin($plugins = array())
449
	{
450
		if ( ! is_array($plugins))
451
		{
452
			$plugins = array($plugins);
453
		}
454
455
		foreach ($plugins as $plugin)
456
		{
457
			$plugin = strtolower(str_replace(EXT, '', str_replace('_pi', '', $plugin)).'_pi');
458
459
			if (isset($this->_ci_plugins[$plugin]))
460
			{
461
				continue;
462
			}
463
464
			if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
465
			{
466
				include_once(APPPATH.'plugins/'.$plugin.EXT);
467
			}
468
			else
469
			{
470
				if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
471
				{
472
					include_once(BASEPATH.'plugins/'.$plugin.EXT);
473
				}
474
				else
475
				{
476
					show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
477
				}
478
			}
479
480
			$this->_ci_plugins[$plugin] = TRUE;
481
			log_message('debug', 'Plugin loaded: '.$plugin);
482
		}
483
	}
484
485
	// --------------------------------------------------------------------
486
487
	/**
488
	 * Load Plugins
489
	 *
490
	 * This is simply an alias to the above function in case the
491
	 * user has written the plural form of this function.
492
	 *
493
	 * @access	public
494
	 * @param	array
495
	 * @return	void
496
	 */
497
	function plugins($plugins = array())
498
	{
499
		$this->plugin($plugins);
500
	}
501
502
	// --------------------------------------------------------------------
503
504
	/**
505
	 * Loads a language file
506
	 *
507
	 * @access	public
508
	 * @param	array
509
	 * @param	string
510
	 * @return	void
511
	 */
512
	function language($file = array(), $lang = '')
513
	{
514
		$CI =& get_instance();
515
516
		if ( ! is_array($file))
517
		{
518
			$file = array($file);
519
		}
520
521
		foreach ($file as $langfile)
522
		{
523
			$CI->lang->load($langfile, $lang);
524
		}
525
	}
526
527
	/**
528
	 * Loads language files for scaffolding
529
	 *
530
	 * @access	public
531
	 * @param	string
532
	 * @return	arra
533
	 */
534
	function scaffold_language($file = '', $lang = '', $return = FALSE)
535
	{
536
		$CI =& get_instance();
537
		return $CI->lang->load($file, $lang, $return);
538
	}
539
540
	// --------------------------------------------------------------------
541
542
	/**
543
	 * Loads a config file
544
	 *
545
	 * @access	public
546
	 * @param	string
547
	 * @return	void
548
	 */
549
	function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
550
	{
551
		$CI =& get_instance();
552
		$CI->config->load($file, $use_sections, $fail_gracefully);
553
	}
554
555
	// --------------------------------------------------------------------
556
557
	/**
558
	 * Scaffolding Loader
559
	 *
560
	 * This initializing function works a bit different than the
561
	 * others. It doesn't load the class.  Instead, it simply
562
	 * sets a flag indicating that scaffolding is allowed to be
563
	 * used.  The actual scaffolding function below is
564
	 * called by the front controller based on whether the
565
	 * second segment of the URL matches the "secret" scaffolding
566
	 * word stored in the application/config/routes.php
567
	 *
568
	 * @access	public
569
	 * @param	string
570
	 * @return	void
571
	 */
572
	function scaffolding($table = '')
573
	{
574
		if ($table === FALSE)
575
		{
576
			show_error('You must include the name of the table you would like to access when you initialize scaffolding');
577
		}
578
579
		$CI =& get_instance();
580
		$CI->_ci_scaffolding = TRUE;
581
		$CI->_ci_scaff_table = $table;
582
	}
583
584
	// --------------------------------------------------------------------
585
586
	/**
587
	 * Loader
588
	 *
589
	 * This function is used to load views and files.
590
	 * Variables are prefixed with _ci_ to avoid symbol collision with
591
	 * variables made available to view files
592
	 *
593
	 * @access	private
594
	 * @param	array
595
	 * @return	void
596
	 */
597
	function _ci_load($_ci_data)
598
	{
599
		// Set the default data variables
600
		foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
601
		{
602
			$$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
603
		}
604
605
		// Set the path to the requested file
606
		if ($_ci_path == '')
607
		{
608
			$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
609
			$_ci_file = ($_ci_ext == '') ? $_ci_view.EXT : $_ci_view;
610
			$_ci_path = $this->_ci_view_path.$_ci_file;
611
		}
612
		else
613
		{
614
			$_ci_x = explode('/', $_ci_path);
615
			$_ci_file = end($_ci_x);
616
		}
617
618
		if ( ! file_exists($_ci_path))
619
		{
620
			show_error('Unable to load the requested file: '.$_ci_file);
621
		}
622
623
		// This allows anything loaded using $this->load (views, files, etc.)
624
		// to become accessible from within the Controller and Model functions.
625
		// Only needed when running PHP 5
626
627
		if ($this->_ci_is_instance())
628
		{
629
			$_ci_CI =& get_instance();
630
			foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
631
			{
632
				if ( ! isset($this->$_ci_key))
633
				{
634
					$this->$_ci_key =& $_ci_CI->$_ci_key;
635
				}
636
			}
637
		}
638
639
		/*
640
		 * Extract and cache variables
641
		 *
642
		 * You can either set variables using the dedicated $this->load_vars()
643
		 * function or via the second parameter of this function. We'll merge
644
		 * the two types and cache them so that views that are embedded within
645
		 * other views can have access to these variables.
646
		 */
647
		if (is_array($_ci_vars))
648
		{
649
			$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
650
		}
651
		extract($this->_ci_cached_vars);
652
653
		/*
654
		 * Buffer the output
655
		 *
656
		 * We buffer the output for two reasons:
657
		 * 1. Speed. You get a significant speed boost.
658
		 * 2. So that the final rendered template can be
659
		 * post-processed by the output class.  Why do we
660
		 * need post processing?  For one thing, in order to
661
		 * show the elapsed page load time.  Unless we
662
		 * can intercept the content right before it's sent to
663
		 * the browser and then stop the timer it won't be accurate.
664
		 */
665
		ob_start();
666
667
		// If the PHP installation does not support short tags we'll
668
		// do a little string replacement, changing the short tags
669
		// to standard PHP echo statements.
670
671
		if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
672
		{
673
			echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
674
		}
675
		else
676
		{
677
			include($_ci_path); // include() vs include_once() allows for multiple views with the same name
678
		}
679
680
		log_message('debug', 'File loaded: '.$_ci_path);
681
682
		// Return the file data if requested
683
		if ($_ci_return === TRUE)
684
		{
685
			$buffer = ob_get_contents();
686
			@ob_end_clean();
687
			return $buffer;
688
		}
689
690
		/*
691
		 * Flush the buffer... or buff the flusher?
692
		 *
693
		 * In order to permit views to be nested within
694
		 * other views, we need to flush the content back out whenever
695
		 * we are beyond the first level of output buffering so that
696
		 * it can be seen and included properly by the first included
697
		 * template and any subsequent ones. Oy!
698
		 *
699
		 */
700
		if (ob_get_level() > $this->_ci_ob_level + 1)
701
		{
702
			ob_end_flush();
703
		}
704
		else
705
		{
706
			// PHP 4 requires that we use a global
707
			global $OUT;
708
			$OUT->append_output(ob_get_contents());
709
			@ob_end_clean();
710
		}
711
	}
712
713
	// --------------------------------------------------------------------
714
715
	/**
716
	 * Load class
717
	 *
718
	 * This function loads the requested class.
719
	 *
720
	 * @access	private
721
	 * @param 	string	the item that is being loaded
722
	 * @param	mixed	any additional parameters
723
	 * @param	string	an optional object name
724
	 * @return 	void
725
	 */
726
	function _ci_load_class($class, $params = NULL, $object_name = NULL)
727
	{
728
		// Get the class name, and while we're at it trim any slashes.
729
		// The directory path can be included as part of the class name,
730
		// but we don't want a leading slash
731
		$class = str_replace(EXT, '', trim($class, '/'));
732
733
		// Was the path included with the class name?
734
		// We look for a slash to determine this
735
		$subdir = '';
736
		if (strpos($class, '/') !== FALSE)
737
		{
738
			// explode the path so we can separate the filename from the path
739
			$x = explode('/', $class);
740
741
			// Reset the $class variable now that we know the actual filename
742
			$class = end($x);
743
744
			// Kill the filename from the array
745
			unset($x[count($x)-1]);
746
747
			// Glue the path back together, sans filename
748
			$subdir = implode($x, '/').'/';
749
		}
750
751
		// We'll test for both lowercase and capitalized versions of the file name
752
		foreach (array(ucfirst($class), strtolower($class)) as $class)
753
		{
754
			$subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.EXT;
755
756
			// Is this a class extension request?
757
			if (file_exists($subclass))
758
			{
759
				$baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
760
761
				if ( ! file_exists($baseclass))
762
				{
763
					log_message('error', "Unable to load the requested class: ".$class);
764
					show_error("Unable to load the requested class: ".$class);
765
				}
766
767
				// Safety:  Was the class already loaded by a previous call?
768
				if (in_array($subclass, $this->_ci_loaded_files))
769
				{
770
					// Before we deem this to be a duplicate request, let's see
771
					// if a custom object name is being supplied.  If so, we'll
772
					// return a new instance of the object
773
					if ( ! is_null($object_name))
774
					{
775
						$CI =& get_instance();
776
						if ( ! isset($CI->$object_name))
777
						{
778
							return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
779
						}
780
					}
781
782
					$is_duplicate = TRUE;
783
					log_message('debug', $class." class already loaded. Second attempt ignored.");
784
					return;
785
				}
786
787
				include_once($baseclass);
788
				include_once($subclass);
789
				$this->_ci_loaded_files[] = $subclass;
790
791
				return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
792
			}
793
794
			// Lets search for the requested library file and load it.
795
			$is_duplicate = FALSE;
796
			for ($i = 1; $i < 3; $i++)
797
			{
798
				$path = ($i % 2) ? APPPATH : BASEPATH;
799
				$filepath = $path.'libraries/'.$subdir.$class.EXT;
800
801
				// Does the file exist?  No?  Bummer...
802
				if ( ! file_exists($filepath))
803
				{
804
					continue;
805
				}
806
807
				// Safety:  Was the class already loaded by a previous call?
808
				if (in_array($filepath, $this->_ci_loaded_files))
809
				{
810
					// Before we deem this to be a duplicate request, let's see
811
					// if a custom object name is being supplied.  If so, we'll
812
					// return a new instance of the object
813
					if ( ! is_null($object_name))
814
					{
815
						$CI =& get_instance();
816
						if ( ! isset($CI->$object_name))
817
						{
818
							return $this->_ci_init_class($class, '', $params, $object_name);
819
						}
820
					}
821
822
					$is_duplicate = TRUE;
823
					log_message('debug', $class." class already loaded. Second attempt ignored.");
824
					return;
825
				}
826
827
				include_once($filepath);
828
				$this->_ci_loaded_files[] = $filepath;
829
				return $this->_ci_init_class($class, '', $params, $object_name);
830
			}
831
		} // END FOREACH
832
833
		// One last attempt.  Maybe the library is in a subdirectory, but it wasn't specified?
834
		if ($subdir == '')
835
		{
836
			$path = strtolower($class).'/'.$class;
837
			return $this->_ci_load_class($path, $params);
838
		}
839
840
		// If we got this far we were unable to find the requested class.
841
		// We do not issue errors if the load call failed due to a duplicate request
842
		if ($is_duplicate == FALSE)
843
		{
844
			log_message('error', "Unable to load the requested class: ".$class);
845
			show_error("Unable to load the requested class: ".$class);
846
		}
847
	}
848
849
	// --------------------------------------------------------------------
850
851
	/**
852
	 * Instantiates a class
853
	 *
854
	 * @access	private
855
	 * @param	string
856
	 * @param	string
857
	 * @param	string	an optional object name
858
	 * @return	null
859
	 */
860
	function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
861
	{
862
		// Is there an associated config file for this class?
863
		if ($config === NULL)
864
		{
865
			// We test for both uppercase and lowercase, for servers that
866
			// are case-sensitive with regard to file names
867
			if (file_exists(APPPATH.'config/'.strtolower($class).EXT))
868
			{
869
				include_once(APPPATH.'config/'.strtolower($class).EXT);
870
			}
871
			else
872
			{
873
				if (file_exists(APPPATH.'config/'.ucfirst(strtolower($class)).EXT))
874
				{
875
					include_once(APPPATH.'config/'.ucfirst(strtolower($class)).EXT);
876
				}
877
			}
878
		}
879
880
		if ($prefix == '')
881
		{
882
			if (class_exists('CI_'.$class))
883
			{
884
				$name = 'CI_'.$class;
885
			}
886
			elseif (class_exists(config_item('subclass_prefix').$class))
887
			{
888
				$name = config_item('subclass_prefix').$class;
889
			}
890
			else
891
			{
892
				$name = $class;
893
			}
894
		}
895
		else
896
		{
897
			$name = $prefix.$class;
898
		}
899
900
		// Is the class name valid?
901
		if ( ! class_exists($name))
902
		{
903
			log_message('error', "Non-existent class: ".$name);
904
			show_error("Non-existent class: ".$class);
905
		}
906
907
		// Set the variable name we will assign the class to
908
		// Was a custom class name supplied?  If so we'll use it
909
		$class = strtolower($class);
910
911
		if (is_null($object_name))
912
		{
913
			$classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
914
		}
915
		else
916
		{
917
			$classvar = $object_name;
918
		}
919
920
		// Save the class name and object name
921
		$this->_ci_classes[$class] = $classvar;
922
923
		// Instantiate the class
924
		$CI =& get_instance();
925
		if ($config !== NULL)
926
		{
927
			$CI->$classvar = new $name($config);
928
		}
929
		else
930
		{
931
			$CI->$classvar = new $name;
932
		}
933
	}
934
935
	// --------------------------------------------------------------------
936
937
	/**
938
	 * Autoloader
939
	 *
940
	 * The config/autoload.php file contains an array that permits sub-systems,
941
	 * libraries, plugins, and helpers to be loaded automatically.
942
	 *
943
	 * @access	private
944
	 * @param	array
945
	 * @return	void
946
	 */
947
	function _ci_autoloader()
948
	{
949
		include_once(APPPATH.'config/autoload'.EXT);
950
951
		if ( ! isset($autoload))
952
		{
953
			return FALSE;
954
		}
955
956
		// Load any custom config file
957
		if (count($autoload['config']) > 0)
958
		{
959
			$CI =& get_instance();
960
			foreach ($autoload['config'] as $key => $val)
961
			{
962
				$CI->config->load($val);
963
			}
964
		}
965
966
		// Autoload plugins, helpers and languages
967
		foreach (array('helper', 'plugin', 'language') as $type)
968
		{
969
			if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
970
			{
971
				$this->$type($autoload[$type]);
972
			}
973
		}
974
975
		// A little tweak to remain backward compatible
976
		// The $autoload['core'] item was deprecated
977
		if ( ! isset($autoload['libraries']))
978
		{
979
			$autoload['libraries'] = $autoload['core'];
980
		}
981
982
		// Load libraries
983
		if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
984
		{
985
			// Load the database driver.
986
			if (in_array('database', $autoload['libraries']))
987
			{
988
				$this->database();
989
				$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
990
			}
991
992
			// Load scaffolding
993
			if (in_array('scaffolding', $autoload['libraries']))
994
			{
995
				$this->scaffolding();
996
				$autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
997
			}
998
999
			// Load all other libraries
1000
			foreach ($autoload['libraries'] as $item)
1001
			{
1002
				$this->library($item);
1003
			}
1004
		}
1005
1006
		// Autoload models
1007
		if (isset($autoload['model']))
1008
		{
1009
			$this->model($autoload['model']);
1010
		}
1011
1012
	}
1013
1014
	// --------------------------------------------------------------------
1015
1016
	/**
1017
	 * Assign to Models
1018
	 *
1019
	 * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
1020
	 * will be available to models, if any exist.
1021
	 *
1022
	 * @access	private
1023
	 * @param	object
1024
	 * @return	array
1025
	 */
1026
	function _ci_assign_to_models()
1027
	{
1028
		if (count($this->_ci_models) == 0)
1029
		{
1030
			return;
1031
		}
1032
1033
		if ($this->_ci_is_instance())
1034
		{
1035
			$CI =& get_instance();
1036
			foreach ($this->_ci_models as $model)
1037
			{
1038
				$CI->$model->_assign_libraries();
1039
			}
1040
		}
1041
		else
1042
		{
1043
			foreach ($this->_ci_models as $model)
1044
			{
1045
				$this->$model->_assign_libraries();
1046
			}
1047
		}
1048
	}
1049
1050
	// --------------------------------------------------------------------
1051
1052
	/**
1053
	 * Object to Array
1054
	 *
1055
	 * Takes an object as input and converts the class variables to array key/vals
1056
	 *
1057
	 * @access	private
1058
	 * @param	object
1059
	 * @return	array
1060
	 */
1061
	function _ci_object_to_array($object)
1062
	{
1063
		return (is_object($object)) ? get_object_vars($object) : $object;
1064
	}
1065
1066
	// --------------------------------------------------------------------
1067
1068
	/**
1069
	 * Determines whether we should use the CI instance or $this
1070
	 *
1071
	 * @access	private
1072
	 * @return	bool
1073
	 */
1074
	function _ci_is_instance()
1075
	{
1076
		if ($this->_ci_is_php5 == TRUE)
1077
		{
1078
			return TRUE;
1079
		}
1080
1081
		global $CI;
1082
		return (is_object($CI)) ? TRUE : FALSE;
1083
	}
1084
1085
}
1086
1087
/* End of file Loader.php */
1088
/* Location: ./system/libraries/Loader.php */