248 lines
4.6 KiB
PHP
248 lines
4.6 KiB
PHP
|
<?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 */
|