Add a guard against overlapping transactions.
[platal.git] / classes / platal.php
index 6c01c1b..90f2df3 100644 (file)
@@ -72,7 +72,7 @@ abstract class PlHook
             }
         }
         if (!$this->checkPerms()) {
-            if (!Platal::notAllowed()) {
+            if (Platal::notAllowed()) {
                 return PL_FORBIDDEN;
             }
         }
@@ -229,7 +229,7 @@ abstract class Platal
 
     public $ns;
     public $path;
-    public $argv;
+    public $argv = array();
 
     static private $_page = null;
 
@@ -267,7 +267,7 @@ abstract class Platal
             $this->mods[$module] = $m = PLModule::factory($module);
             $hooks = $m->handlers();
             foreach ($hooks as $path=>$hook) {
-                $this->hooks->addChild(split('/', $path), $hook);
+                $this->hooks->addChild(explode('/', $path), $hook);
             }
         }
 
@@ -302,7 +302,7 @@ abstract class Platal
 
     protected function find_hook()
     {
-        $p = split('/', $this->path);
+        $p = explode('/', $this->path);
         list($hook, $matched, $remain, $aliased) = $this->hooks->findChild($p);
         if (empty($hook)) {
             return null;
@@ -318,7 +318,7 @@ abstract class Platal
 
     public function near_hook()
     {
-        $p = split('/', $this->path);
+        $p = explode('/', $this->path);
         list($hook, $matched, $remain, $aliased) = $this->hooks->findNearestChild($p);
         if (empty($hook)) {
             return null;
@@ -360,18 +360,35 @@ abstract class Platal
             $this->path = 'index';
         }
 
-        $page->assign('platal', $this);
-        switch ($this->call_hook($page)) {
-          case PL_FORBIDDEN:
-            $this->mods['core']->handler_403($page);
-            break;
+        try {
+            $page->assign('platal', $this);
+            switch ($this->call_hook($page)) {
+              case PL_FORBIDDEN:
+                $this->mods['core']->handler_403($page);
+                break;
+
+              case PL_NOT_FOUND:
+                $this->mods['core']->handler_404($page);
+                break;
+
+              case PL_WIKI:
+                return PL_WIKI;
+            }
+        } catch (Exception $e) {
+            header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
 
-          case PL_NOT_FOUND:
-            $this->mods['core']->handler_404($page);
-            break;
+            $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);
 
-          case PL_WIKI:
-            return PL_WIKI;
+            if (self::globals()->debug) {
+                $page->kill(pl_entities($e->getMessage())
+                            . '<pre>' . pl_entities("" . $e) . '</pre>');
+            } else {
+                $page->kill(pl_entities($e->getMessage()));
+            }
         }
 
         $page->assign('platal', $this);
@@ -426,19 +443,13 @@ abstract class Platal
 
     public static function assert($cond, $error, $userfriendly = null)
     {
-        global $globals;
         if ($cond === false) {
-            header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
-            $file = fopen($globals->spoolroot . '/spool/tmp/assert_erros', 'a');
-            fwrite($file, '<pre>' . pl_entities($error) . '</pre>\n');
-            fclose($file);
-
             if ($userfriendly == null) {
                 $userfriendly = "Une erreur interne s'est produite.
                     Merci de réessayer la manipulation qui a déclenché l'erreur ;
                     si cela ne fonctionne toujours pas, merci de nous signaler le problème rencontré.";
             }
-            Platal::page()->kill($userfriendly);
+            throw new PlException($userfriendly, $error);
         }
     }