blob: b42ecbe20851269321d4c5f8897328ace20ef43f [file] [log] [blame]
Andrey Andreevf9938a22012-01-07 22:10:47 +02001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
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 Andreevf9938a22012-01-07 22:10:47 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreevf9938a22012-01-07 22:10:47 +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.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @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 */
27
Derek Allard2067d1a2008-11-13 22:59:24 +000028/**
29 * CodeIgniter Hooks Class
30 *
Derek Jones6f4d17f2010-03-02 13:34:23 -060031 * Provides a mechanism to extend the base system without hacking.
Derek Allard2067d1a2008-11-13 22:59:24 +000032 *
33 * @package CodeIgniter
34 * @subpackage Libraries
35 * @category Libraries
Derek Jonesf4a4bd82011-10-20 12:18:42 -050036 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000037 * @link http://codeigniter.com/user_guide/libraries/encryption.html
38 */
39class CI_Hooks {
40
David Behler9b5df592011-08-14 21:04:17 +020041 /**
42 * Determines wether hooks are enabled
43 *
44 * @var bool
45 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040046 public $enabled = FALSE;
Timothy Warren40403d22012-04-19 16:38:50 -040047
David Behler9b5df592011-08-14 21:04:17 +020048 /**
49 * List of all hooks set in config/hooks.php
50 *
51 * @var array
52 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040053 public $hooks = array();
Timothy Warren40403d22012-04-19 16:38:50 -040054
David Behler9b5df592011-08-14 21:04:17 +020055 /**
56 * Determines wether hook is in progress, used to prevent infinte loops
57 *
58 * @var bool
59 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040060 public $in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +000061
Derek Allard2067d1a2008-11-13 22:59:24 +000062 /**
63 * Initialize the Hooks Preferences
64 *
Derek Allard2067d1a2008-11-13 22:59:24 +000065 * @return void
Barry Mienydd671972010-10-04 16:33:58 +020066 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +030067 public function __construct()
Barry Mienydd671972010-10-04 16:33:58 +020068 {
Derek Jonesc64ca012010-03-07 07:55:56 -060069 $CFG =& load_class('Config', 'core');
Derek Allard2067d1a2008-11-13 22:59:24 +000070
Andrey Andreeva5dd2972012-03-26 14:43:01 +030071 log_message('debug', 'Hooks Class Initialized');
72
Derek Allard2067d1a2008-11-13 22:59:24 +000073 // If hooks are not enabled in the config file
74 // there is nothing else to do
Derek Allard2067d1a2008-11-13 22:59:24 +000075 if ($CFG->item('enable_hooks') == FALSE)
76 {
77 return;
78 }
79
80 // Grab the "hooks" definition file.
Andrey Andreeva5dd2972012-03-26 14:43:01 +030081 if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
Greg Akerd96f8822011-12-27 16:23:47 -060082 {
83 include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
84 }
85 elseif (is_file(APPPATH.'config/hooks.php'))
86 {
87 include(APPPATH.'config/hooks.php');
88 }
89
Andrey Andreevf9938a22012-01-07 22:10:47 +020090 // If there are no hooks, we're done.
Derek Allard2067d1a2008-11-13 22:59:24 +000091 if ( ! isset($hook) OR ! is_array($hook))
92 {
93 return;
94 }
95
96 $this->hooks =& $hook;
97 $this->enabled = TRUE;
Barry Mienydd671972010-10-04 16:33:58 +020098 }
99
Derek Allard2067d1a2008-11-13 22:59:24 +0000100 // --------------------------------------------------------------------
101
102 /**
103 * Call Hook
104 *
Andrey Andreevf9938a22012-01-07 22:10:47 +0200105 * Calls a particular hook. Called by CodeIgniter.php.
Derek Allard2067d1a2008-11-13 22:59:24 +0000106 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000107 * @param string the hook name
108 * @return mixed
109 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300110 public function call_hook($which = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000111 {
112 if ( ! $this->enabled OR ! isset($this->hooks[$which]))
113 {
114 return FALSE;
115 }
116
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300117 if (isset($this->hooks[$which][0]) && is_array($this->hooks[$which][0]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000118 {
119 foreach ($this->hooks[$which] as $val)
120 {
121 $this->_run_hook($val);
122 }
123 }
124 else
125 {
126 $this->_run_hook($this->hooks[$which]);
127 }
128
129 return TRUE;
130 }
131
132 // --------------------------------------------------------------------
133
134 /**
135 * Run Hook
136 *
137 * Runs a particular hook
138 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000139 * @param array the hook details
140 * @return bool
141 */
Andrey Andreevf9938a22012-01-07 22:10:47 +0200142 protected function _run_hook($data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000143 {
144 if ( ! is_array($data))
145 {
146 return FALSE;
147 }
148
149 // -----------------------------------
150 // Safety - Prevents run-away loops
151 // -----------------------------------
152
153 // If the script being called happens to have the same
154 // hook call within it a loop can happen
Derek Allard2067d1a2008-11-13 22:59:24 +0000155 if ($this->in_progress == TRUE)
156 {
157 return;
158 }
159
160 // -----------------------------------
161 // Set file path
162 // -----------------------------------
163
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300164 if ( ! isset($data['filepath'], $data['filename']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 {
166 return FALSE;
167 }
168
169 $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
170
171 if ( ! file_exists($filepath))
172 {
173 return FALSE;
174 }
175
176 // -----------------------------------
177 // Set class/function name
178 // -----------------------------------
179
180 $class = FALSE;
181 $function = FALSE;
182 $params = '';
183
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300184 if ( ! empty($data['class']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000185 {
186 $class = $data['class'];
187 }
188
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300189 if ( ! empty($data['function']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000190 {
191 $function = $data['function'];
192 }
193
194 if (isset($data['params']))
195 {
196 $params = $data['params'];
197 }
198
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300199 if ($class === FALSE && $function === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000200 {
201 return FALSE;
202 }
203
204 // -----------------------------------
205 // Set the in_progress flag
206 // -----------------------------------
207
208 $this->in_progress = TRUE;
209
210 // -----------------------------------
211 // Call the requested class and/or function
212 // -----------------------------------
213
214 if ($class !== FALSE)
215 {
216 if ( ! class_exists($class))
217 {
218 require($filepath);
219 }
220
221 $HOOK = new $class;
222 $HOOK->$function($params);
223 }
224 else
225 {
226 if ( ! function_exists($function))
227 {
228 require($filepath);
229 }
230
231 $function($params);
232 }
233
234 $this->in_progress = FALSE;
235 return TRUE;
236 }
237
238}
239
Derek Allard2067d1a2008-11-13 22:59:24 +0000240/* End of file Hooks.php */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300241/* Location: ./system/core/Hooks.php */