Improves site_errors.
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Tue, 12 Oct 2010 13:12:27 +0000 (15:12 +0200)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Tue, 12 Oct 2010 13:12:27 +0000 (15:12 +0200)
The new version include the context of the error and is easily extensible.

Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
classes/platal.php
classes/plerrorreport.php [new file with mode: 0644]
modules/core.php
templates/site_errors.tpl

index 90f2df3..4560f6e 100644 (file)
@@ -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, '<pre>' . date('Y-m-d G:i:s') . '</pre>'
-                        . '<pre>' . pl_entities("" . $e) . '</pre>'
-                        . '------------------------------------------------------------------' . "\n");
-            fclose($file);
-
+            PlErrorReport::report($e);
             if (self::globals()->debug) {
                 $page->kill(pl_entities($e->getMessage())
                             . '<pre>' . pl_entities("" . $e) . '</pre>');
diff --git a/classes/plerrorreport.php b/classes/plerrorreport.php
new file mode 100644 (file)
index 0000000..520acf0
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ **************************************************************************/
+
+class PlErrorReport
+{
+    public $date;
+    public $error;
+    public $state;
+
+    private function __construct($date, $error, $state = array())
+    {
+        $this->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:
+?>
index 1d2dcc4..f9b429d 100644 (file)
@@ -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.");
         }
     }
index ffdf1e5..0dfc722 100644 (file)
 {*                                                                        *}\r
 {**************************************************************************}\r
 \r
+<script type="text/javascript">\r
+{literal}\r
+// <![CDATA[\r
+$(document).ready(function() {\r
+  $(".error_state").click(function() {\r
+    $(this).children(".error_state_content").toggle();\r
+  });\r
+});\r
+// ]]>\r
+{/literal}\r
+</script>\r
+\r
 <h1>Erreurs d'exécution</h1>\r
-  {if $errors}\r
-    {$errors|smarty:nodefaults}\r
-  {else}\r
-<p>\r
-    Il n'y a pas d'erreurs actuellement recensées.\r
-</p>\r
-  {/if}\r
+  {iterate from=$errors item=error}\r
+  <fieldset>\r
+    <legend>{$error->date}</legend>\r
+    <pre>{$error->error}</pre>\r
+    {foreach from=$error->state item=table key=name}\r
+    <div class="error_state">\r
+      <div><strong>{$name} (click to show/hide content)</strong></div>\r
+      <div class="error_state_content" style="display: none">\r
+        {php}\r
+        $var = $this->get_template_vars('table');\r
+        var_dump($var);\r
+        {/php}\r
+      </div>\r
+    </div>\r
+    {/foreach}\r
+  </fieldset>\r
+  {/iterate}\r
 <form action="site_errors" method="post">\r
   <div>\r
     <input type="submit" name="clear" value="Effacer les erreurs" />\r