diff --git a/config.php b/config.php
index 5f438c9..1fbb0fe 100644
--- a/config.php
+++ b/config.php
@@ -8,6 +8,14 @@ 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
+ The DocType allow to define the configuration HTML page. It must contains
+ @param : the name of the parameter
+ @description : the textual description of the parameter
+ @type : the type of the parameter (string, integer, array)
+ @values : an array containing the allowed values to the parameter. Can be
+ a function like timezone_identifiers_list
+ @default : the default value (can be an array or a string or a number)
+ @group : Group all the parameters in a group
POC :
$config = new config();
$config->default = array ("param"=>"default",
@@ -166,168 +174,135 @@ class config
return $phpcode;
}
- private function tokenRead (&$tokens, $output = array ())
+ /** Convert a string to the right PHP type, without using the eval function */
+ private function strToType ($values)
{
- $lasttokens = array ();
- $startDefault = false;
- $parenthesis = 0;
- $i = 0;
- while (count ($tokens) > 0 && $i < 5000)
+ $values = str_replace ("array (", "array(", $values);
+ if (stripos ($values, "array(") !== false)
{
- $i++;
- $token = array_shift ($tokens);
- if (is_array ($token))
+ $values = substr ($values, 6, -1);
+ $values = explode (",", $values);
+ $new = array ();
+ foreach ($values as $key=>$val)
{
- list($id, $text) = $token;
- if ($id === T_WHITESPACE) continue;
- if ($id === T_VARIABLE && $text === '$this')
+ if (strpos ($val, "=>") !== false)
{
- array_push ($lasttokens, "this");
- continue;
+ // Associated array
+ unset ($values[$key]);
+ list ($key1, $val1) = explode ("=>", $val);
+ if ($val1[0] === "\"" || $val1[0] === "'")
+ $val1 = substr($val1, 1, -1);
+ elseif (strpos ($val1, "."))
+ $val1 = floatval ($val1);
+ else
+ $val1 = intval ($val1);
+ $new[$key1] = $val1;
}
- if (end ($lasttokens) === "this" && $id === T_OBJECT_OPERATOR)
- {
- array_push ($lasttokens, "->");
- continue;
- }
- if ($lasttokens === array ("this","->") && $id === T_STRING &&
- $text === "default")
- {
- $startDefault = true;
- $lasttokens = array ();
- }
- if ($startDefault === false)
- continue;
- // Here we are in the default array
-
-echo "TEXT=$text
\n";
- }
- else
- {
- if ($startDefault === true)
- {
- if ($token === "(")
- $parenthesis++;
- if ($token === ")")
- {
- $parenthesis--;
- if ($parenthesis === 0)
- return $output;
- }
- }
-echo "TOK =$token
\n";
- }
- }
- if ($i === 5000)
- throw new Exception ("Too much lines in file (>5000)", 500);
- return $output;
- }
-
- /** Create the HTML form to configure the software where the definitions are
- done. Allow to edit an existing configuration */
- public function configHTML ($values=array ())
- {
- $debug = 1;
- if (!defined('T_ML_COMMENT'))
- define('T_ML_COMMENT', T_COMMENT);
- else
- define('T_DOC_COMMENT', T_ML_COMMENT);
- $source = file_get_contents ("models/model_configuration.php");
- $tokens = token_get_all ($source);
- // In debug, display the tokens for analyzis
- if ($debug)
- {
- echo "DEBUG
\n";
- foreach ($tokens as $token)
- {
- if (is_string ($token))
- echo "STRING : $token
\n";
else
{
- list($id, $text, $line) = $token;
- if ($id === 379) continue;
- echo token_name ($id)."(id $id) $text [line $line]
\n";
+ // Unique value (string or integer or float)
+ if ($val[0] === "\"" || $val[0] === "'")
+ $val = substr($val, 1, -1);
+ elseif (strpos ($val, "."))
+ $val = floatval ($val);
+ else
+ $val = intval ($val);
+ $new[$key] = $val;
}
}
}
+ else
+ {
+ if ($values[0] === "\"" || $values[0] === "'" )
+ $new = substr ($values, 1, -1);
+ elseif (strpos ($values, "."))
+ $new = floatval ($values);
+ else
+ $new = intval ($values);
+ }
+ return $new;
+ }
-
- return $this->tokenRead ($tokens);
-
-exit;
+ /** Return an array containing the definitions read from the default config
+ file */
+ public function docComment ($modelFile)
+ {
+ $debug = 0;
+ if (! file_exists ($modelFile))
+ throw new Exception (dgettext("domframework",
+ "The configuration model file is missing"), 500);
+ if (! is_readable ($modelFile))
+ throw new Exception (dgettext("domframework",
+ "The configuration model file is not readable"),
+ 500);
+ $filecontent = file_get_contents ($modelFile);
+ $tokens = token_get_all ($filecontent);
+ $foundDefault = "";
+ $parenthesis = 0;
$params = array ();
- $string = "";
- $start = false;
+ $group = dgettext("domframework", "Default parameters");
foreach ($tokens as $token)
{
if (is_array ($token))
{
- list($id, $text) = $token;
- // Look at the $this->default, and skip all before this token
- if ($id === T_STRING && $text === "default" && $start === false)
+ list ($id, $text) = $token;
+ if ($debug) echo "ARRAY : $id, $text\n";
+ if ($foundDefault === "" && $text === "->")
+ $foundDefault = $text;
+ if ($id === T_DOC_COMMENT)
{
- // Found the start of the analysis
- $start = true;
- continue;
- }
- if ($start === false)
- continue;
- $string = "";
- switch ($id)
- {
- case T_COMMENT:
- case T_ML_COMMENT: // we've defined this
- case T_DOC_COMMENT: // and this
- // Skip the lines which don't contains phpdoc standard
- if (substr ($text, 0, 3) !== "/**")
+ // Look at @param, @description,@type, @values, @default
+ if ($debug) echo "DOC_COMMENT : $text\n";
+ // Append the not completed lines
+ $text = trim (substr ($text, 3, -2));
+ $text = preg_replace ("/\n\s+/", " ", $text);
+ $text = preg_replace (
+ "/(@(param|description|type|values|default|group))/",
+ "\n\${1}", $text);
+ $text = ltrim ($text);
+ // Look at each parameter and save them in a data array
+ $data = array ();
+ foreach (explode ("\n", $text) as $line)
+ {
+ $tmp = explode (" ", $line);
+ $key = reset ($tmp);
+ $key = substr ($key, 1);
+ $data[$key] = trim (implode (" ",array_slice ($tmp, 1)));
+ }
+ if (isset ($data["group"]))
+ $group = $data["group"];
+ if (! isset ($data["param"]))
continue;
- $definition = trim (substr ($text, 4, -2));
- echo $definition."
\n";
- break;
- case T_CONSTANT_ENCAPSED_STRING:
- $params[$text] = $definition;
- break;
+ $data["depth"] = $parenthesis;
+ $data["group"] = $group;
+ //if (isset ($data["values"]) && $data["values"][0] !== "\"")
+ if (isset ($data["values"]))
+ {
+ // A function or an array or a number is provided
+ if ( function_exists ($data["values"]))
+ $data["values"] = call_user_func ($data["values"]);
+ elseif (is_string ($data["values"]))
+ $data["values"] = $this->strToType ($data["values"]);
+ }
+ if (isset ($data["default"]))
+ $data["default"] = $this->strToType ($data["default"]);
+ if ($debug) var_dump ($data);
+ $params[] = $data;
}
- }
- elseif ($start === true && substr ($string.$token, -2) === ");")
- {
- // Skip all the lines after the end of the $this->default definition
- break;
}
else
{
- $string .= $token;
+ if ($debug) echo "TEXT : $token\n";
+ if ($foundDefault !== "" && $token === "(")
+ $parenthesis++;
+ if ($foundDefault !== "" && $token === ")")
+ {
+ $parenthesis--;
+ if ($parenthesis === 0)
+ break;
+ }
}
}
-print_r ($params);
-exit;
- $fields = $this->configRead ($this->default);
-
-exit;
-print_r ($fields);
- $f = new form ();
- $f->fields ($fields);
-echo $f->printHTML ();
- }
-
- /** Return an array of fields */
- private function configRead ($params)
- {
- $fields = array ();
- foreach ($params as $p1=>$vals1)
- {
- if (is_array ($vals1))
- {
- $fields = array_merge ($fields, $this->configRead ($vals1));
- }
- else
- {
- $field = new formfield ($vals1, $vals1);
- $field->group = $p1;
- $fields[] = $field;
- unset ($field);
- }
- }
- return $fields;
+ return $params;
}
}