Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package             CodeIgniter
 * @author              ExpressionEngine Dev Team
 * @copyright   Copyright (c) 2008, 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.  Most of
 * this class is borrowed from Paul's Extension class in ExpressionEngine.
 *
 * @package             CodeIgniter
 * @subpackage  Libraries
 * @category    Libraries
 * @author              ExpressionEngine Dev Team
 * @link                http://codeigniter.com/user_guide/libraries/encryption.html
 */
class CI_Hooks {
        
        var $enabled            = FALSE;
        var $hooks              = array();
        var $in_progress        = FALSE;
        
        /**
         * Constructor
         *
         */
        function CI_Hooks()
        {
                $this->_initialize();   
                log_message('debug', "Hooks Class Initialized");
        }
        
        // --------------------------------------------------------------------

        /**
         * Initialize the Hooks Preferences
         *
         * @access      private
         * @return      void
         */     
        function _initialize()
        {
                $CFG =& load_class('Config');
                
                // 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.
                
                @include(APPPATH.'config/hooks'.EXT);
                
                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/libraries/Hooks.php */