nouveau module "models" dans l'environnement
[mtweb] / mw / env / modules / mw_env_run.php
index 30d89cf..5d7a24d 100644 (file)
@@ -3,6 +3,7 @@
   class mw_env_run extends mw_env{
 
     var $etat;
+    var $controllers;
 
     function user(){
       $data = $this->data();
         if(!$valid_role || $this->action_allowed($this->etat, false)){
           return $this->etat;
         }
-        else $this->erreur("Vous n'avez pas le role requis pour effectuer cette action");
+        else{
+          $etat = $this->etat;
+          $this->erreur("Vous n'avez pas le role requis pour effectuer cette action");
+          $this->call_observers("action_permission_denied", array("etat" => $etat));
+        }
       }
       else $this->erreur("etat invalide");
       return false;
     }
 
     function valid_etat($etat){
-      $_etat = array();
-      $_etat["mod"] = "";
-      $_etat["controller"] = "";
-      $_etat["action"] = "";
+      $_etat = array(
+        "mod" => "",
+        "controller" => "",
+        "action" => ""
+      );
       if(is_array($etat)){
         $_etat["mod"] = isset($etat["mod"]) ? $etat["mod"] : "";
         $_etat["controller"] = isset($etat["controller"]) ? $etat["controller"] : "";
 
     function run($etat, $valid_role = true, $params = array(), $method = "GET"){
       if($this->set_etat($etat, $valid_role)){
-        $controller_file = "mods/".$this->etat("mod")."/".$this->etat("controller").".php";
-        if($this->app_file_exists($controller_file = "mods/".$this->etat("mod")."/".$this->etat("controller").".php", "DESC")){
-          if(!class_exists("mw_mod")) require $this->app_file("mods/mw_mod.php");
-          if(!class_exists($controller_class = "mw_".$this->etat("mod")."_".$this->etat("controller"))){
-            require $this->app_file($controller_file, "DESC");
-          }
-          if(class_exists($controller_class)){
-            $controller = new $controller_class();
-            $action_method = $this->etat("action");
-            if(method_exists($controller, $action_method)){
-              foreach($params as $key => $value){
-                switch(strtolower($method)){
-                  case "get": $_GET[$this->param($key)] = $value; break;
-                  case "post": $_POST[$key] = $value; break;
-                  default: break;
-                }
+        if($controller = $this->get_controller($this->etat("mod")."/".$this->etat("controller"))){
+          $action_method = $this->etat("action");
+          if(method_exists($controller, $action_method)){
+            foreach($params as $key => $value){
+              switch(strtolower($method)){
+                case "get": $_GET[$this->param($key)] = $value; break;
+                case "post": $_POST[$key] = $value; break;
+                default: break;
               }
-              if(($controller_validate = $controller->validate($this)) === true){
-                if(($controller_prepare_inputs = $controller->prepare_inputs($this)) === true){
-                  $etat_before = $this->etat;
-                  $this->call_observers("before_action");
-                  $controller->$action_method($this);
-                  $etat_after = $this->etat;
-                  $this->etat = $etat_before;
-                  $this->call_observers("after_action");
-                  $this->etat = $etat_after;
-                }
-                else $this->erreur($controller_prepare_inputs);
+            }
+            if(($controller_validate = $controller->validate()) === true){
+              if(($controller_prepare_inputs = $controller->prepare_inputs()) === true){
+                $etat_before = $this->etat;
+                $this->call_observers("before_action");
+                $controller->$action_method($this);
+                $etat_after = $this->etat;
+                $this->etat = $etat_before;
+                $this->call_observers("after_action");
+                $this->etat = $etat_after;
               }
-              else $this->erreur($controller_validate);
+              else $this->erreur($controller_prepare_inputs);
             }
-            else $this->erreur("Impossible de trouver l'action ".$this->etat("action"));
+            else $this->erreur($controller_validate);
           }
-          else $this->erreur("Impossible d'instancier le controleur ".$this->etat("controller"));
+          else $this->erreur("Impossible de trouver l'action ".$this->etat("action"));
         }
-        else $this->erreur("Impossible de trouver le controleur ".$this->etat("controller")." pour le module ".$this->etat("mod"));
+        else $this->erreur("Impossible d'instancier le controleur ".$this->etat("controller"));
       }
-      else $this->erreur("Impossible d'effectuer cette action");
     }
 
     function is_running($etat){
-      if($etat = $this->valid_etat($etat)){
-        return
-            ($etat["mod"] == $this->etat("mod"))
-        &&  ($etat["controller"] == $this->etat("controller"))
-        &&  ($etat["action"] == $this->etat("action"));
+      $_etat = array();
+      if(is_array($etat)){
+        if(isset($etat["mod"])){
+          $_etat["mod"] = $etat["mod"];
+          if(isset($etat["controller"])){
+            $_etat["controller"] = $etat["controller"];
+            if(isset($etat["action"])) $_etat["action"] = $etat["action"];
+          }
+        }
       }
-      return false;
+      else{
+        $etat = explode("/", $etat);
+        foreach($etat as $etat_item){
+          if($etat_item){
+            if(!isset($_etat["mod"])) $_etat["mod"] = $etat_item;
+            else{
+              if(!isset($_etat["controller"])) $_etat["controller"] = $etat_item;
+              else{
+                if(!isset($_etat["action"])) $_etat["action"] = $etat_item;
+                break;
+              }
+            }
+          }
+        }
+      }
+      $IS_RUNNING = true;
+      if($IS_RUNNING && isset($_etat["mod"])) $IS_RUNNING = ($_etat["mod"] == $this->etat("mod"));
+      if($IS_RUNNING && isset($_etat["controller"])) $IS_RUNNING = ($_etat["controller"] == $this->etat("controller"));
+      if($IS_RUNNING && isset($_etat["action"])) $IS_RUNNING = ($_etat["action"] == $this->etat("action"));
+      return $IS_RUNNING;
     }
 
     function etat($name = null){
       return $this->etat[$name];
     }
 
-    function check_stop(){
-      return $this->etat("mod") == "reponses";
-    }
-
-    function get_mod($mod_name){
-      if($etat = $this->valid_etat($mod_name)){
-        if($this->app_file_exists($controller_file = "mods/".$etat["mod"]."/".$etat["controller"].".php")){
-          if(!class_exists("mw_mod")) require $this->app_file("mods/mw_mod.php");
-          if(!class_exists($controller_class = "mw_".$etat["mod"]."_".$etat["controller"])){
-            require $this->app_file($controller_file);
-          }
-          if(class_exists($controller_class)){
-            return new $controller_class();
+    function get_controller($controller_path){
+      if($etat = $this->valid_etat($controller_path)){
+        if(!isset($this->controllers)) $this->controllers = array();
+        if(!isset($this->controllers[$etat["mod"]])) $this->controllers[$etat["mod"]] = array();
+        if(!isset($this->controllers[$etat["mod"]][$etat["controller"]])){
+          $controller_class = "mw_".$etat["mod"]."_".$etat["controller"];
+          if(!class_exists($controller_class)){
+            $controller_file = "controllers/".$etat["mod"]."/".$etat["controller"].".php";
+            if($this->app_file_exists($controller_file, "DESC")){
+              require_once $this->app_file($controller_file, "DESC");
+            }
+            if(!class_exists($controller_class)) return false;
           }
+          $this->controllers[$etat["mod"]][$etat["controller"]] = new $controller_class();
+          $this->controllers[$etat["mod"]][$etat["controller"]]->set_env($this);
         }
+        return $this->controllers[$etat["mod"]][$etat["controller"]];
       }
       return false;
     }
 
   }
 
+  class mw_controller{
+
+    var $env;
+
+    function set_env(&$env){
+      $this->env = &$env;
+    }
+
+    function env(){
+      return $this->env;
+    }
+
+    function validate(){
+      return true;
+    }
+
+    function prepare_inputs(){
+      return true;
+    }
+
+  }
+
 ?>
\ No newline at end of file