maj version dans config.xml
[mtweb] / mw / mw_app.php
1 <?php
2
3   class mw_app{
4
5     public $env;
6     public $path_file;
7     public $pathes;
8     public $config_file;
9     public $config;
10     public $bdd;
11     public $error;
12     public $DO_INSTALL;
13
14     public function __construct($path_file, $DO_INSTALL = false){
15       $this->DO_INSTALL = $DO_INSTALL;
16       $this->path_file = $path_file;
17       $this->pathes = array();
18       $this->config_file = "";
19       $this->config = array();
20       $this->bdd = array();
21       $this->error = false;
22     }
23
24     public function set_env(&$env){
25       $this->env =& $env;
26     }
27
28     public function env(){
29       return $this->env;
30     }
31
32     public function param($name){
33       if(!isset($this->env)) return false;
34       return $this->env->param($name);
35     }
36
37     public function init(){
38       if(!$this->init_pathes()) return $this->get_error();
39       if(!$this->init_config()) return $this->get_error();
40       if(!$this->init_env()) return $this->get_error();
41       if(!$this->config_file){
42         if($this->DO_INSTALL){
43           $this->install();
44           exit;
45         }
46         return $this->get_error();
47       }
48       $env = $this->env();
49       if(($res = $env->data_upgrade_required()) === true){
50         $this->upgrade();
51         exit;
52       }
53       else{
54         if($res !== false){
55           $this->error($res);
56           return $this->get_error();
57         }
58       }
59       return true;
60     }
61
62     public function init_pathes(){
63       $REQUEST_URI = $_SERVER["REQUEST_URI"];
64       if(($n = strpos($REQUEST_URI, "?")) !== false){
65         $REQUEST_URI = substr($REQUEST_URI, 0, $n);
66       }
67       $web_path = explode("/", preg_replace('#/+#','/',$REQUEST_URI));
68       $this->pathes["web"] = "";
69       for($i = 0; $i < count($web_path) - 1; $i++) $this->pathes["web"] .= $web_path[$i]."/";
70       if(
71             !$this->path_file
72         ||  !file_exists($this->path_file)
73       ){
74         $this->error("le fichier des chemins est introuvable");
75         return false;
76       }
77       require $this->path_file;
78       if(
79             !isset($PATHES)
80         ||  !is_array($PATHES)
81       ){
82         $this->error("variable PATHES non defini");
83         return false;
84       }
85       foreach($PATHES as $path_name => $path_value){
86         $this->pathes[$path_name] = $path_value;
87         $this->pathes[$path_name] .= $path_value && substr($path_value, -1) != "/" ? "/" : "";
88       }
89       if(
90             !isset($this->pathes["mw_dir"])
91         ||  !isset($this->pathes["mw_path"])
92         ||  !isset($this->pathes["content"])
93       ){
94         $this->error("variable PATHES incomplete");
95         return false;
96       }
97       if(
98             !file_exists($this->pathes["content"])
99         ||  !is_dir($this->pathes["content"])
100       ){
101         $this->error("dossier content introuvable");
102         return false;
103       }
104       if(
105             !is_writable($this->pathes["content"])
106         ||  !is_writable($this->pathes["content"]."config")
107         ||  !is_writable($this->pathes["content"]."data")
108       ){
109         $this->error("Php ne peut pas ecrire dans le dossier content");
110         return false;
111       }
112       return true;
113     }
114
115     public function init_config(){
116       if(file_exists($config_file = $this->pathes["content"]."config/config.php")){
117         $this->config_file = $config_file;
118         require_once $this->config_file;
119         if(
120               isset($CONFIG)
121           &&  is_array($CONFIG)
122         ){
123           foreach($CONFIG as $config_name => $config_value){
124             $this->config[$config_name] = $config_value;
125           }
126         }
127         if(
128               isset($bdd)
129           &&  is_array($bdd)
130         ){
131           foreach($bdd as $bdd_key => $bdd_value){
132             $this->bdd[$bdd_key] = $bdd_value;
133           }
134         }
135       }
136       else{
137         if(!$this->DO_INSTALL){
138           $this->error("fichier config.php manquant");
139           return false;
140         }
141       }
142       return true;
143     }
144
145     public function init_env(){
146       if(
147             !($sxml_class_file = (file_exists($this->pathes["mw_dir"]."libs/sxml.php") ? $this->pathes["mw_dir"]."libs/sxml.php" : ""))
148         ||  !($empty_class_file = (file_exists($this->pathes["mw_dir"]."libs/empty_class.php") ? $this->pathes["mw_dir"]."libs/empty_class.php" : ""))
149         ||  !($env_class_file = (file_exists($this->pathes["mw_dir"]."env/mw_env.php") ? $this->pathes["mw_dir"]."env/mw_env.php" : ""))
150       ){
151         $this->error("des fichiers sont introuvables. impossible d'initialiser l'environnement");
152         return false;
153       }
154       if(!class_exists("sxml")) require_once $sxml_class_file;
155       if(!class_exists("empty_class")) require_once $empty_class_file;
156       if(!class_exists("mw_env")) require_once $env_class_file;
157       if(
158             !class_exists("sxml")
159         ||  !class_exists("empty_class")
160         ||  !class_exists("mw_env")
161       ){
162         $this->error("des classes sont introuvables. impossible d'initialiser l'environnement");
163         return false;
164       }
165       $env = new mw_env(true);
166       $this->set_env($env);
167       $env->load_modules($this->pathes["mw_dir"], "env/modules/");
168       $env->set_config_file($this->config_file);
169       $env->set_PATHES($this->pathes);
170       $env->load_plugins();
171       $env->load_config($this->bdd, $this->config);
172       $env->load_data();
173       $env->load_sgbd();
174       $env->plugins_loaded();
175       $env->load_versions();
176       $env->load_data_upgrades();
177       $env->init();
178       $env->init_plugins();
179       return true;
180     }
181
182     public function run($etat = "", $params = array(), $valid_role = true){
183       $env = $this->env();
184       if(!is_callable(array($env, "run"))) return false;
185       $env->run($etat);
186       return true;
187     }
188   
189     public function run_mod($mod_name, $valid_role = true){
190       $env = $this->env();
191       $etat = false;
192       if(isset($_GET[$env->param("e")])){
193         $etat = $env->valid_etat($_GET[$env->param("e")]);
194         if(!$etat || ($etat["mod"] != $mod_name)){
195           $etat = false;
196         }
197       }
198       if(!$etat){
199         $etat = $env->valid_etat($mod_name);
200       }
201       if(!$etat) return false;
202       $env->run($etat, array(), $valid_role);
203       return true;
204     }
205
206     public function install(){
207       if($this->run_mod("install", false)){
208         $this->display();
209       }
210     }
211
212     public function upgrade(){
213       $env = $this->env();
214       $data = $env->data();
215       $data->load_session();
216       if($this->run_mod("upgrade", false)){
217         $this->display();
218       }
219     }
220
221     public function display(){
222       $env = $this->env();
223       if($env->etat_is_valid()){
224         $template = $env->get_template();
225         $layout = $env->init_layout();
226         $template->render_layout($layout);
227       }
228     }
229
230     public function error($content){
231       $this->error = $content;
232     }
233
234     public function get_error(){
235       return isset($this->error) && $this->error ? $this->error : false;
236     }
237
238   }