ajout d'un installeur en ligne
[mtweb] / mw / app / controllers / install / index.php
diff --git a/mw/app/controllers/install/index.php b/mw/app/controllers/install/index.php
new file mode 100644 (file)
index 0000000..8407538
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+
+  class mw_install_index extends mw_controller{
+
+    var $config_file;
+
+    function validate(){
+      $env = $this->env();
+      $this->config_file = $env->path("content")."config/config.php";
+      if(file_exists($this->config_file)) return "le site est deja installé";
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      $admin = array(
+        "login" => "",
+        "email" => "",
+        "password" => ""
+      );
+      if(($sgbds = $data->sgbds()) === false){
+        $env->erreur("impossible de lister les sgbds disponibles");
+        return;
+      }
+      $table_prefix = isset($_POST["table_prefix"]) ? $_POST["table_prefix"] : "mw_";
+      $env->add_table_prefix(
+        array(
+          "#--" => $table_prefix
+        )
+      );
+      $current_sgbd = "mw_pdo_sqlite";
+      if($_POST){
+        if(!isset($_POST["sgbd"])){
+          $env->erreur("Parametre de SGBD manquant");
+          return;
+        }
+        $current_sgbd = $_POST["sgbd"];
+        $SGBD_FOUND = false;
+        foreach($sgbds as $class_name => $sgbd){
+          if($current_sgbd == $class_name){
+            $SGBD_FOUND = true;
+            break;
+          }
+        }
+        if(!$SGBD_FOUND){
+          $env->erreur("SGBD inconnu: ".$current_sgbd);
+          return;
+        }
+        if(!file_exists($template_file = $env->path("content")."config/templates/".$current_sgbd.".php")){
+          $env->erreur("le fichier de template pour la configuration avec ".$current_sgbd." n'existe pas");
+          return;
+        }
+        $params = array(
+          "host" => isset($_POST[$current_sgbd."_host"]) ? $_POST[$current_sgbd."_host"] : "",
+          "base" => isset($_POST[$current_sgbd."_base"]) ? $_POST[$current_sgbd."_base"] : "",
+          "user" => isset($_POST[$current_sgbd."_user"]) ? $_POST[$current_sgbd."_user"] : "",
+          "password" => isset($_POST[$current_sgbd."_password"]) ? $_POST[$current_sgbd."_password"] : ""
+        );
+        $admin = array(
+          "login" => trim($_POST["admin_login"]),
+          "email" => trim($_POST["admin_email"]),
+          "password" => $_POST["admin_password"]
+        );
+        if(!$admin["login"]){
+          $env->message("merci de choisir un login pour l'administrateur");
+        }
+        if(!$admin["email"]){
+          $env->message("merci de préciser l'email de l'administrateur");
+        }
+        if($admin["password"]){
+          if($admin["password"] != $_POST["admin_password_confirm"]){
+            $env->message("la confirmation du mot de passe est incorrecte");
+          }
+        }
+        else $env->message("merci de choisir un mot de passe pour l'administrateur");
+        if(!$env->messages()){
+          $sgbds[$current_sgbd] = null;
+          $impl = new $current_sgbd($params);
+          $sgbds[$current_sgbd] = $impl;
+          $data->set_sgbd(
+            new mw_sgbd(
+              $sgbds[$current_sgbd],
+              $env
+            )
+          );
+          $data->load_modules($env->path("mw_dir")."app/", "data/modules/".($current_sgbd == "mw_xml" ? "xml" : "sql")."/");
+          if(
+                $current_sgbd == "mw_xml"
+          ){
+            if(($res = $data->install_xml($params)) !== true){
+              $env->message($res);
+            }
+          }
+          elseif(
+                $current_sgbd == "mw_mysql"
+            ||  $current_sgbd == "mw_pdo_mysql"
+          ){
+            if(($res = $data->install_sql($params)) !== true){
+              $env->message($res);
+            }
+          }
+          elseif(
+                $current_sgbd == "mw_pdo_sqlite"
+          ){
+            if(($res = $data->install_sqlite($params)) !== true){
+              $env->message($res);
+            }
+          }
+        }
+        if(!$env->messages()){
+          if(($roles = $data->init_roles()) === false){
+            $env->erreur("la base de données a été installée mais impossible de lire la liste des roles");
+            return;
+          }
+          $admin_roles = array();
+          foreach($roles as $id_role => $role){
+            if(
+                  ($role["nom"] == "admin")
+              ||  ($role["nom"] == "membre")
+              ||  ($role["nom"] == "webmaster")
+            ){
+              $admin_roles[] = $id_role;
+            }
+          }
+          if(!$data->add_user($admin["login"], md5($admin["password"]), $admin["email"], $admin_roles)){
+            $env->erreur("la base de données a été installée mais impossible d'ajouter l'administrateur");
+            return;
+          }
+        }
+        if(!$env->messages()){
+          if(!$content = @file_get_contents($template_file)){
+            $env->erreur("impossible de lire le fichier de template pour la configuration avec ".$current_sgbd);
+            return;
+          }
+          if(
+            @file_put_contents(
+              $this->config_file,
+              str_replace(
+                array(
+                  "[bdd_host]",
+                  "[bdd_base]",
+                  "[bdd_prefix]",
+                  "[bdd_user]",
+                  "[bdd_password]"
+                ),
+                array(
+                  $params["host"],
+                  $params["base"],
+                  $table_prefix,
+                  $params["user"],
+                  $params["password"]
+                ),
+                $content
+              )
+            ) === false
+          ){
+            $env->erreur("impossible de créer le fichier de configuration");
+            return;
+          }
+          $env->redirect(
+            $env->url(),
+            "le site a été installé"
+          );
+        }
+      }
+      $env->set_out("sgbds", $sgbds);
+      $env->set_out("current_sgbd", $current_sgbd);
+      $env->set_out("table_prefix", $table_prefix);
+      $env->set_out("admin", $admin);
+    }
+
+  }
+
+?>
\ No newline at end of file