mecanisme d'upgrade
[mtweb] / mw / app / controllers / install / index.php
1 <?php
2
3   class mw_install_index extends mw_controller{
4
5     var $config_file;
6
7     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     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($params);
81           $sgbds[$current_sgbd] = $impl;
82           $data->set_sgbd(
83             new mw_sgbd(
84               $sgbds[$current_sgbd],
85               $env
86             )
87           );
88           $data->load_modules($env->path("mw_dir")."app/", "data/modules/".($current_sgbd == "mw_xml" ? "xml" : "sql")."/");
89           if(
90                 $current_sgbd == "mw_xml"
91           ){
92             if(($res = $data->install_xml($params)) !== true){
93               $env->message($res);
94             }
95           }
96           elseif(
97                 $current_sgbd == "mw_mysql"
98             ||  $current_sgbd == "mw_pdo_mysql"
99           ){
100             if(($res = $data->install_sql($params)) !== true){
101               $env->message($res);
102             }
103           }
104           elseif(
105                 $current_sgbd == "mw_pdo_sqlite"
106           ){
107             if(($res = $data->install_sqlite($params)) !== true){
108               $env->message($res);
109             }
110           }
111         }
112         if(!$env->messages()){
113           if(($roles = $data->init_roles()) === false){
114             $env->erreur("la base de données a été installée mais impossible de lire la liste des roles");
115             return;
116           }
117           $admin_roles = array();
118           foreach($roles as $id_role => $role){
119             if(
120                   ($role["nom"] == "admin")
121               ||  ($role["nom"] == "membre")
122               ||  ($role["nom"] == "webmaster")
123             ){
124               $admin_roles[] = $id_role;
125             }
126           }
127           if(!$data->add_user($admin["login"], md5($admin["password"]), $admin["email"], $admin_roles)){
128             $env->erreur("la base de données a été installée mais impossible d'ajouter l'administrateur");
129             return;
130           }
131           if(!$env->set_webmaster_user($admin["login"], md5($admin["password"]))){
132             $env->erreur("la base de données a été installée mais impossible d'enregistrer le webmaster");
133             return;
134           }
135         }
136         if(!$env->messages()){
137           if(!$content = @file_get_contents($template_file)){
138             $env->erreur("impossible de lire le fichier de template pour la configuration avec ".$current_sgbd);
139             return;
140           }
141           if(
142             @file_put_contents(
143               $this->config_file,
144               str_replace(
145                 array(
146                   "[bdd_host]",
147                   "[bdd_base]",
148                   "[bdd_prefix]",
149                   "[bdd_user]",
150                   "[bdd_password]"
151                 ),
152                 array(
153                   $params["host"],
154                   $params["base"],
155                   $table_prefix,
156                   $params["user"],
157                   $params["password"]
158                 ),
159                 $content
160               )
161             ) === false
162           ){
163             $env->erreur("impossible de créer le fichier de configuration");
164             return;
165           }
166           $env->redirect(
167             $env->url(),
168             "le site a été installé"
169           );
170         }
171       }
172       $env->set_out("sgbds", $sgbds);
173       $env->set_out("current_sgbd", $current_sgbd);
174       $env->set_out("table_prefix", $table_prefix);
175       $env->set_out("admin", $admin);
176     }
177
178   }
179
180 ?>