blob: d60e9ac5df65fb8b2f1e5f58b5f77533f49ce34d [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/**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030029 * Hooks Class
Derek Allard2067d1a2008-11-13 22:59:24 +000030 *
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 /**
Alex Bilbief512b732012-06-16 11:15:19 +010042 * Determines whether hooks are enabled
David Behler9b5df592011-08-14 21:04:17 +020043 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030044 * @var bool
David Behler9b5df592011-08-14 21:04:17 +020045 */
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030046 public $enabled = FALSE;
Andrey Andreev92ebfb62012-05-17 12:49:24 +030047
David Behler9b5df592011-08-14 21:04:17 +020048 /**
49 * List of all hooks set in config/hooks.php
50 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030051 * @var array
David Behler9b5df592011-08-14 21:04:17 +020052 */
Timothy Warren48a7fbb2012-04-23 11:58:16 -040053 public $hooks = array();
Andrey Andreev92ebfb62012-05-17 12:49:24 +030054
David Behler9b5df592011-08-14 21:04:17 +020055 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030056 * In progress flag
57 *
Alex Bilbief512b732012-06-16 11:15:19 +010058 * Determines whether hook is in progress, used to prevent infinte loops
David Behler9b5df592011-08-14 21:04:17 +020059 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030060 * @var bool
David Behler9b5df592011-08-14 21:04:17 +020061 */
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030062 protected $_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +000063
Derek Allard2067d1a2008-11-13 22:59:24 +000064 /**
Andrey Andreev3e9d2b82012-10-27 14:28:51 +030065 * Class constructor
Derek Allard2067d1a2008-11-13 22:59:24 +000066 *
Derek Allard2067d1a2008-11-13 22:59:24 +000067 * @return void
Barry Mienydd671972010-10-04 16:33:58 +020068 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +030069 public function __construct()
Barry Mienydd671972010-10-04 16:33:58 +020070 {
Derek Jonesc64ca012010-03-07 07:55:56 -060071 $CFG =& load_class('Config', 'core');
Derek Allard2067d1a2008-11-13 22:59:24 +000072
Andrey Andreeva5dd2972012-03-26 14:43:01 +030073 log_message('debug', 'Hooks Class Initialized');
74
Derek Allard2067d1a2008-11-13 22:59:24 +000075 // If hooks are not enabled in the config file
76 // there is nothing else to do
Alex Bilbieed944a32012-06-02 11:07:47 +010077 if ($CFG->item('enable_hooks') === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +000078 {
79 return;
80 }
81
82 // Grab the "hooks" definition file.
Andrey Andreeva5dd2972012-03-26 14:43:01 +030083 if (defined('ENVIRONMENT') && is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
Greg Akerd96f8822011-12-27 16:23:47 -060084 {
85 include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
86 }
87 elseif (is_file(APPPATH.'config/hooks.php'))
88 {
89 include(APPPATH.'config/hooks.php');
90 }
91
Andrey Andreevf9938a22012-01-07 22:10:47 +020092 // If there are no hooks, we're done.
Derek Allard2067d1a2008-11-13 22:59:24 +000093 if ( ! isset($hook) OR ! is_array($hook))
94 {
95 return;
96 }
97
98 $this->hooks =& $hook;
99 $this->enabled = TRUE;
Barry Mienydd671972010-10-04 16:33:58 +0200100 }
101
Derek Allard2067d1a2008-11-13 22:59:24 +0000102 // --------------------------------------------------------------------
103
104 /**
105 * Call Hook
106 *
Andrey Andreevf9938a22012-01-07 22:10:47 +0200107 * Calls a particular hook. Called by CodeIgniter.php.
Derek Allard2067d1a2008-11-13 22:59:24 +0000108 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300109 * @uses CI_Hooks::_run_hook()
110 *
111 * @param string $which Hook name
112 * @return bool TRUE on success or FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000113 */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300114 public function call_hook($which = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000115 {
116 if ( ! $this->enabled OR ! isset($this->hooks[$which]))
117 {
118 return FALSE;
119 }
120
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300121 if (isset($this->hooks[$which][0]) && is_array($this->hooks[$which][0]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000122 {
123 foreach ($this->hooks[$which] as $val)
124 {
125 $this->_run_hook($val);
126 }
127 }
128 else
129 {
130 $this->_run_hook($this->hooks[$which]);
131 }
132
133 return TRUE;
134 }
135
136 // --------------------------------------------------------------------
137
138 /**
139 * Run Hook
140 *
141 * Runs a particular hook
142 *
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300143 * @param array $data Hook details
144 * @return bool TRUE on success or FALSE on failure
Derek Allard2067d1a2008-11-13 22:59:24 +0000145 */
Andrey Andreevf9938a22012-01-07 22:10:47 +0200146 protected function _run_hook($data)
Derek Allard2067d1a2008-11-13 22:59:24 +0000147 {
148 if ( ! is_array($data))
149 {
150 return FALSE;
151 }
152
153 // -----------------------------------
154 // Safety - Prevents run-away loops
155 // -----------------------------------
156
157 // If the script being called happens to have the same
158 // hook call within it a loop can happen
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300159 if ($this->_in_progress === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000160 {
161 return;
162 }
163
164 // -----------------------------------
165 // Set file path
166 // -----------------------------------
167
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300168 if ( ! isset($data['filepath'], $data['filename']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000169 {
170 return FALSE;
171 }
172
173 $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
174
175 if ( ! file_exists($filepath))
176 {
177 return FALSE;
178 }
179
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300180 // Determine and class and/or function names
181 $class = empty($data['class']) ? FALSE : $data['class'];
182 $function = empty($data['function']) ? FALSE : $data['function'];
183 $params = isset($data['params']) ? $data['params'] : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000184
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300185 if ($class === FALSE && $function === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000186 {
187 return FALSE;
188 }
189
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300190 // Set the _in_progress flag
191 $this->_in_progress = TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000192
Derek Allard2067d1a2008-11-13 22:59:24 +0000193 // Call the requested class and/or function
Derek Allard2067d1a2008-11-13 22:59:24 +0000194 if ($class !== FALSE)
195 {
196 if ( ! class_exists($class))
197 {
198 require($filepath);
199 }
200
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300201 $HOOK = new $class();
Derek Allard2067d1a2008-11-13 22:59:24 +0000202 $HOOK->$function($params);
203 }
204 else
205 {
206 if ( ! function_exists($function))
207 {
208 require($filepath);
209 }
210
211 $function($params);
212 }
213
Andrey Andreev3e9d2b82012-10-27 14:28:51 +0300214 $this->_in_progress = FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000215 return TRUE;
216 }
217
218}
219
Derek Allard2067d1a2008-11-13 22:59:24 +0000220/* End of file Hooks.php */
Andrey Andreeva5dd2972012-03-26 14:43:01 +0300221/* Location: ./system/core/Hooks.php */