419 lines
15 KiB
PHP
419 lines
15 KiB
PHP
|
<?php
|
||
|
|
||
|
/**************************************/
|
||
|
/**** SuperSmash Framework ****/
|
||
|
/**** Created By SuperSmash ****/
|
||
|
/**** Started on: 25-04-2012 ****/
|
||
|
/**************************************/
|
||
|
|
||
|
namespace system\SuperSmash;
|
||
|
use settings\settings;
|
||
|
|
||
|
if (!defined("SUPERSMASH_FRAMEWORK")){die("You cannot access this page directly!");}
|
||
|
|
||
|
class Debug
|
||
|
{
|
||
|
// This variable will hold the instance of the class
|
||
|
private static $instance;
|
||
|
|
||
|
// This variable will hold the errorMessage
|
||
|
protected $errorMessage;
|
||
|
|
||
|
// This variable will hold the file that contains the error
|
||
|
protected $errorFile;
|
||
|
|
||
|
// This variable will hold the line the error is on
|
||
|
protected $errorLine;
|
||
|
|
||
|
// This variable will hold the level of the error
|
||
|
protected $errorLevel;
|
||
|
|
||
|
// This variable will hold the backTrace of the error
|
||
|
protected $errorTrace;
|
||
|
|
||
|
// This variable will hold check if we need to log the error
|
||
|
protected $logErrors;
|
||
|
|
||
|
// This variable will hold the error development level
|
||
|
protected $development;
|
||
|
|
||
|
// This variable will hold the original settings
|
||
|
protected $originalSettings;
|
||
|
|
||
|
// This variable will hold the the url Information
|
||
|
protected $urlInformation;
|
||
|
|
||
|
// This variable will hold the current language
|
||
|
protected $language;
|
||
|
|
||
|
// Create the constructor
|
||
|
public function __construct()
|
||
|
{
|
||
|
|
||
|
// Set the error reporting
|
||
|
$this->logErrors = configuration('logErrors', 'SuperSmash');
|
||
|
$this->development = configuration('development', 'SuperSmash');
|
||
|
|
||
|
// Save our original settings incase we change them midscript
|
||
|
$this->originalSettings['logErrors'] = $this->logErrors;
|
||
|
$this->originalSettings['development'] = $this->development;
|
||
|
|
||
|
// Get our URL info
|
||
|
$this->urlInformation = getUrlInformation();
|
||
|
}
|
||
|
|
||
|
// This function will trigger the error
|
||
|
public function triggerError($errorNumber, $message = '', $file = '', $line = 0, $backtrace = null)
|
||
|
{
|
||
|
// Language setup
|
||
|
$this->language = strtolower(configuration('language', 'SuperSmash'));
|
||
|
|
||
|
// fill in the attributes
|
||
|
$this->errorMessage = $message;
|
||
|
$this->errorFile = $file;
|
||
|
$this->errorLine = $line;
|
||
|
$this->errorTrace = $backtrace;
|
||
|
|
||
|
// Get the error Level
|
||
|
switch($errorNumber)
|
||
|
{
|
||
|
case E_USER_ERROR:
|
||
|
$this->errorLevel = 'Error';
|
||
|
$severity = 2;
|
||
|
break;
|
||
|
|
||
|
case E_USER_WARNING:
|
||
|
$this->errorLevel = 'Warning';
|
||
|
$severity = 1;
|
||
|
break;
|
||
|
|
||
|
case E_USER_NOTICE:
|
||
|
$this->errorLevel = 'Notice';
|
||
|
$severity = 1;
|
||
|
break;
|
||
|
|
||
|
case E_ERROR:
|
||
|
$this->errorLevel = 'Error';
|
||
|
$severity = 2;
|
||
|
break;
|
||
|
|
||
|
case E_WARNING:
|
||
|
$this->errorLevel = 'Warning';
|
||
|
$severity = 1;
|
||
|
break;
|
||
|
|
||
|
case E_NOTICE:
|
||
|
$this->errorLevel = 'Notice';
|
||
|
$severity = 1;
|
||
|
break;
|
||
|
|
||
|
case E_STRICT:
|
||
|
$this->errorLevel = 'Strict';
|
||
|
$severity = 1;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
$this->errorLevel = 'Error Code: '.$errorNumber;
|
||
|
$severity = 2;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Check if the error Logging is enabled
|
||
|
if ($this->logErrors)
|
||
|
{
|
||
|
$this->logError();
|
||
|
}
|
||
|
|
||
|
// Check if the error is important or the development environment is active
|
||
|
if($this->development || $severity == 2)
|
||
|
{
|
||
|
// create the error page
|
||
|
$this->createErrorPage();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This function will show a specific error page
|
||
|
public function showError($type)
|
||
|
{
|
||
|
if (ob_get_level() != 0)
|
||
|
{
|
||
|
ob_end_clean();
|
||
|
}
|
||
|
|
||
|
// Get the language
|
||
|
$language = strtolower (configuration('language', 'SuperSmash'));
|
||
|
|
||
|
// Get the site url
|
||
|
$websiteURL = $this->urlInformation['websiteURL'];
|
||
|
|
||
|
// See if there is a custom page in the app folder
|
||
|
if(file_exists(settings::getFilePath() . DS . settings::getApp() . 'pages' . DS . $this->language . DS . $type .'.php'))
|
||
|
{
|
||
|
ob_start();
|
||
|
require_once(settings::getFilePath() . DS . settings::getApp() . 'pages' . DS . $this->language . DS . $type .'.php');
|
||
|
$page = ob_get_contents();
|
||
|
$page = str_replace("<head>","<head>
|
||
|
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">
|
||
|
<meta name=\"generator\" content=\"SuperSmash Framework\" />"
|
||
|
,$page);
|
||
|
// Replace some footer values
|
||
|
$Benchmark = loadClass('Benchmark');
|
||
|
$page = str_replace('{elapsed}', $Benchmark->elapsed('system', 4), $page);
|
||
|
$page = str_replace('{usage}', $Benchmark->usage(), $page);
|
||
|
ob_end_clean();
|
||
|
die($page);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ob_start();
|
||
|
require_once(SYSTEM . DS . "SuperSmash" . DS . 'pages' . DS . $this->language . DS . $type .'.php');
|
||
|
$page = ob_get_contents();
|
||
|
$page = str_replace("<head>","<head>
|
||
|
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">
|
||
|
<meta name=\"generator\" content=\"SuperSmash Framework\" />"
|
||
|
,$page);
|
||
|
// Replace some footer values
|
||
|
$Benchmark = loadClass('Benchmark');
|
||
|
$page = str_replace('{elapsed}', $Benchmark->elapsed('system', 4), $page);
|
||
|
$page = str_replace('{usage}', $Benchmark->usage(), $page);
|
||
|
ob_end_clean();
|
||
|
die($page);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This function will log the error to the log file
|
||
|
protected function logError()
|
||
|
{
|
||
|
|
||
|
// Get the site url
|
||
|
$url = $this->urlInformation;
|
||
|
|
||
|
// Create the log message
|
||
|
$err_message = "| Logging started at: ". date('Y-m-d H:i:s') ."\n";
|
||
|
$err_message .= "| Error Level: ".$this->errorLevel ."\n";
|
||
|
$err_message .= "| Message: ".$this->errorMessage ."\n";
|
||
|
$err_message .= "| Reporting File: ".$this->errorFile."\n";
|
||
|
$err_message .= "| Error Line: ".$this->errorLine."\n";
|
||
|
$err_message .= "| URL When Error Occured: ". $url['websiteURL'] ."/". $url['uri'] ."\n\n";
|
||
|
$err_message .= "--------------------------------------------------------------------\n\n";
|
||
|
|
||
|
// Write to the log file
|
||
|
$log = @fopen(SYSTEM . DS . 'editable' . DS . 'logs' . DS . ERROR, 'a');
|
||
|
@fwrite($log, $err_message);
|
||
|
@fclose($log);
|
||
|
}
|
||
|
|
||
|
// This function will log the message to the debugging log
|
||
|
public function log($message, $filename = DEBUG)
|
||
|
{
|
||
|
|
||
|
// Create the log message
|
||
|
$logMessage = "(".date('Y-m-d H:i:s') .") ".$message ."\n";
|
||
|
|
||
|
// Write to the log file
|
||
|
if (file_exists(settings::getFilePath() . DS . settings::getApp() . DS . "logs"))
|
||
|
{
|
||
|
$log = @fopen(settings::getFilePath() . DS . settings::getApp() . DS . "logs" . DS . $filename, 'a');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$log = @fopen(SYSTEM . DS . 'editable' . DS . 'logs' . DS . $filename, 'a');
|
||
|
}
|
||
|
@fwrite($log, $logMessage);
|
||
|
@fclose($log);
|
||
|
}
|
||
|
|
||
|
// This function will enable or disable errorReporting
|
||
|
public function errorReporting($report = true)
|
||
|
{
|
||
|
if($report)
|
||
|
{
|
||
|
// Set the error reporting back to the original state
|
||
|
$this->logErrors = $this->originalSettings['logErrors'];
|
||
|
$this->development = $this->originalSettings['development'];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Use the custom error reporting
|
||
|
$this->logErrors = 0;
|
||
|
$this->development = 0;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// This function will build the error page
|
||
|
protected function createErrorPage()
|
||
|
{
|
||
|
if (ob_get_level() != 0)
|
||
|
{
|
||
|
ob_end_clean();
|
||
|
}
|
||
|
|
||
|
// Get the site url
|
||
|
$websiteURL = $this->urlInformation['websiteURL'];
|
||
|
|
||
|
// Get the correct error message
|
||
|
ob_start();
|
||
|
if(!$this->development)
|
||
|
{
|
||
|
require_once(SYSTEM . DS . "SuperSmash" . DS . 'pages' . DS . 'error.php');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
require_once(SYSTEM . DS . "SuperSmash" . DS . 'pages' . DS . 'debug_error.php');
|
||
|
}
|
||
|
|
||
|
$page = ob_get_contents();
|
||
|
|
||
|
// Replace some footer values
|
||
|
$Benchmark = loadClass('Benchmark');
|
||
|
$page = str_replace('{elapsed}', $Benchmark->elapsed('system', 4), $page);
|
||
|
$page = str_replace('{usage}', $Benchmark->usage(), $page);
|
||
|
|
||
|
ob_end_clean();
|
||
|
|
||
|
// If we are debugging, build the debug block
|
||
|
if($this->development)
|
||
|
{
|
||
|
// Create the regex, and search for it
|
||
|
$regex = "{DEBUG}(.*){/DEBUG}";
|
||
|
while(preg_match("~". $regex ."~iUs", $page, $match))
|
||
|
{
|
||
|
$blocks = '';
|
||
|
|
||
|
// We dont need the first trace because its in the error message
|
||
|
unset($this->errorTrace[0]);
|
||
|
$i = 1;
|
||
|
|
||
|
// Make sure we have at least 1 backtrace!
|
||
|
if(count($this->errorTrace) > 0)
|
||
|
{
|
||
|
// Loop through each level and add it to the $blocks var.
|
||
|
foreach($this->errorTrace as $key => $value)
|
||
|
{
|
||
|
$block = $match[1];
|
||
|
$block = str_replace('{#}', $key++, $block);
|
||
|
|
||
|
// Loop though each variable in the Trace level
|
||
|
foreach($value as $key => $value)
|
||
|
{
|
||
|
|
||
|
// Upper case the key
|
||
|
$key = strtoupper($key);
|
||
|
|
||
|
// If $v is an object, then go to next loop
|
||
|
if(is_object($value))
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// If $v is an array, we need to dump it
|
||
|
if(is_array($value))
|
||
|
{
|
||
|
$value = "<pre>" . $this->var_dump($value, $key) . "</pre>";
|
||
|
}
|
||
|
|
||
|
$block = str_replace("{".$key."}", $value, $block);
|
||
|
}
|
||
|
|
||
|
// Add to blocks
|
||
|
$blocks .= $block;
|
||
|
|
||
|
// We only want to do this no more then 3 times
|
||
|
if($i == 2)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
$i++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Finally replace the whole thing with $blocks
|
||
|
$page = str_replace($match[0], $blocks, $page);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// add the error information to the page
|
||
|
$page = str_replace("{ERROR_COPYRIGHT}", "SuperSmash Framework ©" . date("Y") . " <a href=\"http://www.SuperSmash.nl\">SuperSmash</a>", $page);
|
||
|
$page = str_replace("{ERROR_LEVEL}", $this->errorLevel, $page);
|
||
|
$page = str_replace("{MESSAGE}", $this->errorMessage, $page);
|
||
|
$page = str_replace("{FILE}", $this->errorFile, $page);
|
||
|
$page = str_replace("{LINE}", $this->errorLine, $page);
|
||
|
|
||
|
die($page);
|
||
|
}
|
||
|
|
||
|
// This function will create a var dump
|
||
|
protected function var_dump($variable, $var_name = null, $indent = null)
|
||
|
{
|
||
|
// create an empty html variable
|
||
|
$html = '';
|
||
|
|
||
|
// Create the tabIndentation style
|
||
|
$tab_line = "<span style='color:red;'>|</span>   ";
|
||
|
|
||
|
|
||
|
// Grab our variable type and get our text color
|
||
|
$type = ucfirst(gettype($variable));
|
||
|
|
||
|
switch($type)
|
||
|
{
|
||
|
case "Array":
|
||
|
// Count our number of keys in the array
|
||
|
$count = count($variable);
|
||
|
$html .= "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:red'>$type ($count)</span><br />$indent(<br />";
|
||
|
$keys = array_keys($variable);
|
||
|
|
||
|
// Foreach array key, we need to get the value.
|
||
|
foreach($keys as $name)
|
||
|
{
|
||
|
$value = $variable[$name];
|
||
|
$html .= $this->var_dump($value, "['$name']", $indent.$tab_line);
|
||
|
}
|
||
|
$html .= "$indent)<br />";
|
||
|
break;
|
||
|
|
||
|
case "String":
|
||
|
$type_color = "<span style='color:green'>";
|
||
|
$html .= "$indent$var_name = <span style='color:orange'>$type(".strlen($variable).")</span> $type_color\"$variable\"</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "Integer":
|
||
|
$type_color = "<span style='color:red'>";
|
||
|
$html .= "$indent$var_name = <span style='color:blue'>$type(".strlen($variable).")</span> $type_color$variable</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "Double":
|
||
|
$type_color = "<span style='color:red'>";
|
||
|
$type = "Float";
|
||
|
$html .= "$indent$var_name = <span style='color:blue'>$type(".strlen($variable).")</span> $type_color$variable</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "Boolean":
|
||
|
$type_color = "<span style='color:blue'>";
|
||
|
$html .= "$indent$var_name = <span style='color:brown'>$type(".strlen($variable).")</span> $type_color".($variable == 1 ? "true":"false")."</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "null":
|
||
|
$type_color = "<span style='color:black'>";
|
||
|
$html .= "$indent$var_name = <span style='color:purple'>$type(".strlen($variable).")</span> ".$type_color."null</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "Object":
|
||
|
$type_color = "<span style='color:black'>";
|
||
|
$html .= "$indent$var_name = <span style='color:yellow'>$type</span><br />";
|
||
|
break;
|
||
|
|
||
|
case "Resource":
|
||
|
$type_color = "<span style='color:black'>";
|
||
|
$html .= "$indent$var_name = <span style='color:yellow'>$type</span> ".$type_color."Resource</span><br />";
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
$html .= "$indent$var_name = <span style='color:red'>$type(".@strlen($variable).")</span> $variable<br />";
|
||
|
break;
|
||
|
}
|
||
|
return $html;
|
||
|
}
|
||
|
}
|
||
|
?>
|