adaptations pour pludieurs instances d'applications
[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       $data = $this->data();
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       $data = $this->data();
86       if($CHECK_FORMAT) $etat = $this->valid_etat($etat);
87       if($etat === false){
88         $this->erreur("etat invalide");
89         return false;
90       }
91       if(($user_roles = $data->get_user_roles()) === false){
92         $this->erreur("Impossible de lire les roles de l'utilisateur courant");
93         return false;
94       }
95       if(!$user_roles){
96         $this->erreur("L'utilisateur courant n'a aucun role");
97         return false;
98       }
99       if(
100         (
101           $action_roles = $data->get_action_roles(
102             $etat["mod"],
103             $etat["controller"],
104             $etat["action"]
105           )
106         ) === false
107       ){
108         $this->erreur("Impossible de lire les roles des actions en base");
109         return false;
110       }
111       foreach($user_roles as $id_role){
112         $OK = $this->config("default_allow");
113         $action = $etat["mod"];
114         if(isset($action_roles[$action])){
115           $OK =
116                (isset($action_roles[$action][0]) && $action_roles[$action][0])
117             || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
118         }
119         if(!$OK){
120           $action = $etat["mod"]."/".$etat["controller"];
121           if(isset($action_roles[$action])){
122             $OK =
123                  (isset($action_roles[$action][0]) && $action_roles[$action][0])
124               || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
125           }
126         }
127         if(!$OK){
128           $action = $etat["mod"]."/".$etat["controller"]."/".$etat["action"];
129           if(isset($action_roles[$action])){
130             $OK =
131                  (isset($action_roles[$action][0]) && $action_roles[$action][0])
132               || (isset($action_roles[$action][$id_role]) && $action_roles[$action][$id_role]);
133           }
134         }
135         if($OK) break;
136       }
137       return $OK;
138     }
139
140     function run($etat, $params = array(), $valid_role = true){
141       if($this->set_etat($etat, $valid_role)){
142         if($controller = $this->get_controller($this->etat("mod")."/".$this->etat("controller"))){
143           $action_method = $this->etat("action");
144           if(method_exists($controller, $action_method)){
145             foreach($params as $params_method => $values){
146               foreach($values as $key => $value){
147                 switch(strtolower($params_method)){
148                   case "get":
149                     $_GET[$this->param($key)] = $value;
150                     break;
151                   case "post":
152                     $_POST[$key] = $value;
153                     break;
154                 }
155               }
156             }
157             if(($controller_validate = $controller->validate()) === true){
158               if(($controller_prepare_inputs = $controller->prepare_inputs()) === true){
159                 $etat_before = $this->etat;
160                 $this->call_observers("before_action");
161                 $controller->$action_method($this);
162                 $etat_after = $this->etat;
163                 $this->etat = $etat_before;
164                 $this->call_observers("after_action");
165                 $this->etat = $etat_after;
166               }
167               else $this->erreur($controller_prepare_inputs);
168             }
169             else $this->erreur($controller_validate);
170           }
171           else $this->erreur("Impossible de trouver l'action ".$this->etat("action"));
172         }
173         else $this->erreur("Impossible d'instancier le controleur ".$this->etat("controller"));
174       }
175     }
176
177     function is_running($etat){
178       $_etat = array();
179       if(is_array($etat)){
180         if(isset($etat["mod"])){
181           $_etat["mod"] = $etat["mod"];
182           if(isset($etat["controller"])){
183             $_etat["controller"] = $etat["controller"];
184             if(isset($etat["action"])) $_etat["action"] = $etat["action"];
185           }
186         }
187       }
188       else{
189         $etat = explode("/", $etat);
190         foreach($etat as $etat_item){
191           if($etat_item){
192             if(!isset($_etat["mod"])) $_etat["mod"] = $etat_item;
193             else{
194               if(!isset($_etat["controller"])) $_etat["controller"] = $etat_item;
195               else{
196                 if(!isset($_etat["action"])) $_etat["action"] = $etat_item;
197                 break;
198               }
199             }
200           }
201         }
202       }
203       $IS_RUNNING = true;
204       if($IS_RUNNING && isset($_etat["mod"])) $IS_RUNNING = ($_etat["mod"] == $this->etat("mod"));
205       if($IS_RUNNING && isset($_etat["controller"])) $IS_RUNNING = ($_etat["controller"] == $this->etat("controller"));
206       if($IS_RUNNING && isset($_etat["action"])) $IS_RUNNING = ($_etat["action"] == $this->etat("action"));
207       return $IS_RUNNING;
208     }
209
210     function etat($name = null){
211       if(!isset($name)) return $this->etat;
212       return $this->etat[$name];
213     }
214
215     function get_controller($controller_path){
216       if($etat = $this->valid_etat($controller_path)){
217         if(!isset($this->controllers)) $this->controllers = array();
218         if(!isset($this->controllers[$etat["mod"]])) $this->controllers[$etat["mod"]] = array();
219         if(!isset($this->controllers[$etat["mod"]][$etat["controller"]])){
220           $controller_class = "mw_".$etat["mod"]."_".$etat["controller"];
221           if(!class_exists($controller_class)){
222             $controller_file = "controllers/".$etat["mod"]."/".$etat["controller"].".php";
223             if($this->app_file_exists($controller_file, "DESC")){
224               require_once $this->app_file($controller_file, "DESC");
225             }
226             if(!class_exists($controller_class)) return false;
227           }
228           $this->controllers[$etat["mod"]][$etat["controller"]] = new $controller_class();
229           $this->controllers[$etat["mod"]][$etat["controller"]]->set_env($this);
230         }
231         return $this->controllers[$etat["mod"]][$etat["controller"]];
232       }
233       return false;
234     }
235
236   }
237
238   class mw_controller{
239
240     var $env;
241
242     function set_env(&$env){
243       $this->env = &$env;
244     }
245
246     function env(){
247       return $this->env;
248     }
249
250     function validate(){
251       return true;
252     }
253
254     function prepare_inputs(){
255       return true;
256     }
257
258   }
259
260 ?>