Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('DebugPanel', 'DebugKit.Lib');

/**
 * Provides a list of included files for the current request
 *
 */
class IncludePanel extends DebugPanel {

/**
 * The list of plugins within the application
 *
 * @var <type>
 */
        protected $_pluginPaths = array();

/**
 * File Types
 *
 * @var array
 */
        protected $_fileTypes = array(
                'Cache', 'Config', 'Configure', 'Console', 'Component', 'Controller',
                'Behavior', 'Datasource', 'Model', 'Plugin', 'Test', 'View', 'Utility',
                'Network', 'Routing', 'I18n', 'Log', 'Error'
        );

/**
 * Get a list of plugins on construct for later use
 */
        public function __construct() {
                foreach (CakePlugin::loaded() as $plugin) {
                        $this->_pluginPaths[$plugin] = CakePlugin::path($plugin);
                }

                parent::__construct();
        }

/**
 * Get a list of files that were included and split them out into the various parts of the app
 *
 * @param Controller $controller
 * @return array
 */
        public function beforeRender(Controller $controller) {
                $return = array('core' => array(), 'app' => array(), 'plugins' => array());

                foreach (get_included_files() as $file) {
                        $pluginName = $this->_isPluginFile($file);

                        if ($pluginName) {
                                $return['plugins'][$pluginName][$this->_getFileType($file)][] = $this->_niceFileName($file, $pluginName);
                        } elseif ($this->_isAppFile($file)) {
                                $return['app'][$this->_getFileType($file)][] = $this->_niceFileName($file, 'app');
                        } elseif ($this->_isCoreFile($file)) {
                                $return['core'][$this->_getFileType($file)][] = $this->_niceFileName($file, 'core');
                        }
                }

                $return['paths'] = $this->_includePaths();

                ksort($return['core']);
                ksort($return['plugins']);
                ksort($return['app']);
                return $return;
        }

/**
 * Get the possible include paths
 * @return array
 */
        protected function _includePaths() {
                $paths = array_flip(array_merge(explode(PATH_SEPARATOR, get_include_path()), array(CAKE)));

                unset($paths['.']);
                return array_flip($paths);
        }

/**
 * Check if a path is part of cake core
 * @param string $file
 * @return boolean
 */
        protected function _isCoreFile($file) {
                return strstr($file, CAKE);
        }

/**
 * Check if a path is from APP but not a plugin
 * @param string $file
 * @return boolean
 */
        protected function _isAppFile($file) {
                return strstr($file, APP);
        }

/**
 * Check if a path is from a plugin
 * @param string $file
 * @return boolean
 */
        protected function _isPluginFile($file) {
                foreach ($this->_pluginPaths as $plugin => $path) {
                        if (strstr($file, $path)) {
                                return $plugin;
                        }
                }

                return false;
        }

/**
 * Replace the path with APP, CORE or the plugin name
 * @param string $file
 * @param string
 *  - app for app files
 *  - core for core files
 *  - PluginName for the name of a plugin
 * @return boolean
 */
        protected function _niceFileName($file, $type) {
                switch ($type) {
                        case 'app':
                                return str_replace(APP, 'APP/', $file);

                        case 'core':
                                return str_replace(CAKE, 'CORE/', $file);

                        default:
                                return str_replace($this->_pluginPaths[$type], $type . '/', $file);
                }
        }

/**
 * Get the type of file (model, controller etc)
 * @param string $file
 * @return string
 */
        protected function _getFileType($file) {
                foreach ($this->_fileTypes as $type) {
                        if (stripos($file, '/' . $type . '/') !== false) {
                                return $type;
                        }
                }

                return 'Other';
        }
}