blob: 46f3ac478ee637473b2c5eceec43f559921c2f0c [file] [log] [blame]
Derek Allard2067d1a2008-11-13 22:59:24 +00001<?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 * CodeIgniter Hooks Class
20 *
21 * Provides a mechanism to extend the base system without hacking. Most of
22 * this class is borrowed from Paul's Extension class in ExpressionEngine.
23 *
24 * @package CodeIgniter
25 * @subpackage Libraries
26 * @category Libraries
27 * @author ExpressionEngine Dev Team
28 * @link http://codeigniter.com/user_guide/libraries/encryption.html
29 */
30class CI_Hooks {
31
32 var $enabled = FALSE;
33 var $hooks = array();
34 var $in_progress = FALSE;
35
36 /**
37 * Constructor
38 *
39 */
40 function CI_Hooks()
41 {
42 $this->_initialize();
43 log_message('debug', "Hooks Class Initialized");
44 }
45
46 // --------------------------------------------------------------------
47
48 /**
49 * Initialize the Hooks Preferences
50 *
51 * @access private
52 * @return void
53 */
54 function _initialize()
55 {
56 $CFG =& load_class('Config');
57
58 // If hooks are not enabled in the config file
59 // there is nothing else to do
60
61 if ($CFG->item('enable_hooks') == FALSE)
62 {
63 return;
64 }
65
66 // Grab the "hooks" definition file.
67 // If there are no hooks, we're done.
68
69 @include(APPPATH.'config/hooks'.EXT);
70
71 if ( ! isset($hook) OR ! is_array($hook))
72 {
73 return;
74 }
75
76 $this->hooks =& $hook;
77 $this->enabled = TRUE;
78 }
79
80 // --------------------------------------------------------------------
81
82 /**
83 * Call Hook
84 *
85 * Calls a particular hook
86 *
87 * @access private
88 * @param string the hook name
89 * @return mixed
90 */
91 function _call_hook($which = '')
92 {
93 if ( ! $this->enabled OR ! isset($this->hooks[$which]))
94 {
95 return FALSE;
96 }
97
98 if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))
99 {
100 foreach ($this->hooks[$which] as $val)
101 {
102 $this->_run_hook($val);
103 }
104 }
105 else
106 {
107 $this->_run_hook($this->hooks[$which]);
108 }
109
110 return TRUE;
111 }
112
113 // --------------------------------------------------------------------
114
115 /**
116 * Run Hook
117 *
118 * Runs a particular hook
119 *
120 * @access private
121 * @param array the hook details
122 * @return bool
123 */
124 function _run_hook($data)
125 {
126 if ( ! is_array($data))
127 {
128 return FALSE;
129 }
130
131 // -----------------------------------
132 // Safety - Prevents run-away loops
133 // -----------------------------------
134
135 // If the script being called happens to have the same
136 // hook call within it a loop can happen
137
138 if ($this->in_progress == TRUE)
139 {
140 return;
141 }
142
143 // -----------------------------------
144 // Set file path
145 // -----------------------------------
146
147 if ( ! isset($data['filepath']) OR ! isset($data['filename']))
148 {
149 return FALSE;
150 }
151
152 $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
153
154 if ( ! file_exists($filepath))
155 {
156 return FALSE;
157 }
158
159 // -----------------------------------
160 // Set class/function name
161 // -----------------------------------
162
163 $class = FALSE;
164 $function = FALSE;
165 $params = '';
166
167 if (isset($data['class']) AND $data['class'] != '')
168 {
169 $class = $data['class'];
170 }
171
172 if (isset($data['function']))
173 {
174 $function = $data['function'];
175 }
176
177 if (isset($data['params']))
178 {
179 $params = $data['params'];
180 }
181
182 if ($class === FALSE AND $function === FALSE)
183 {
184 return FALSE;
185 }
186
187 // -----------------------------------
188 // Set the in_progress flag
189 // -----------------------------------
190
191 $this->in_progress = TRUE;
192
193 // -----------------------------------
194 // Call the requested class and/or function
195 // -----------------------------------
196
197 if ($class !== FALSE)
198 {
199 if ( ! class_exists($class))
200 {
201 require($filepath);
202 }
203
204 $HOOK = new $class;
205 $HOOK->$function($params);
206 }
207 else
208 {
209 if ( ! function_exists($function))
210 {
211 require($filepath);
212 }
213
214 $function($params);
215 }
216
217 $this->in_progress = FALSE;
218 return TRUE;
219 }
220
221}
222
223// END CI_Hooks class
224
225/* End of file Hooks.php */
Derek Jonesa3ffbbb2008-05-11 18:18:29 +0000226/* Location: ./system/libraries/Hooks.php */