diff --git a/config.php b/config.php index f8f0903..8bf37c5 100644 --- a/config.php +++ b/config.php @@ -3,8 +3,6 @@ @package domframework @author Dominique Fournier */ -require_once ("domframework/form.php"); - /** Manage the configurations of the module done by administrator in a config * file * It is based on the module configuration defaults @@ -54,7 +52,7 @@ class config return $this->default; } - /** Return the defined values + /** Return the defined values in array format */ public function getAll () { @@ -66,6 +64,34 @@ class config return $conf; } + /** Return the defined values in Slash format + */ + public function getAllInSlash () + { + $conf = $this->getAll (); + $vals = array (); + foreach ($this->docComment () as $key) + { + if (! key_exists ("param", $key)) + continue; + if (substr ($key["param"], 0, 1) !== "/") + throw new \Exception ("Config param '".$key["param"]. + "' don't start by /"); + $exp = explode ("/", $key["param"]); + unset ($exp[0]); + if (count ($exp) === 1 && key_exists ($exp[1], $conf)) + $vals[$key["param"]] = $conf[$exp[1]]; + elseif (count ($exp) === 2 && key_exists ($exp[1], $conf) && + key_exists ($exp[2], $conf[$exp[1]])) + $vals[$key["param"]] = $conf[$exp[1]][$exp[2]]; + elseif (count ($exp) === 3 && key_exists ($exp[1], $conf) && + key_exists ($exp[2], $conf[$exp[1]]) && + key_exists ($exp[3], $conf[$exp[1]][$exp[2]])) + $vals[$key["param"]] = $conf[$exp[1]][$exp[2]][$exp[3]]; + } + return $vals; + } + /** Get the value of the provided parameter recorded in .php file * If it is not set in .php file, use the default value * @param string $param The option name to be returned @@ -136,6 +162,7 @@ class config */ public function set ($param, $value) { +die ("Config : set DO NOT USE"); $this->selectConfFile (); if (!array_key_exists ($param, $this->default)) throw new Exception ("Unknown parameter '$param'", 500); @@ -182,6 +209,7 @@ class config */ private function writePHP ($values, $phpcode, $indent) { +die ("Config : writePHP DO NOT USE"); foreach ($values as $key=>$val) { $phpcode .= str_pad (" ", $indent); @@ -264,27 +292,148 @@ class config elseif ($values === "null") $new = null; elseif ($values === "false") - $new = false; + $new = "false"; elseif ($values === "true") - $new = true; + $new = "true"; else $new = intval ($values); } return $new; } - /** Return an array containing the definitions read from the default config - * file - * @param string $modelFile The file model to read + /** Update the configuration file with the provided parameters + * @param array $paramsSlash The parameters to analyze for updating the file + * The params are in an array like array ("/authentication/html" => "value") + * All the parameters are not needed + * To remove a parameter, set it to default value */ - public function docComment ($modelFile) + public function updateParamsSlash ($paramsSlash) { $debug = 0; + if ($debug) echo "
";
+    if ($debug) echo "########## BEFORE\n";
+    if ($debug) echo "PARAMSLASH=";
+    if ($debug) var_dump ($paramsSlash);
+    // Check if the provided slash parameters are defined
+    $definitions = $this->docComment ();
+    // Actually stored values
+    $stored = $this->getAllInSlash ();
+    if ($debug) echo "stored =";
+    if ($debug) var_dump ($stored);
+    $new = array ();
+    // Update the stored values with the provided ones
+    foreach ($definitions as $key=>$unused)
+    {
+      if ($debug) echo "CHECK $key\n";
+      if (! key_exists ($key, $paramsSlash) && key_exists ($key, $stored))
+      {
+        if ($debug) echo "COPY the OLD value fo '$key' to the new array\n";
+        $new[$key] = $this->cast ($stored[$key]);
+        continue;
+      }
+      if (! key_exists ($key, $paramsSlash))
+      {
+        if ($debug) echo "Param $key not provided : skipped\n";
+        continue;
+      }
+      $val = $paramsSlash[$key];
+      if ($val === "")
+      {
+        if ($debug) echo "MUST REMOVE $key => Empty val\n";
+      }
+      // Do NOT use the === as the $val is always a string and must be compared
+      // with default integers
+      elseif (key_exists ("default", $definitions[$key]) &&
+              $this->cast ($val) ===
+                $this->cast ($definitions[$key]["default"]))
+      {
+        if ($debug) echo "MUST REMOVE $key => default\n";
+      }
+      elseif (key_exists ($key, $paramsSlash) && key_exists ($key, $stored) &&
+          $paramsSlash[$key] === $stored[$key])
+      {
+        if ($debug) echo "MUST COPY $key\n";
+        $new[$key] = $this->cast ($val);
+      }
+      elseif (key_exists ($key, $stored) && $stored[$key] !== $val)
+      {
+        if ($debug) echo "MUST OVERWRITE $key WITH NEW VALUE\n";
+        $new[$key] = $this->cast ($val);
+      }
+      elseif (! key_exists ($key, $stored))
+      {
+        if ($debug) echo "MUST ADD $key without DEFAULT\n";
+        $new[$key] = $this->cast ($val);
+      }
+      else
+      {
+        if ($debug) echo "NOT CATCHED !!!\n";
+        if ($debug) echo "   STORED=";var_dump ($stored);
+        if ($debug) echo "   DEFS=";var_dump ($definitions[$key]);
+        if ($debug) echo "   SLASH=";var_dump ($val);
+      }
+    }
+
+    // Save the new stored values in the file
+    $txt = "$val)
+    {
+      $exp = explode ("/", substr ($key, 1));
+      $txt .= "\$conf['".implode ("']['", $exp)."'] = ".
+        var_export ($val, true).";\n";
+    }
+    if (file_put_contents ($this->confFile, $txt, LOCK_EX) === FALSE)
+      throw new \Exception (sprintf (dgettext("domframework",
+                                    "Can't save configuration file '%s'"),
+                                    $this->confFile), 500);
+    // The next command clear the include cache file and force the PHP to
+    // read it again on next request.
+    // If it is not used, include () return the old value
+    opcache_invalidate ($this->confFile);
+    return TRUE;
+  }
+
+  /** Cast the provided string into the associated value
+    * @param string $val The val to cast
+    */
+  private function cast ($val)
+  {
+    if (isset ($val[0]) && ($val[0] === "\"" || $val[0] === "'" ))
+      $new = substr ($val, 1, -1);
+    elseif ($val === "null")
+      $new = null;
+    elseif ($val === "false")
+      $new = false;
+    elseif ($val === "true")
+      $new = true;
+    elseif ($val === "")
+      $new = "";
+    elseif (is_array ($val))
+      $new = $val;
+    elseif (strspn ($val, "0123456789") === strlen ($val))
+      $new = intval ($val);
+    elseif (strspn ($val, "0123456789.") === strlen ($val))
+      $new = floatval ($val);
+    else
+      $new = $val;
+    return $new;
+  }
+
+  /** Return an array containing the definitions read from the default config
+    * file
+    * The definition of param are in Slash format
+    */
+  public function docComment ()
+  {
+    $debug = 0;
+    $reflector = new ReflectionClass (get_class ($this));
+    $modelFile = $reflector->getFileName();
     if (! file_exists ($modelFile))
-      throw new Exception (dgettext("domframework",
+      throw new \Exception (dgettext("domframework",
                            "The configuration model file is missing"), 500);
     if (! is_readable ($modelFile))
-      throw new Exception (dgettext("domframework",
+      throw new \Exception (dgettext("domframework",
                            "The configuration model file is not readable"),
                            500);
     $filecontent = file_get_contents ($modelFile);
@@ -326,6 +475,9 @@ class config
             $group = $data["group"];
           if (! isset ($data["param"]))
             continue;
+          if (substr ($data["param"], 0, 1) !== "/")
+            throw new Exception (sprintf (dgettext("domframework",
+              "Parameter '%s' doesn't start by slash"), $data["param"]), 500);
           $data["depth"] = $parenthesis;
           $data["group"] = $group;
           //if (isset ($data["values"]) && $data["values"][0] !== "\"")
@@ -339,10 +491,8 @@ class config
           }
           if (isset ($data["default"]))
             $data["default"] = $this->strToType ($data["default"]);
-          if (isset ($data["prefix"]))
-            $data["prefix"] = $this->strToType ($data["prefix"]);
           if ($debug) var_dump ($data);
-          $params[] = $data;
+          $params[$data["param"]] = $data;
         }
       }
       else