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