implementation sgbd herite de mw_sgbd
[mtweb] / mw / app / controllers / install / index.php
1 <?php
2
3   class mw_install_index extends mw_controller{
4
5     public $config_file;
6
7     public function validate(){
8       $env = $this->env();
9       $this->config_file = $env->path("content")."config/config.php";
10       if(file_exists($this->config_file)) return "le site est deja installé";
11       return true;
12     }
13
14     public function index(){
15       $env = $this->env();
16       $data = $env->data();
17       $admin = array(
18         "login" => "",
19         "email" => "",
20         "password" => ""
21       );
22       if(($sgbds = $data->sgbds()) === false){
23         $env->erreur("impossible de lister les sgbds disponibles");
24         return;
25       }
26       $table_prefix = isset($_POST["table_prefix"]) ? $_POST["table_prefix"] : "mw_";
27       $env->add_table_prefix(
28         array(
29           "#--" => $table_prefix
30         )
31       );
32       $current_sgbd = isset($sgbds["mw_pdo_sqlite"]) ? "mw_pdo_sqlite" : "mw_xml";
33       if($_POST){
34         if(!isset($_POST["sgbd"])){
35           $env->erreur("Parametre de SGBD manquant");
36           return;
37         }
38         $current_sgbd = $_POST["sgbd"];
39         $SGBD_FOUND = false;
40         foreach($sgbds as $class_name => $sgbd){
41           if($current_sgbd == $class_name){
42             $SGBD_FOUND = true;
43             break;
44           }
45         }
46         if(!$SGBD_FOUND){
47           $env->erreur("SGBD inconnu: ".$current_sgbd);
48           return;
49         }
50         if(!file_exists($template_file = $env->path("content")."config/templates/".$current_sgbd.".php")){
51           $env->erreur("le fichier de template pour la configuration avec ".$current_sgbd." n'existe pas");
52           return;
53         }
54         $params = array(
55           "host" => isset($_POST[$current_sgbd."_host"]) ? $_POST[$current_sgbd."_host"] : "",
56           "base" => isset($_POST[$current_sgbd."_base"]) ? $_POST[$current_sgbd."_base"] : "",
57           "user" => isset($_POST[$current_sgbd."_user"]) ? $_POST[$current_sgbd."_user"] : "",
58           "password" => isset($_POST[$current_sgbd."_password"]) ? $_POST[$current_sgbd."_password"] : ""
59         );
60         $sgbds[$current_sgbd]->user = $params["user"];
61         $admin = array(
62           "login" => trim($_POST["admin_login"]),
63           "email" => trim($_POST["admin_email"]),
64           "password" => $_POST["admin_password"]
65         );
66         if(!$admin["login"]){
67           $env->message("merci de choisir un login pour l'administrateur");
68         }
69         if(!$admin["email"]){
70           $env->message("merci de préciser l'email de l'administrateur");
71         }
72         if($admin["password"]){
73           if($admin["password"] != $_POST["admin_password_confirm"]){
74             $env->message("la confirmation du mot de passe est incorrecte");
75           }
76         }
77         else $env->message("merci de choisir un mot de passe pour l'administrateur");
78         if(!$env->messages()){
79           $sgbds[$current_sgbd] = null;
80           $impl = new $current_sgbd($env, $params);
81           $sgbds[$current_sgbd] = $impl;
82           $data->set_sgbd($sgbds[$current_sgbd]);
83           $data->load_modules($env->path("mw_dir")."app/", "data/modules/".($current_sgbd == "mw_xml" ? "xml" : "sql")."/");
84           if(
85                 $current_sgbd == "mw_xml"
86           ){
87             if(($res = $data->install_xml($params)) !== true){
88               $env->message($res);
89             }
90           }
91           elseif(
92                 $current_sgbd == "mw_mysql"
93             ||  $current_sgbd == "mw_pdo_mysql"
94           ){
95             if(($res = $data->install_sql($params)) !== true){
96               $env->message($res);
97             }
98           }
99           elseif(
100                 $current_sgbd == "mw_pdo_sqlite"
101           ){
102             if(($res = $data->install_sqlite($params)) !== true){
103               $env->message($res);
104             }
105           }
106         }
107         if(!$env->messages()){
108           if(($roles = $data->init_roles()) === false){
109             $env->erreur("la base de données a été installée mais impossible de lire la liste des roles");
110             return;
111           }
112           $admin_roles = array();
113           foreach($roles as $id_role => $role){
114             if(
115                   ($role["nom"] == "admin")
116               ||  ($role["nom"] == "membre")
117               ||  ($role["nom"] == "webmaster")
118             ){
119               $admin_roles[] = $id_role;
120             }
121           }
122           if(!$data->add_user($admin["login"], md5($admin["password"]), $admin["email"], $admin_roles)){
123             $env->erreur("la base de données a été installée mais impossible d'ajouter l'administrateur");
124             return;
125           }
126         }
127         if(!$env->messages()){
128           if(!$content = @file_get_contents($template_file)){
129             $env->erreur("impossible de lire le fichier de template pour la configuration avec ".$current_sgbd);
130             return;
131           }
132           if(
133             @file_put_contents(
134               $this->config_file,
135               str_replace(
136                 array(
137                   "[bdd_host]",
138                   "[bdd_base]",
139                   "[bdd_prefix]",
140                   "[bdd_user]",
141                   "[bdd_password]"
142                 ),
143                 array(
144                   $params["host"],
145                   $params["base"],
146                   $table_prefix,
147                   $params["user"],
148                   $params["password"]
149                 ),
150                 $content
151               )
152             ) === false
153           ){
154             $env->erreur("impossible de créer le fichier de configuration");
155             return;
156           }
157           require_once $this->config_file;
158           if(
159                 isset($CONFIG)
160             &&  is_array($CONFIG)
161           ){
162             $env->set_config($CONFIG);
163           }
164           if(
165                 isset($bdd)
166             &&  is_array($bdd)
167           ){
168             foreach($bdd as $bdd_key => $bdd_value){
169               if($bdd_key == "table_prefix"){
170                 if(!($table_prefix = $env->bdd("table_prefix"))){
171                   $env->erreur("impossible de lire les prefixes de tables");
172                   return;
173                 }
174                 foreach($table_prefix as $prefix_code => $prefix_value) break;
175                 if(!isset($prefix_code)){
176                   $env->erreur("impossible de lire le code pour le prefixe de tables");
177                   return;
178                 }
179                 $table_prefix[$prefix_code] = $bdd_value;
180                 $env->add_table_prefix($table_prefix);
181               }
182               else{
183                 $env->set_bdd($bdd_key, $bdd_value);
184               }
185             }
186           }
187           if(($plugins = $env->plugins("DESC")) === false){
188             $env->erreur("impossible de lister les plugins");
189           }
190           foreach($plugins as $plugin_name => $plugin){
191             if(!$plugin["installed"]){
192               $env->run("config/plugins/install", array("get" => array("id" => $plugin_name)), false);
193               if($env->erreurs()) return;
194               $env->init_plugins("DESC", true);
195             }
196             if(!$plugin["enabled"]){
197               $env->run("config/plugins/enable", array("get" => array("id" => $plugin_name)), false);
198               if($env->erreurs()) return;
199               $env->init_plugins("DESC", true);
200             }
201           }
202           $env->redirect(
203             $env->url(),
204             "le site a été installé"
205           );
206         }
207       }
208       $env->set_out("sgbds", $sgbds);
209       $env->set_out("current_sgbd", $current_sgbd);
210       $env->set_out("table_prefix", $table_prefix);
211       $env->set_out("admin", $admin);
212     }
213
214   }