nouveau module "models" dans l'environnement
[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, $valid_role = true, $params = array(), $method = "GET"){
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 $key => $value){
146               switch(strtolower($method)){
147                 case "get": $_GET[$this->param($key)] = $value; break;
148                 case "post": $_POST[$key] = $value; break;
149                 default: break;
150               }
151             }
152             if(($controller_validate = $controller->validate()) === true){
153               if(($controller_prepare_inputs = $controller->prepare_inputs()) === true){
154                 $etat_before = $this->etat;
155                 $this->call_observers("before_action");
156                 $controller->$action_method($this);
157                 $etat_after = $this->etat;
158                 $this->etat = $etat_before;
159                 $this->call_observers("after_action");
160                 $this->etat = $etat_after;
161               }
162               else $this->erreur($controller_prepare_inputs);
163             }
164             else $this->erreur($controller_validate);
165           }
166           else $this->erreur("Impossible de trouver l'action ".$this->etat("action"));
167         }
168         else $this->erreur("Impossible d'instancier le controleur ".$this->etat("controller"));
169       }
170     }
171
172     function is_running($etat){
173       $_etat = array();
174       if(is_array($etat)){
175         if(isset($etat["mod"])){
176           $_etat["mod"] = $etat["mod"];
177           if(isset($etat["controller"])){
178             $_etat["controller"] = $etat["controller"];
179             if(isset($etat["action"])) $_etat["action"] = $etat["action"];
180           }
181         }
182       }
183       else{
184         $etat = explode("/", $etat);
185         foreach($etat as $etat_item){
186           if($etat_item){
187             if(!isset($_etat["mod"])) $_etat["mod"] = $etat_item;
188             else{
189               if(!isset($_etat["controller"])) $_etat["controller"] = $etat_item;
190               else{
191                 if(!isset($_etat["action"])) $_etat["action"] = $etat_item;
192                 break;
193               }
194             }
195           }
196         }
197       }
198       $IS_RUNNING = true;
199       if($IS_RUNNING && isset($_etat["mod"])) $IS_RUNNING = ($_etat["mod"] == $this->etat("mod"));
200       if($IS_RUNNING && isset($_etat["controller"])) $IS_RUNNING = ($_etat["controller"] == $this->etat("controller"));
201       if($IS_RUNNING && isset($_etat["action"])) $IS_RUNNING = ($_etat["action"] == $this->etat("action"));
202       return $IS_RUNNING;
203     }
204
205     function etat($name = null){
206       if(!isset($name)) return $this->etat;
207       return $this->etat[$name];
208     }
209
210     function get_controller($controller_path){
211       if($etat = $this->valid_etat($controller_path)){
212         if(!isset($this->controllers)) $this->controllers = array();
213         if(!isset($this->controllers[$etat["mod"]])) $this->controllers[$etat["mod"]] = array();
214         if(!isset($this->controllers[$etat["mod"]][$etat["controller"]])){
215           $controller_class = "mw_".$etat["mod"]."_".$etat["controller"];
216           if(!class_exists($controller_class)){
217             $controller_file = "controllers/".$etat["mod"]."/".$etat["controller"].".php";
218             if($this->app_file_exists($controller_file, "DESC")){
219               require_once $this->app_file($controller_file, "DESC");
220             }
221             if(!class_exists($controller_class)) return false;
222           }
223           $this->controllers[$etat["mod"]][$etat["controller"]] = new $controller_class();
224           $this->controllers[$etat["mod"]][$etat["controller"]]->set_env($this);
225         }
226         return $this->controllers[$etat["mod"]][$etat["controller"]];
227       }
228       return false;
229     }
230
231   }
232
233   class mw_controller{
234
235     var $env;
236
237     function set_env(&$env){
238       $this->env = &$env;
239     }
240
241     function env(){
242       return $this->env;
243     }
244
245     function validate(){
246       return true;
247     }
248
249     function prepare_inputs(){
250       return true;
251     }
252
253   }
254
255 ?>