| Server IP : 180.180.241.3 / Your IP : 216.73.216.35 Web Server : Microsoft-IIS/7.5 System : Windows NT NETWORK-NHRC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 User : IUSR ( 0) PHP Version : 5.3.28 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /AppServ/www/app/Plugin/DebugKit/Controller/Component/ |
Upload File : |
<?php
/**
* DebugKit DebugToolbar Component
*
* 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
* @package DebugKit.Controller.Component
* @since DebugKit 0.1
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
App::uses('CakeLog', 'Log');
App::uses('CakeLogInterface', 'Log');
App::uses('DebugTimer', 'DebugKit.Lib');
App::uses('DebugMemory', 'DebugKit.Lib');
App::uses('HelperCollection', 'View');
App::uses('CakeEventManager', 'Event');
App::uses('CakeEventListener', 'Event');
/**
* Class ToolbarComponent
*
* @package DebugKit.Controller.Component
* @since DebugKit 0.1
*/
class ToolbarComponent extends Component implements CakeEventListener {
/**
* Settings for the Component
*
* - forceEnable - Force the toolbar to display even if debug == 0. Default = false
* - autoRun - Automatically display the toolbar. If set to false, toolbar display can be triggered by adding
* `?debug=true` to your URL.
*
* @var array
*/
public $settings = array(
'forceEnable' => false,
'autoRun' => true
);
/**
* Controller instance reference
*
* @var object
*/
public $controller;
/**
* Components used by DebugToolbar
*
* @var array
*/
public $components = array('RequestHandler', 'Session');
/**
* The default panels the toolbar uses.
* which panels are used can be configured when attaching the component
*
* @var array
*/
protected $_defaultPanels = array(
'DebugKit.History',
'DebugKit.Session',
'DebugKit.Request',
'DebugKit.SqlLog',
'DebugKit.Timer',
'DebugKit.Log',
'DebugKit.Variables',
'DebugKit.Environment',
'DebugKit.Include'
);
/**
* Loaded panel objects.
*
* @var array
*/
public $panels = array();
/**
* javascript files component will be using
*
* @var array
*/
public $javascript = array(
'jquery' => 'DebugKit.jquery',
'libs' => 'DebugKit.js_debug_toolbar'
);
/**
* CSS files component will be using
*
* @var array
*/
public $css = array('DebugKit.debug_toolbar.css');
/**
* CacheKey used for the cache file.
*
* @var string
*/
public $cacheKey = 'toolbar_cache';
/**
* Duration of the debug kit history cache
*
* @var string
*/
public $cacheDuration = '+4 hours';
/**
* Status whether component is enable or disable
*
* @var boolean
*/
public $enabled = true;
/**
* Constructor
*
* If debug is off the component will be disabled and not do any further time tracking
* or load the toolbar helper.
*
* @param ComponentCollection $collection
* @param array $settings
* @return \ToolbarComponent
*/
public function __construct(ComponentCollection $collection, $settings = array()) {
$settings = array_merge((array)Configure::read('DebugKit'), $settings);
$panels = $this->_defaultPanels;
if (isset($settings['panels'])) {
$panels = $this->_makePanelList($settings['panels']);
unset($settings['panels']);
}
$this->controller = $collection->getController();
parent::__construct($collection, array_merge($this->settings, (array)$settings));
if (
!Configure::read('debug') &&
empty($this->settings['forceEnable'])
) {
$this->enabled = false;
return false;
}
if (
$this->settings['autoRun'] == false &&
!isset($this->controller->request->query['debug'])
) {
$this->enabled = false;
return false;
}
$this->controller->getEventManager()->attach($this);
DebugMemory::record(__d('debug_kit', 'Component initialization'));
$this->cacheKey .= $this->Session->read('Config.userAgent');
if (
in_array('DebugKit.History', $panels) ||
(isset($settings['history']) && $settings['history'] !== false)
) {
$this->_createCacheConfig();
}
$this->_loadPanels($panels, $settings);
return false;
}
/**
* Register all the timing handlers for core events.
*
* @return array
*/
public function implementedEvents() {
$before = function ($name) {
return function () use ($name) {
DebugTimer::start($name, __d('debug_kit', $name));
};
};
$after = function ($name) {
return function () use ($name) {
DebugTimer::stop($name);
};
};
return array(
'Controller.initialize' => array(
array('priority' => 0, 'callable' => $before('Event: Controller.initialize')),
array('priority' => 999, 'callable' => $after('Event: Controller.initialize'))
),
'Controller.startup' => array(
array('priority' => 0, 'callable' => $before('Event: Controller.startup')),
array('priority' => 999, 'callable' => $after('Event: Controller.startup'))
),
'Controller.beforeRender' => array(
array('priority' => 0, 'callable' => $before('Event: Controller.beforeRender')),
array('priority' => 999, 'callable' => $after('Event: Controller.beforeRender'))
),
'Controller.shutdown' => array(
array('priority' => 0, 'callable' => $before('Event: Controller.shutdown')),
array('priority' => 999, 'callable' => $after('Event: Controller.shutdown'))
),
'View.beforeRender' => array(
array('priority' => 0, 'callable' => $before('Event: View.beforeRender')),
array('priority' => 999, 'callable' => $after('Event: View.beforeRender'))
),
'View.afterRender' => array(
array('priority' => 0, 'callable' => $before('Event: View.afterRender')),
array('priority' => 999, 'callable' => $after('Event: View.afterRender'))
),
'View.beforeLayout' => array(
array('priority' => 0, 'callable' => $before('Event: View.beforeLayout')),
array('priority' => 999, 'callable' => $after('Event: View.beforeLayout'))
),
'View.afterLayout' => array(
array('priority' => 0, 'callable' => $before('Event: View.afterLayout')),
array('priority' => 999, 'callable' => $after('Event: View.afterLayout'))
),
);
}
/**
* Initialize callback.
* If automatically disabled, tell component collection about the state.
*
* @param Controller $controller
* @return bool
*/
public function initialize(Controller $controller) {
if (!$this->enabled) {
$this->_Collection->disable('Toolbar');
}
}
/**
* Go through user panels and remove default panels as indicated.
*
* @param array $userPanels The list of panels ther user has added removed.
* @return array Array of panels to use.
*/
protected function _makePanelList($userPanels) {
$panels = $this->_defaultPanels;
foreach ($userPanels as $key => $value) {
if (is_numeric($key)) {
$panels[] = $value;
}
if (is_string($key) && $value === false) {
$index = array_search($key, $panels);
if ($index !== false) {
unset($panels[$index]);
}
// Compatibility for when panels were not
// required to have a plugin prefix.
$alternate = 'DebugKit.' . ucfirst($key);
$index = array_search($alternate, $panels);
if ($index !== false) {
unset($panels[$index]);
}
}
}
return $panels;
}
/**
* Component Startup
*
* @param Controller $controller
* @return bool
*/
public function startup(Controller $controller) {
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$this->panels[$panelName]->startup($controller);
}
DebugTimer::start(
'controllerAction',
__d('debug_kit', 'Controller action')
);
DebugMemory::record(
__d('debug_kit', 'Controller action start')
);
}
/**
* beforeRedirect callback
*
* @param Controller $controller
* @param $url
* @param null $status
* @param bool $exit
* @return void
*/
public function beforeRedirect(Controller $controller, $url, $status = null, $exit = true) {
if (!class_exists('DebugTimer')) {
return null;
}
DebugTimer::stop('controllerAction');
DebugTimer::start(
'processToolbar',
__d('debug_kit', 'Processing toolbar state')
);
$vars = $this->_gatherVars($controller);
$this->_saveState($controller, $vars);
DebugTimer::stop('processToolbar');
}
/**
* beforeRender callback
*
* Calls beforeRender on all the panels and set the aggregate to the controller.
*
* @param Controller $controller
* @return void
*/
public function beforeRender(Controller $controller) {
if (!class_exists('DebugTimer')) {
return null;
}
DebugTimer::stop('controllerAction');
DebugTimer::start(
'processToolbar',
__d('debug_kit', 'Processing toolbar data')
);
$vars = $this->_gatherVars($controller);
$this->_saveState($controller, $vars);
$this->javascript = array_unique(array_merge($this->javascript, $vars['javascript']));
$this->css = array_unique(array_merge($this->css, $vars['css']));
unset($vars['javascript'], $vars['css']);
$controller->set(array(
'debugToolbarPanels' => $vars,
'debugToolbarJavascript' => $this->javascript,
'debugToolbarCss' => $this->css
));
$isHtml = (
!isset($controller->request->params['ext']) ||
$controller->request->params['ext'] === 'html'
);
if (!$controller->request->is('ajax') && $isHtml) {
$format = 'Html';
} else {
$format = 'FirePhp';
}
$controller->helpers[] = 'DebugKit.DebugTimer';
$controller->helpers['DebugKit.Toolbar'] = array(
'output' => sprintf('DebugKit.%sToolbar', $format),
'cacheKey' => $this->cacheKey,
'cacheConfig' => 'debug_kit',
'forceEnable' => $this->settings['forceEnable'],
);
DebugTimer::stop('processToolbar');
DebugMemory::record(__d('debug_kit', 'Controller render start'));
}
/**
* Load a toolbar state from cache
*
* @param int $key
* @return array
*/
public function loadState($key) {
$history = Cache::read($this->cacheKey, 'debug_kit');
if (isset($history[$key])) {
return $history[$key];
}
return array();
}
/**
* Create the cache config for the history
*
* @return void
*/
protected function _createCacheConfig() {
if (Configure::read('Cache.disable') !== true) {
$cache = array(
'duration' => $this->cacheDuration,
'engine' => 'File',
'path' => CACHE
);
if (isset($this->settings['cache'])) {
$cache = array_merge($cache, $this->settings['cache']);
}
Cache::config('debug_kit', $cache);
}
}
/**
* collects the panel contents
*
* @param Controller $controller
* @return array Array of all panel beforeRender()
*/
protected function _gatherVars(Controller $controller) {
$vars = array('javascript' => array(), 'css' => array());
$panels = array_keys($this->panels);
foreach ($panels as $panelName) {
$panel = $this->panels[$panelName];
$panelName = Inflector::underscore($panelName);
$vars[$panelName]['content'] = $panel->beforeRender($controller);
$elementName = Inflector::underscore($panelName) . '_panel';
if (isset($panel->elementName)) {
$elementName = $panel->elementName;
}
$vars[$panelName]['elementName'] = $elementName;
$vars[$panelName]['plugin'] = $panel->plugin;
$vars[$panelName]['title'] = $panel->title;
$vars[$panelName]['disableTimer'] = true;
if (!empty($panel->javascript)) {
$vars['javascript'] = array_merge($vars['javascript'], (array)$panel->javascript);
}
if (!empty($panel->css)) {
$vars['css'] = array_merge($vars['css'], (array)$panel->css);
}
}
return $vars;
}
/**
* Load Panels used in the debug toolbar
*
* @param $panels
* @param $settings
* @return void
*/
protected function _loadPanels($panels, $settings) {
foreach ($panels as $panel) {
$className = ucfirst($panel) . 'Panel';
list($plugin, $className) = pluginSplit($className, true);
App::uses($className, $plugin . 'Panel');
if (!class_exists($className)) {
trigger_error(__d('debug_kit', 'Could not load DebugToolbar panel %s', $panel), E_USER_WARNING);
continue;
}
$panelObj = new $className($settings);
if ($panelObj instanceof DebugPanel) {
list(, $panel) = pluginSplit($panel);
$this->panels[strtolower($panel)] = $panelObj;
}
}
}
/**
* Save the current state of the toolbar varibles to the cache file.
*
* @param \Controller|object $controller Controller instance
* @param array $vars Vars to save.
* @return void
*/
protected function _saveState(Controller $controller, $vars) {
$config = Cache::config('debug_kit');
if (empty($config) || !isset($this->panels['history'])) {
return;
}
$history = Cache::read($this->cacheKey, 'debug_kit');
if (empty($history)) {
$history = array();
}
if (count($history) == $this->panels['history']->history) {
array_pop($history);
}
if (isset($vars['variables']['content'])) {
// Remove unserializable native objects.
array_walk_recursive($vars['variables']['content'], function (&$item) {
if (
$item instanceof Closure ||
$item instanceof PDO ||
$item instanceof SimpleXmlElement
) {
$item = 'Unserializable object - ' . get_class($item);
} elseif ($item instanceof Exception) {
$item = sprintf(
'Unserializable object - %s. Error: %s in %s, line %s',
get_class($item),
$item,
$item->getMessage(),
$item->getFile(),
$item->getLine()
);
}
return $item;
});
}
unset($vars['history']);
array_unshift($history, $vars);
Cache::write($this->cacheKey, $history, 'debug_kit');
}
}