f88acd35fe5883f577fa62c6cc73b0dbf492d41f
[mtweb] / mw / env / modules / mw_env_run.php
1 <?php
2
3   class mw_env_run extends mw_env{
4
5     var $etat;
6     var $controllers;
7
8     function user(){
9       if(!($data = $this->data())) return array();
10       return $data->get_session_user();
11     }
12
13     function set_etat($etat, $valid_role = true){
14       if(($this->etat = $this->valid_etat($etat)) !== false){
15         if(!$valid_role || $this->action_allowed($this->etat, false)){
16           return $this->etat;
17         }
18         else{
19           $etat = $this->etat;
20           $this->erreur("Vous n'avez pas le role requis pour effectuer cette action");
21           $this->call_observers("action_permission_denied", array("etat" => $etat));
22         }
23       }
24       else $this->erreur("etat invalide");
25       return false;
26     }
27
28     function valid_etat($etat){
29       $_etat = array(
30         "mod" => "",
31         "controller" => "",
32         "action" => ""
33       );
34       if(is_array($etat)){
35         $_etat["mod"] = isset($etat["mod"]) ? $etat["mod"] : "";
36         $_etat["controller"] = isset($etat["controller"]) ? $etat["controller"] : "";
37         $_etat["action"] = isset($etat["action"]) ? $etat["action"] : "";
38       }
39       else{
40         $etat = explode("/", $etat);
41         foreach($etat as $etat_item){
42           if($etat_item){
43             if(!$_etat["mod"]) $_etat["mod"] = $etat_item;
44             else{
45               if(!$_etat["controller"]) $_etat["controller"] = $etat_item;
46               else{
47                 if(!$_etat["action"]) $_etat["action"] = $etat_item;
48                 break;
49               }
50             }
51           }
52         }
53       }
54       if(!$_etat["mod"]){
55         $_etat["mod"] = "index";
56         $_etat["controller"] = "index";
57         $_etat["action"] = "index";
58       }
59       else{
60         if(!$_etat["controller"]){
61           $_etat["controller"] = "index";
62           $_etat["action"] = "index";
63         }
64         else{
65           if(!$_etat["action"]) $_etat["action"] = "index";
66         }
67       }
68       if(
69            is_array($_etat)
70         && count($_etat) == 3
71         && isset($_etat["mod"]) && preg_match("/^[a-zA-Z0-9_]+$/", $_etat["mod"])
72         && isset($_etat["controller"]) && preg_match("/^[a-zA-Z0-9_]+$/", $_etat["controller"])
73         && isset($_etat["action"]) && preg_match("/^[a-zA-Z0-9_]+$/", $_etat["action"])
74       ){
75         return $_etat;
76       }
77       return false;
78     }
79
80     function etat_is_valid(){
81       return $this->valid_etat($this->etat);
82     }
83
84     function action_allowed($etat, $CHECK_FORMAT = true){
85       if(!$this->bdd("sgbd")) return false;
86       $data = $this->data();
87       if($CHECK_FORMAT) $etat = $this->valid_etat($etat);
88       if($etat === false){
89         $this->erreur("etat invalide");
90         return false;
91       }
92       if(($user_roles = $data->get_user_roles()) === false){
93         $this->erreur("Impossible de lire les roles de l'utilisateur courant");
94         return false;
95       }
96       if(!$user_roles){
97         $this->erreur("L'utilisateur courant n'a aucun role");
98         return false;
99       }
100       if(
101         (
102           $action_roles = $data->get_action_roles(
103             $etat["mod"],
104             $etat["controller"],
105             $etat["action"]
106           )
107         ) === false
108       ){
109         $this->erreur("Impossible de lire les roles des actions en base");
110         return false;
111       }
112       foreach($user_roles as $id_role){
113         $OK = $this->config("default_allow");
114         $action = $etat["mod"];
115         if(isset($action_roles[$action])){
116           $OK =
117                (isset($action_roles[$action][0]) && $action_roles[$action][0])
118             || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
119         }
120         if(!$OK){
121           $action = $etat["mod"]."/".$etat["controller"];
122           if(isset($action_roles[$action])){
123             $OK =
124                  (isset($action_roles[$action][0]) && $action_roles[$action][0])
125               || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
126           }
127         }
128         if(!$OK){
129           $action = $etat["mod"]."/".$etat["controller"]."/".$etat["action"];
130           if(isset($action_roles[$action])){
131             $OK =
132                  (isset($action_roles[$action][0]) && $action_roles[$action][0])
133               || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
134           }
135         }
136         if($OK) break;
137       }
138       return $OK;
139     }
140
141     function run($etat, $params = array(), $valid_role = true){
142       if($this->set_etat($etat, $valid_role)){
143         if($controller = $this->get_controller($this->etat("mod")."/".$this->etat("controller"))){
144           $action_method = $this->etat("action");
145           if(method_exists($controller, $action_method)){
146             foreach($params as $params_method => $values){
147               foreach($values as $key => $value){
148                 switch(strtolower($params_method)){
149                   case "get":
150                     $_GET[$this->param($key)] = $value;
151                     break;
152                   case "post":
153                     $_POST[$key] = $value;
154                     break;
155                 }
156               }
157             }
158             if(($controller_validate = $controller->validate()) === true){
159               if(($controller_prepare_inputs = $controller->prepare_inputs()) === true){
160                 $etat_before = $this->etat;
161                 $this->call_observers("before_action");
162                 $controller->$action_method($this);
163                 $etat_after = $this->etat;
164                 $this->etat = $etat_before;
165                 $this->call_observers("after_action");
166                 $this->etat = $etat_after;
167               }
168               else $this->erreur($controller_prepare_inputs);
169             }
170             else $this->erreur($controller_validate);
171           }
172           else $this->erreur("Impossible de trouver l'action ".$this->etat("action"));
173         }
174         else $this->erreur("Impossible d'instancier le controleur ".$this->etat("controller"));
175       }
176     }
177
178     function is_running($etat){
179       $_etat = array();
180       if(is_array($etat)){
181         if(isset($etat["mod"])){
182           $_etat["mod"] = $etat["mod"];
183           if(isset($etat["controller"])){
184             $_etat["controller"] = $etat["controller"];
185             if(isset($etat["action"])) $_etat["action"] = $etat["action"];
186           }
187         }
188       }
189       else{
190         $etat = explode("/", $etat);
191         foreach($etat as $etat_item){
192           if($etat_item){
193             if(!isset($_etat["mod"])) $_etat["mod"] = $etat_item;
194             else{
195               if(!isset($_etat["controller"])) $_etat["controller"] = $etat_item;
196               else{
197                 if(!isset($_etat["action"])) $_etat["action"] = $etat_item;
198                 break;
199               }
200             }
201           }
202         }
203       }
204       $IS_RUNNING = true;
205       if($IS_RUNNING && isset($_etat["mod"])) $IS_RUNNING = ($_etat["mod"] == $this->etat("mod"));
206       if($IS_RUNNING && isset($_etat["controller"])) $IS_RUNNING = ($_etat["controller"] == $this->etat("controller"));
207       if($IS_RUNNING && isset($_etat["action"])) $IS_RUNNING = ($_etat["action"] == $this->etat("action"));
208       return $IS_RUNNING;
209     }
210
211     function etat($name = null){
212       if(!isset($name)) return $this->etat;
213       return $this->etat[$name];
214     }
215
216     function get_controller($controller_path){
217       if($etat = $this->valid_etat($controller_path)){
218         if(!isset($this->controllers)) $this->controllers = array();
219         if(!isset($this->controllers[$etat["mod"]])) $this->controllers[$etat["mod"]] = array();
220         if(!isset($this->controllers[$etat["mod"]][$etat["controller"]])){
221           $controller_class = "mw_".$etat["mod"]."_".$etat["controller"];
222           if(!class_exists($controller_class)){
223             $controller_file = "controllers/".$etat["mod"]."/".$etat["controller"].".php";
224             if($this->app_file_exists($controller_file, "DESC")){
225               require_once $this->app_file($controller_file, "DESC");
226             }
227             if(!class_exists($controller_class)) return false;
228           }
229           $this->controllers[$etat["mod"]][$etat["controller"]] = new $controller_class();
230           $this->controllers[$etat["mod"]][$etat["controller"]]->set_env($this);
231         }
232         return $this->controllers[$etat["mod"]][$etat["controller"]];
233       }
234       return false;
235     }
236
237   }
238
239   class mw_controller{
240
241     var $env;
242
243     function set_env(&$env){
244       $this->env = &$env;
245     }
246
247     function env(){
248       return $this->env;
249     }
250
251     function validate(){
252       return true;
253     }
254
255     function prepare_inputs(){
256       return true;
257     }
258
259   }
260
261 ?>