You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
4.6 KiB
248 lines
4.6 KiB
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
|
/** |
|
* CodeIgniter |
|
* |
|
* An open source application development framework for PHP 5.1.6 or newer |
|
* |
|
* @package CodeIgniter |
|
* @author ExpressionEngine Dev Team |
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. |
|
* @license http://codeigniter.com/user_guide/license.html |
|
* @link http://codeigniter.com |
|
* @since Version 1.0 |
|
* @filesource |
|
*/ |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* CodeIgniter Hooks Class |
|
* |
|
* Provides a mechanism to extend the base system without hacking. |
|
* |
|
* @package CodeIgniter |
|
* @subpackage Libraries |
|
* @category Libraries |
|
* @author ExpressionEngine Dev Team |
|
* @link http://codeigniter.com/user_guide/libraries/encryption.html |
|
*/ |
|
class CI_Hooks { |
|
|
|
/** |
|
* Determines wether hooks are enabled |
|
* |
|
* @var bool |
|
*/ |
|
var $enabled = FALSE; |
|
/** |
|
* List of all hooks set in config/hooks.php |
|
* |
|
* @var array |
|
*/ |
|
var $hooks = array(); |
|
/** |
|
* Determines wether hook is in progress, used to prevent infinte loops |
|
* |
|
* @var bool |
|
*/ |
|
var $in_progress = FALSE; |
|
|
|
/** |
|
* Constructor |
|
* |
|
*/ |
|
function __construct() |
|
{ |
|
$this->_initialize(); |
|
log_message('debug', "Hooks Class Initialized"); |
|
} |
|
|
|
// -------------------------------------------------------------------- |
|
|
|
/** |
|
* Initialize the Hooks Preferences |
|
* |
|
* @access private |
|
* @return void |
|
*/ |
|
function _initialize() |
|
{ |
|
$CFG =& load_class('Config', 'core'); |
|
|
|
// If hooks are not enabled in the config file |
|
// there is nothing else to do |
|
|
|
if ($CFG->item('enable_hooks') == FALSE) |
|
{ |
|
return; |
|
} |
|
|
|
// Grab the "hooks" definition file. |
|
// If there are no hooks, we're done. |
|
|
|
if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) |
|
{ |
|
include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); |
|
} |
|
elseif (is_file(APPPATH.'config/hooks.php')) |
|
{ |
|
include(APPPATH.'config/hooks.php'); |
|
} |
|
|
|
|
|
if ( ! isset($hook) OR ! is_array($hook)) |
|
{ |
|
return; |
|
} |
|
|
|
$this->hooks =& $hook; |
|
$this->enabled = TRUE; |
|
} |
|
|
|
// -------------------------------------------------------------------- |
|
|
|
/** |
|
* Call Hook |
|
* |
|
* Calls a particular hook |
|
* |
|
* @access private |
|
* @param string the hook name |
|
* @return mixed |
|
*/ |
|
function _call_hook($which = '') |
|
{ |
|
if ( ! $this->enabled OR ! isset($this->hooks[$which])) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0])) |
|
{ |
|
foreach ($this->hooks[$which] as $val) |
|
{ |
|
$this->_run_hook($val); |
|
} |
|
} |
|
else |
|
{ |
|
$this->_run_hook($this->hooks[$which]); |
|
} |
|
|
|
return TRUE; |
|
} |
|
|
|
// -------------------------------------------------------------------- |
|
|
|
/** |
|
* Run Hook |
|
* |
|
* Runs a particular hook |
|
* |
|
* @access private |
|
* @param array the hook details |
|
* @return bool |
|
*/ |
|
function _run_hook($data) |
|
{ |
|
if ( ! is_array($data)) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
// ----------------------------------- |
|
// Safety - Prevents run-away loops |
|
// ----------------------------------- |
|
|
|
// If the script being called happens to have the same |
|
// hook call within it a loop can happen |
|
|
|
if ($this->in_progress == TRUE) |
|
{ |
|
return; |
|
} |
|
|
|
// ----------------------------------- |
|
// Set file path |
|
// ----------------------------------- |
|
|
|
if ( ! isset($data['filepath']) OR ! isset($data['filename'])) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
$filepath = APPPATH.$data['filepath'].'/'.$data['filename']; |
|
|
|
if ( ! file_exists($filepath)) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
// ----------------------------------- |
|
// Set class/function name |
|
// ----------------------------------- |
|
|
|
$class = FALSE; |
|
$function = FALSE; |
|
$params = ''; |
|
|
|
if (isset($data['class']) AND $data['class'] != '') |
|
{ |
|
$class = $data['class']; |
|
} |
|
|
|
if (isset($data['function'])) |
|
{ |
|
$function = $data['function']; |
|
} |
|
|
|
if (isset($data['params'])) |
|
{ |
|
$params = $data['params']; |
|
} |
|
|
|
if ($class === FALSE AND $function === FALSE) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
// ----------------------------------- |
|
// Set the in_progress flag |
|
// ----------------------------------- |
|
|
|
$this->in_progress = TRUE; |
|
|
|
// ----------------------------------- |
|
// Call the requested class and/or function |
|
// ----------------------------------- |
|
|
|
if ($class !== FALSE) |
|
{ |
|
if ( ! class_exists($class)) |
|
{ |
|
require($filepath); |
|
} |
|
|
|
$HOOK = new $class; |
|
$HOOK->$function($params); |
|
} |
|
else |
|
{ |
|
if ( ! function_exists($function)) |
|
{ |
|
require($filepath); |
|
} |
|
|
|
$function($params); |
|
} |
|
|
|
$this->in_progress = FALSE; |
|
return TRUE; |
|
} |
|
|
|
} |
|
|
|
// END CI_Hooks class |
|
|
|
/* End of file Hooks.php */ |
|
/* Location: ./system/core/Hooks.php */ |