adaptations pour pludieurs instances d'applications mtweb.0.9.2
authordj3c1t <dj3c1t@free.fr>
Sun, 16 Jun 2013 13:02:45 +0000 (15:02 +0200)
committerdj3c1t <dj3c1t@free.fr>
Sun, 16 Jun 2013 13:02:45 +0000 (15:02 +0200)
17 files changed:
config.php
content/data/mysql/mtweb.sql
mw/app/data/impl/mw_xml.php
mw/app/data/modules/share/mw_data_users_sessions.php
mw/app/data/modules/sql/mw_data_sql_crud.php [moved from mw/app/data/modules/sql/mw_data_crud.php with 99% similarity]
mw/app/data/modules/sql/mw_data_sql_users.php [moved from mw/app/data/modules/sql/mw_data_users.php with 99% similarity]
mw/app/data/modules/xml/mw_data_xml_crud.php [moved from mw/app/data/modules/xml/mw_data_crud.php with 99% similarity]
mw/app/data/modules/xml/mw_data_xml_users.php [moved from mw/app/data/modules/xml/mw_data_users.php with 99% similarity]
mw/app/init/0300_data.php
mw/app/out/default/views/users/identification.php
mw/env/modules/mw_env_config.php
mw/env/modules/mw_env_plugins.php
mw/env/modules/mw_env_run.php
mw/libs/empty_class.php
mw/mw_app.php
mw/plugins/mw_minimal/mw_minimal.php
readme.txt

index 45a5b96..8753498 100644 (file)
@@ -4,46 +4,81 @@
   //                                                        chemins
   //
 
-  $PATHES = array();
+  $PATHES = array(
 
-  // chemin HTTP de l'installation
-  // absolu a partir de la racine HTTP du site
-  $PATHES["web"] = "/";
+    // chemin HTTP de l'installation
+    // (dossier, sur le site, qui contient le fichier index.php)
+    // absolu a partir de la racine HTTP du site
+    //
+    // installation dans un dossier :
+    // "web" => "/chemin/du/dossier"
+    //
+    // installation a la racine :
+    "web" => "/",
 
-  // dossier de l'application
-  // relatif au dossier de l'installation
-  // ou absolu dans le systeme de fichiers du serveur
-  $PATHES["mw_dir"] = "mw";
+    // chemin HTTP du dossier "mw"
+    // absolu a partir de la racine HTTP du site
+    "mw_path" => "/mw",
 
-  // chemin HTTP de l'application
-  // absolu a partir de la racine HTTP du site
-  $PATHES["mw_path"] = "/mw";
+    // chemin du dossier "mw" sur le systeme d'exploitation
+    // relatif au dossier de l'installation
+    // ou absolu dans le systeme de fichiers
+    "mw_dir" => "mw",
 
-  // dossier des contenus editables par l'application
-  // relatif au dossier de l'installation
-  $PATHES["content"] = "content";
+    // dossier des contenus editables par l'application
+    // relatif au dossier de l'installation
+    "content" => "content"
+  );
 
   // --------------------------------------------------------------
   //                                                base de donnees
   //
 
-  $bdd = array();
+  // mtweb propose deux modes de stockage des donnees
+  //
+  //  - dans des fichiers XML
+  //
+  //  - ou en utilisant un gestionnaire de base de donnees SQL
+  //
+  // ci-dessous deux exemples de configurations pour la connexion
+  // une pour XML (par defaut) et l'autre pour MySql (commentee)
 
-  // --------------------------- MYSQL
-/*
-  // remplacez avec vos parametres de connexion
-  $bdd["sgbd"] = "pdo_mysql";
-  $bdd["host"] = "localhost";
-  $bdd["base"] = "mtweb";
-  $bdd["table_prefix"] = "mw_";
-  $bdd["user"] = "mysql_user";
-  $bdd["password"] = "mysql_password";
-*/
   // --------------------------- XML
 
-  $bdd["sgbd"] = "xml";
-  $bdd["host"] = "content/data/xml";
-  $bdd["base"] = "mw";
-  $bdd["table_prefix"] = "mw_";
+  $bdd = array(
+    // on utilise stockage de donnees dans des fichiers XML
+    "sgbd" => "xml",
+    // les fichiers XML sont enregistres dans le repertoire :
+    "host" => "content/data/xml",
+    // dans ce repertoire, la base de donnees est dans le dossier :
+    "base" => "mw"
+  );
+
+/*
+  // --------------------------- MYSQL
+  //
+  // pour utiliser MySql, importez la base de donnees :
+  //
+  //    mysql -u mysql_user -p < content/data/mysql/mtweb.sql
+  //
+  // et remplacez avec vos parametres de connexion :
+
+  $bdd = array(
+    // on utilise MySql avec PDO (driver pdo_mysql)
+    "sgbd" => "pdo_mysql",
+    // hote du serveur MySql
+    "host" => "localhost",
+    // nom de la base de donnees
+    "base" => "mtweb",
+    // prefixe pour les noms des tables (*)
+    "table_prefix" => "mw_",
+    // identification pour la connexion sur le serveur MySql
+    "user" => "mysql_user",
+    "password" => "mysql_password"
+  );
+
+  // (*) le script mtweb.sql cree les tables avec le prefixe mw_
+  // adaptez le script si vous utiliez un autre prefix
+*/
 
 ?>
\ No newline at end of file
index 982650c..0151c51 100644 (file)
@@ -66,10 +66,7 @@ INSERT INTO `mw_config` (`id`, `key`, `value`) VALUES
 (16, 'start_action_params', ''),\r
 (20, 'out_navig_menu_top', 'on'),\r
 (22, 'out_colonne', 'on'),\r
-(29, 'default_allow', '1'),\r
-(30, 'cache_actif', '0'),\r
-(31, 'cache_maj_auto', '0'),\r
-(32, 'cache_time', '72');\r
+(29, 'default_allow', '1');\r
 \r
 -- --------------------------------------------------------\r
 \r
index 53fa7f1..2691a99 100644 (file)
@@ -25,8 +25,8 @@
              file_exists($env->app_file("data/impl/xml/mw_xml_data.php"))
           && file_exists($env->app_file("data/impl/xml/mw_xml_data_handler.php"))
         ){
-          require $env->app_file("data/impl/xml/mw_xml_data.php");
-          require $env->app_file("data/impl/xml/mw_xml_data_handler.php");
+          if(!class_exists("mw_xml_data")) require_once $env->app_file("data/impl/xml/mw_xml_data.php");
+          if(!class_exists("mw_xml_data_handler")) require_once $env->app_file("data/impl/xml/mw_xml_data_handler.php");
           if(
                class_exists("mw_xml_data")
             && class_exists("mw_xml_data_handler")
index daabe2b..a82c9a0 100644 (file)
 
     function user_ok($user){
       return
-      strcmp(md5($user["password"].$_SESSION["id"]), $_SESSION["pass"]) == 0
-      && $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"];
+          (isset($_SESSION[$this->app_session_key()]["id"]))
+      &&  (isset($_SESSION[$this->app_session_key()]["pass"]))
+      &&  (isset($_SESSION[$this->app_session_key()]["ip"]))
+      &&  (strcmp(md5($user["password"].$_SESSION[$this->app_session_key()]["id"]), $_SESSION[$this->app_session_key()]["pass"]) == 0)
+      &&  ($_SESSION[$this->app_session_key()]["ip"] == $_SERVER["REMOTE_ADDR"]);
     }
 
     function password_ok($user, $password){
       if(!$user) return false;
       return
-           strcmp(md5($user["password"].$_SESSION["id"]), $password) == 0
-        && $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"];
+          (isset($_SESSION[$this->app_session_key()]["id"]))
+      &&  (isset($_SESSION[$this->app_session_key()]["ip"]))
+      &&  (strcmp(md5($user["password"].$_SESSION[$this->app_session_key()]["id"]), $password) == 0)
+      &&  ($_SESSION[$this->app_session_key()]["ip"] == $_SERVER["REMOTE_ADDR"]);
     }
 
     # ----------------------------------------------------------------------------------------
     #                                                                                  session
     #
 
+    function app_session_key(){
+      $env = $this->env();
+      return "mw_".str_replace("/", "_", $env->path("web"));
+    }
+
     function load_session(){
       @session_start();
-      if(!isset($_SESSION["id"])) $this->clear_session();
+      if(!isset($_SESSION[$this->app_session_key()]["id"])) $this->clear_session();
       $user = array();
-      if(isset($_SESSION["user"])){
-        $user = $this->user($_SESSION["user"]);
+      if(isset($_SESSION[$this->app_session_key()]["user"])){
+        $user = $this->user($_SESSION[$this->app_session_key()]["user"]);
       }
-      elseif(isset($_COOKIE["user"]) && isset($_COOKIE["pass"])){
-        if($user = $this->user($_COOKIE["user"])){
-          $user["password"] = $_COOKIE["pass"];
+      elseif(isset($_COOKIE[$this->app_session_key()."_user"]) && isset($_COOKIE[$this->app_session_key()."_pass"])){
+        if($user = $this->user($_COOKIE[$this->app_session_key()."_user"])){
+          $user["password"] = $_COOKIE[$this->app_session_key()."_pass"];
           $this->set_session($user);
         }
       }
     }
 
     function set_session($user){
-      $_SESSION["user"] = $user["login"];
-      $_SESSION["pass"] = md5($user["password"].$_SESSION["id"]);
+      if(!isset($_SESSION[$this->app_session_key()])) $this->clear_session();
+      $_SESSION[$this->app_session_key()]["user"] = $user["login"];
+      $_SESSION[$this->app_session_key()]["pass"] = md5($user["password"].$_SESSION[$this->app_session_key()]["id"]);
       $env = $this->env();
       return
-          setcookie("user", $user["login"], time() + (60 * 60 * 24 * 7), $env->path("web"))
-      &&  setcookie("pass", $user["password"], time() + (60 * 60 * 24 * 7), $env->path("web"));
+          setcookie($this->app_session_key()."_user", $user["login"], time() + (60 * 60 * 24 * 7), "/")
+      &&  setcookie($this->app_session_key()."_pass", $user["password"], time() + (60 * 60 * 24 * 7), "/");
     }
 
     function clear_session(){
-      unset($_SESSION["user"]);
-      unset($_SESSION["pass"]);
-      $_SESSION["ip"] = $_SERVER["REMOTE_ADDR"];
-      $_SESSION["id"] = md5(rand());
+      unset($_SESSION[$this->app_session_key()]);
+      $_SESSION[$this->app_session_key()] = array(
+        "ip" => $_SERVER["REMOTE_ADDR"],
+        "id" => md5(rand())
+      );
       $env = $this->env();
       return
-          setcookie("user", "", 0, $env->path("web"))
-      &&  setcookie("pass", "", 0, $env->path("web"));
+          setcookie($this->app_session_key()."_user", "", 0, "/")
+      &&  setcookie($this->app_session_key()."_pass", "", 0, "/");
     }
 
     function get_session_user(){
similarity index 99%
rename from mw/app/data/modules/sql/mw_data_crud.php
rename to mw/app/data/modules/sql/mw_data_sql_crud.php
index f438ef1..0d9abbd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-  class mw_data_crud extends mw_data{
+  class mw_data_sql_crud extends mw_data{
 
     # ----------------------------------------------------------------------------------------
     #                                                                              description
similarity index 99%
rename from mw/app/data/modules/sql/mw_data_users.php
rename to mw/app/data/modules/sql/mw_data_sql_users.php
index f1171da..3611968 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-  class mw_data_users extends mw_data{
+  class mw_data_sql_users extends mw_data{
 
     var $users;
     var $user;
similarity index 99%
rename from mw/app/data/modules/xml/mw_data_crud.php
rename to mw/app/data/modules/xml/mw_data_xml_crud.php
index 126f451..ed64dc6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-  class mw_data_crud extends mw_data{
+  class mw_data_xml_crud extends mw_data{
 
     # ----------------------------------------------------------------------------------------
     #                                                                                   insert
similarity index 99%
rename from mw/app/data/modules/xml/mw_data_users.php
rename to mw/app/data/modules/xml/mw_data_xml_users.php
index ce17d22..67b6fe4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-  class mw_data_users extends mw_data{
+  class mw_data_xml_users extends mw_data{
 
     var $users;
     var $user;
index 8a28d16..ea7ad71 100644 (file)
@@ -1,10 +1,11 @@
 <?php
 
-  require $this->app_file("data/mw_sgbd.php");
-  require $this->app_file("data/mw_data.php");
+  if(!class_exists("mw_sgbd")) require_once $this->app_file("data/mw_sgbd.php");
+  if(!class_exists("mw_data")) require_once $this->app_file("data/mw_data.php");
   if($this->app_file_exists("data/impl/mw_".$this->bdd("sgbd").".php")){
-    require $this->app_file("data/impl/mw_".$this->bdd("sgbd").".php");
-    if(class_exists($sgbd_impl = "mw_".$this->bdd("sgbd"))){
+    $sgbd_impl = "mw_".$this->bdd("sgbd");
+    if(!class_exists($sgbd_impl)) require_once $this->app_file("data/impl/".$sgbd_impl.".php");
+    if(class_exists($sgbd_impl)){
       if(($plugins = $this->plugins("DESC")) !== false){
         $data = new mw_data(true);
         foreach($plugins as $plugin_name => $plugin){
index dd81a74..c36b9ba 100644 (file)
@@ -1,4 +1,10 @@
-<?php if(!($user = $this->user())) : ?>
+<?php
+
+  if(!($user = $this->user())) :
+  $data = $this->data();
+  $app_session_key = $data->app_session_key();
+
+?>
 <form id="login_form"
       action="<?php echo $this->url("users/identification/login"); ?>"
       method="post">
@@ -20,7 +26,7 @@
       </li>
       <li>
         <div class="form_single_button">
-          <input type="submit" value="Login" onclick="prepare_password('<?php echo $_SESSION["id"]; ?>')" />
+          <input type="submit" value="Login" onclick="prepare_password('<?php echo $_SESSION[$app_session_key]["id"]; ?>')" />
         </div>
       </li>
     </ul>
index a708431..e9b2316 100644 (file)
@@ -51,7 +51,7 @@
       if(isset($app_config["subs"]["bdd"][0]["subs"]["table_prefix_code"])){
         $this->add_table_prefix(
           array(
-            $app_config["subs"]["bdd"][0]["subs"]["table_prefix_code"][0]["data"] => $bdd["table_prefix"]
+            $app_config["subs"]["bdd"][0]["subs"]["table_prefix_code"][0]["data"] => isset($bdd["table_prefix"]) ? $bdd["table_prefix"] : ""
           )
         );
       }
index 70a9ec8..153700b 100644 (file)
       if(file_exists($this->path("mw_dir")."plugins")){
         if(substr($plugin_name, 0 ,1) !== "." && is_dir($this->path("mw_dir")."plugins/".$plugin_name)){
           if(file_exists($this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php")){
-            require $this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php";
+            if(!class_exists($plugin_name)){
+              require_once $this->path("mw_dir")."plugins/".$plugin_name."/".$plugin_name.".php";
+            }
             if(class_exists($plugin_name)){
               $plugin = new $plugin_name();
             }
index 5d7a24d..c0a97a2 100644 (file)
       return $OK;
     }
 
-    function run($etat, $valid_role = true, $params = array(), $method = "GET"){
+    function run($etat, $params = array(), $valid_role = true){
       if($this->set_etat($etat, $valid_role)){
         if($controller = $this->get_controller($this->etat("mod")."/".$this->etat("controller"))){
           $action_method = $this->etat("action");
           if(method_exists($controller, $action_method)){
-            foreach($params as $key => $value){
-              switch(strtolower($method)){
-                case "get": $_GET[$this->param($key)] = $value; break;
-                case "post": $_POST[$key] = $value; break;
-                default: break;
+            foreach($params as $params_method => $values){
+              foreach($values as $key => $value){
+                switch(strtolower($params_method)){
+                  case "get":
+                    $_GET[$this->param($key)] = $value;
+                    break;
+                  case "post":
+                    $_POST[$key] = $value;
+                    break;
+                }
               }
             }
             if(($controller_validate = $controller->validate()) === true){
index 32894ce..38e14cc 100644 (file)
@@ -70,8 +70,8 @@
         $file = $v_path[count($v_path) - 1];
         if(strcasecmp(substr($file, -4), ".php") == 0){
           $class_name = substr($file, 0, -4);
-          if(!class_exists($class_name)){
-            require_once $module_file;
+          if(!isset($this->modules[$class_name])){
+            if(!class_exists($class_name)) require_once $module_file;
             if(version_compare(PHP_VERSION, '5.0.0', '>=')){
               if(class_exists($class_name) && !isset($this->modules[$class_name])){
                 $this->modules[$class_name] = new $class_name($root_inst);
index 86978c2..044d711 100644 (file)
         &&  ($empty_class_file = (file_exists($PATHES["mw_dir"]."libs/empty_class.php") ? $PATHES["mw_dir"]."libs/empty_class.php" : ""))
         &&  ($env_class_file = (file_exists($PATHES["mw_dir"]."env/mw_env.php") ? $PATHES["mw_dir"]."env/mw_env.php" : ""))
       ){
-        require $sxml_class_file;
-        require $empty_class_file;
-        require $env_class_file;
-        $env = new mw_env(true);
-        $this->set_env($env);
-        $env->load_modules($PATHES["mw_dir"], "env/modules/");
-        $env->set_config_file($config_file);
-        $env->set_PATHES($PATHES);
-        $env->init_plugins();
-        $env->load_config($bdd, $CONFIG);
-        $env->init();
+        if(!class_exists("sxml")) require_once $sxml_class_file;
+        if(!class_exists("empty_class")) require_once $empty_class_file;
+        if(!class_exists("mw_env")) require_once $env_class_file;
+        if(
+              class_exists("sxml")
+          &&  class_exists("empty_class")
+          &&  class_exists("mw_env")
+        ){
+          $env = new mw_env(true);
+          $this->set_env($env);
+          $env->load_modules($PATHES["mw_dir"], "env/modules/");
+          $env->set_config_file($config_file);
+          $env->set_PATHES($PATHES);
+          $env->init_plugins();
+          $env->load_config($bdd, $CONFIG);
+          $env->init();
+        }
       }
       return $this->env();
     }
 
-    function run($etat = ""){
+    function run($etat = "", $params = array(), $valid_role = true){
       $env = $this->env();
       $etat = ($etat === false ? false : ($etat ? $etat : (isset($_GET[$env->param("e")]) ? $_GET[$env->param("e")] : "")));
-      if($etat !== false) $env->run($etat);
+      if($etat !== false) $env->run($etat, $params, $valid_role);
     }
   
     function display(){
index cfa16eb..fd5ad8d 100644 (file)
@@ -1,40 +1,35 @@
 <?php
 
   /*
-   * Cette classe decrit un plugin "vide", qui peut servir de base
+   * Cette classe decrit un plugin "vide" et peut servir de base
    * au developpement d'un nouveau plugin.
    *
-   * SI VOUS UTILISEZ CE FICHIER COMME BASE POUR UN NOUVEAU PLUGIN :
    *
-   * Si par exemple vous renommez cette classe en :
+   * pour creer un nouveau plugin (par exemple "mon_plugin") :
    *
-   *   class mon_plugin extends mw_plugin
+   *  - creez un dossier "mon_plugin" dans le dossier "mw/plugins"
+   *
+   *  - copiez dans ce dossier le fichier "mw_minimal.php" et renommez-le
+   *    en "mon_plugin.php"
    *
-   *  - renommez le fichier mw_minimal.php en mon_plugin.php
-   *  - renommez le dossier mw_minimal en mon_plugin
+   *  - dans "mon_plugin.php", renommez la classe en :
+   *
+   *   class mon_plugin extends mw_plugin
    *
-   * Vous aurez alors un nouveau plugin "mon_plugin" pret a accueillir
-   * vos nouveaux developpements
+   * vous aurez alors un nouveau plugin, activable dans l'administration
+   * du site.
    *
-   * Votre plugin peut definir de nouveaux modules d'acces aux donnes,
-   * de nouveaux modules d'action et de nouveaux fichiers d'affichage
    *
-   * d'une maniere generale, l'organisation du code dans un plugin
-   * est la meme que celle dans l'application principale.
+   * Votre dossier de plugin peut contenir des dossiers :
    *
-   * un dossier de plugin peut contenir des dossiers :
    *  - app/controllers
    *  - app/data
    *  - app/out
+   *  - app/observers
    *  - ...
    *
-   * qui seront traites exactement comme les dossiers de meme nom dans
-   * l'application principale
-   *
-   *
-   * plus d'infos en ligne sur le fonctionnement de l'application :
-   *
-   * http://mtweb.dj3c1t.com
+   * ces dossiers seront traites de le meme facon que ceux de
+   * l'application principale (dans le dossier mw/app)
    *
    */
 
index 1d133eb..3619ff5 100644 (file)
@@ -2,8 +2,9 @@
         mtweb - base de programmation pour application web
 
 
-  copyright 2010-2013 by dj3c1t
+  2010-2013 - dj3c1t - http://www.dj3c1t.com
 
+  ce programme est publié avec une licence GNU GPL v3
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 installation :
 --------------
 
-  installation rapide :
+  # installation rapide (*) :
 
   - l'archive mtweb.<version>.tar.gz contient un dossier "mtweb"
-  - uploadez le contenu de ce dossier a la racine de votre site
-    (pour une installation dans un sous-dossier du site, indiquez
-    le chemin dans le fichier config.php)
-  - assurez-vous que Php a le droit d'ecrire dans le dossier "content"
-    (et dans ses fichiers et sous-dossiers)
 
+  - uploadez le contenu de ce dossier "mtweb" sur votre site
 
-  Par defaut, mtweb stocke ses donnees dans des fichiers XML.
-  pour utilisez le stockage des donnees avec MySql :
+    Si vous faites l'installation ailleurs qu'a la racine du site
+    (si le fichier index.php n'est pas a la racine du site), adaptez
+    le fichier config.php pour y renseigner le chemin de l'installation
+    (plus de détails dans le fichier config.php)
 
-  - importez les tables fournies dans le fichier "content/data/mysql/mtweb.sql"
-  - puis dans le fichier "config.php" :
-     - commentez la partie relative aux donnees XML
-     - decommentez la partie relative aux donnees MySql
-     - adaptez les informations pour MySql avec vos parametres de connexion
+  - assurez-vous que Php a le droit d'ecrire dans le dossier "content"
+    (et dans ses fichiers et sous-dossiers)
 
   pour une premiere utilisation, vous pouvez vous identifier avec :
 
   - login: admin
   - pass:  adminpass
 
-  pensez a changer le mot de passe
+
+  (*) avant de rendre votre installation publique :
+
+   - changez le mot de passe de l'utilisateur "admin"
+
+   - ou creez un autre utilisateur avec un role administrateur
+     puis supprimez l'utilisateur "admin"
+
+
+  # utiliser MySql :
+
+  par defaut, mtweb stocke ses donnees dans des fichiers XML, dans le
+  dossier "content".
+
+  pour utiliser le stockage de donnees MySql :
+
+  - importez les tables avec le script "content/data/mysql/mtweb.sql"
+
+  - dans le fichier "config.php" :
+     - commentez la partie relative aux donnees XML
+     - decommentez la partie relative aux donnees MySql
+     - et adaptez les parametres de connexion pour MySql
+    (plus de details dans le fichier config.php)
 
 
 documentation :
 ---------------
 
-  Plus d'infos en ligne :
   http://mtweb.dj3c1t.com