blob: aa7ac1e5dc15bbb277e4fecb9c1c23d8ab243392 [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 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
Andrey Andreev80500af2013-01-01 08:16:53 +020021 * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000028
Derek Allard2067d1a2008-11-13 22:59:24 +000029/**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030030 * Hooks Class
Derek Allard2067d1a2008-11-13 22:59:24 +000031 *
Derek Jones6f4d17f2010-03-02 13:34:23 -060032 * Provides a mechanism to extend the base system without hacking.
Derek Allard2067d1a2008-11-13 22:59:24 +000033 *
34 * @package CodeIgniter
35 * @subpackage Libraries
36 * @category Libraries
Derek Jonesf4a4bd82011-10-20 12:18:42 -050037 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000038 * @link http://codeigniter.com/user_guide/libraries/encryption.html
39 */
40class CI_Hooks {
41
David Behler9b5df592011-08-14 21:04:17 +020042 /**
Alex Bilbief512b732012-06-16 11:15:19 +010043 * Determines whether hooks are enabled
David Behler9b5df592011-08-14 21:04:17 +020044 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030045 * @var bool
David Behler9b5df592011-08-14 21:04:17 +020046 */
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030047 public $enabled = FALSE;
Andrey Andreev92ebfb62012-05-17 12:49:24 +030048
David Behler9b5df592011-08-14 21:04:17 +020049 /**
50 * List of all hooks set in config/hooks.php
51 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030052 * @var array
David Behler9b5df592011-08-14 21:04:17 +020053 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040054 public $hooks = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030055
David Behler9b5df592011-08-14 21:04:17 +020056 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030057 * In progress flag
58 *
Alex Bilbief512b732012-06-16 11:15:19 +010059 * Determines whether hook is in progress, used to prevent infinte loops
David Behler9b5df592011-08-14 21:04:17 +020060 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030061 * @var bool
David Behler9b5df592011-08-14 21:04:17 +020062 */
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030063 protected $_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +000064
Derek Allard2067d1a2008-11-13 22:59:24 +000065 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030066 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +000067 *
Derek Allard2067d1a2008-11-13 22:59:24 +000068 * @return void
Barry Mienydd671972010-10-04 16:33:58 +020069 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +030070 public function __construct()
Barry Mienydd671972010-10-04 16:33:58 +020071 {
Derek Jonesc64ca012010-03-07 07:55:56 -060072 $CFG =& load_class('Config', 'core');
Derek Allard2067d1a2008-11-13 22:59:24 +000073
Andrey Andreeva5dd2972012-03-26 14:43:01 +030074 log_message('debug', 'Hooks Class Initialized');
75
Derek Allard2067d1a2008-11-13 22:59:24 +000076 // If hooks are not enabled in the config file
77 // there is nothing else to do
Alex Bilbieed944a32012-06-02 11:07:47 +010078 if ($CFG->item('enable_hooks') === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +000079 {
80 return;
81 }
82
83 // Grab the "hooks" definition file.
Andrey Andreev06879112013-01-29 15:05:02 +020084 if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
Greg Akerd96f8822011-12-27 16:23:47 -060085 {
86 include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
87 }
Andrey Andreev06879112013-01-29 15:05:02 +020088
89 if (file_exists(APPPATH.'config/hooks.php'))
Greg Akerd96f8822011-12-27 16:23:47 -060090 {
91 include(APPPATH.'config/hooks.php');
92 }
93
Andrey Andreevf9938a22012-01-07 22:10:47 +020094 // If there are no hooks, we're done.
Derek Allard2067d1a2008-11-13 22:59:24 +000095 if ( ! isset($hook) OR ! is_array($hook))
96 {
97 return;
98 }
99
100 $this->hooks =& $hook;
101 $this->enabled = TRUE;
Barry Mienydd671972010-10-04 16:33:58 +0200102 }
103
Derek Allard2067d1a2008-11-13 22:59:24 +0000104 // --------------------------------------------------------------------
105
106 /**
107 * Call Hook
108 *
Andrey Andreevf9938a22012-01-07 22:10:47 +0200109 * Calls a particular hook. Called by CodeIgniter.php.
Derek Allard2067d1a2008-11-13 22:59:24 +0000110 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300111 * @uses CI_Hooks::_run_hook()
112 *
113 * @param string $which Hook name
114 * @return bool TRUE on success or FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000115 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300116 public function call_hook($which = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000117 {
118 if ( ! $this->enabled OR ! isset($this->hooks[$which]))
119 {
120 return FALSE;
121 }
122
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300123 if (isset($this->hooks[$which][0]) && is_array($this->hooks[$which][0]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000124 {
125 foreach ($this->hooks[$which] as $val)
126 {
127 $this->_run_hook($val);
128 }
129 }
130 else
131 {
132 $this->_run_hook($this->hooks[$which]);
133 }
134
135 return TRUE;
136 }
137
138 // --------------------------------------------------------------------
139
140 /**
141 * Run Hook
142 *
143 * Runs a particular hook
144 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300145 * @param array $data Hook details
146 * @return bool TRUE on success or FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000147 */
Andrey Andreevf9938a22012-01-07 22:10:47 +0200148 protected function _run_hook($data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000149 {
150 if ( ! is_array($data))
151 {
152 return FALSE;
153 }
154
155 // -----------------------------------
156 // Safety - Prevents run-away loops
157 // -----------------------------------
158
159 // If the script being called happens to have the same
160 // hook call within it a loop can happen
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300161 if ($this->_in_progress === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000162 {
163 return;
164 }
165
166 // -----------------------------------
167 // Set file path
168 // -----------------------------------
169
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300170 if ( ! isset($data['filepath'], $data['filename']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000171 {
172 return FALSE;
173 }
174
175 $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
176
177 if ( ! file_exists($filepath))
178 {
179 return FALSE;
180 }
181
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300182 // Determine and class and/or function names
183 $class = empty($data['class']) ? FALSE : $data['class'];
184 $function = empty($data['function']) ? FALSE : $data['function'];
185 $params = isset($data['params']) ? $data['params'] : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000186
Andrey Andreevda8c7a52014-01-07 18:08:26 +0200187 if (empty($function))
Derek Allard2067d1a2008-11-13 22:59:24 +0000188 {
189 return FALSE;
190 }
191
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300192 // Set the _in_progress flag
193 $this->_in_progress = TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000194
Derek Allard2067d1a2008-11-13 22:59:24 +0000195 // Call the requested class and/or function
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 if ($class !== FALSE)
197 {
Andrey Andreevda8c7a52014-01-07 18:08:26 +0200198 class_exists($class, FALSE) OR require_once($filepath);
199
200 if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function))
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 {
Andrey Andreevda8c7a52014-01-07 18:08:26 +0200202 return $this->_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000203 }
204
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300205 $HOOK = new $class();
Derek Allard2067d1a2008-11-13 22:59:24 +0000206 $HOOK->$function($params);
207 }
208 else
209 {
Andrey Andreevda8c7a52014-01-07 18:08:26 +0200210 function_exists($function) OR require_once($filepath);
211
Derek Allard2067d1a2008-11-13 22:59:24 +0000212 if ( ! function_exists($function))
213 {
Andrey Andreevda8c7a52014-01-07 18:08:26 +0200214 return $this->_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000215 }
216
217 $function($params);
218 }
219
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300220 $this->_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000221 return TRUE;
222 }
223
224}
225
Derek Allard2067d1a2008-11-13 22:59:24 +0000226/* End of file Hooks.php */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300227/* Location: ./system/core/Hooks.php */