From 40b79bfc4a940747b434d9611601007d7026b473 Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Tue, 12 Oct 2010 15:12:27 +0200 Subject: [PATCH] Improves site_errors. The new version include the context of the error and is easily extensible. Signed-off-by: Florent Bruneau --- classes/platal.php | 9 +--- classes/plerrorreport.php | 112 ++++++++++++++++++++++++++++++++++++++++++++++ modules/core.php | 7 +-- templates/site_errors.tpl | 36 ++++++++++++--- 4 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 classes/plerrorreport.php diff --git a/classes/platal.php b/classes/platal.php index 90f2df3..4560f6e 100644 --- a/classes/platal.php +++ b/classes/platal.php @@ -219,7 +219,6 @@ class PlHookTree } } - abstract class Platal { private $mods; @@ -376,13 +375,7 @@ abstract class Platal } } catch (Exception $e) { header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error'); - - $file = fopen(self::globals()->spoolroot . '/spool/tmp/site_errors', 'a'); - fwrite($file, '
' . date('Y-m-d G:i:s') . '
' - . '
' . pl_entities("" . $e) . '
' - . '------------------------------------------------------------------' . "\n"); - fclose($file); - + PlErrorReport::report($e); if (self::globals()->debug) { $page->kill(pl_entities($e->getMessage()) . '
' . pl_entities("" . $e) . '
'); diff --git a/classes/plerrorreport.php b/classes/plerrorreport.php new file mode 100644 index 0000000..520acf0 --- /dev/null +++ b/classes/plerrorreport.php @@ -0,0 +1,112 @@ +date = $date; + $this->error = "" . $error; + $this->state = $state; + } + + private function toCSV() + { + return array($this->date, $this->error, serialize($this->state)); + } + + public function fromCSV(array $entry) + { + return new PlErrorReport($entry[0], $entry[1], unserialize($entry[2])); + } + + public static function report($error) + { + $error = new PlErrorReport(date('Y-m-d G:i:s'), $error, + array('Session' => $_SESSION, + 'Env' => $_REQUEST, + 'Post' => $_POST, + 'Get' => $_GET, + 'Cookie' => $_COOKIE, + 'Server' => $_SERVER)); + + $file = fopen(Platal::globals()->spoolroot . '/spool/tmp/site_errors', 'a'); + fputcsv($file, $error->toCSV()); + fclose($file); + } + + public static function iterate() + { + return new PlErrorReportIterator(); + } + + public static function clear() + { + @unlink(Platal::globals()->spoolroot . '/spool/tmp/site_errors'); + } +} + +class PlErrorReportIterator implements PlIterator +{ + private $file; + + public function __construct() + { + $this->file = fopen(Platal::globals()->spoolroot . '/spool/tmp/site_errors', 'r'); + } + + public function next() + { + if (!$this->file) { + return null; + } + $entry = fgetcsv($this->file); + if ($entry === false) { + fclose($this->file); + $this->file = null; + return null; + } + $value = PlErrorReport::fromCSV($entry); + return $value; + } + + public function total() + { + return 0; + } + + public function first() + { + return false; + } + + public function last() + { + return false; + } +} + +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: +?> diff --git a/modules/core.php b/modules/core.php index 1d2dcc4..f9b429d 100644 --- a/modules/core.php +++ b/modules/core.php @@ -181,12 +181,9 @@ class CoreModule extends PLModule function handler_siteerror($page) { global $globals; $page->coreTpl('site_errors.tpl'); - $file = @file_get_contents($globals->spoolroot . '/spool/tmp/site_errors'); - if ($file !== false) { - $page->assign('errors', utf8_encode($file)); - } + $page->assign('errors', PlErrorReport::iterate()); if (Post::has('clear')) { - @unlink($globals->spoolroot . '/spool/tmp/site_errors'); + PlErrorReport::clear(); $page->trigSuccess("Erreurs effacées."); } } diff --git a/templates/site_errors.tpl b/templates/site_errors.tpl index ffdf1e5..0dfc722 100644 --- a/templates/site_errors.tpl +++ b/templates/site_errors.tpl @@ -20,14 +20,36 @@ {* *} {**************************************************************************} + +

Erreurs d'exécution

- {if $errors} - {$errors|smarty:nodefaults} - {else} -

- Il n'y a pas d'erreurs actuellement recensées. -

- {/if} + {iterate from=$errors item=error} +
+ {$error->date} +
{$error->error}
+ {foreach from=$error->state item=table key=name} +
+
{$name} (click to show/hide content)
+ +
+ {/foreach} +
+ {/iterate}
-- 2.1.4