summaryrefslogtreecommitdiffstats
path: root/app/class/form.class.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/class/form.class.php')
-rw-r--r--app/class/form.class.php186
1 files changed, 186 insertions, 0 deletions
diff --git a/app/class/form.class.php b/app/class/form.class.php
new file mode 100644
index 0000000..808de27
--- /dev/null
+++ b/app/class/form.class.php
@@ -0,0 +1,186 @@
+<?php
+
+/*
+ * Model web-forms and simplify the process of accepting, validating, and sanitizing input
+ */
+class Form
+{
+ /*
+ * Constructor
+ */
+ function __construct()
+ {
+ $this->textFields = array();
+ $this->numbFields = array();
+ $this->enumFields = array();
+
+ $this->errorlist = array();
+ }
+
+ /*
+ * Log an error
+ */
+ function logError($str)
+ {
+ $this->errorlist[] = $str;
+ }
+
+ /*
+ * Add new text field to the form
+ */
+ function field_text($name, $deflt = null, $req = true)
+ {
+ if ($req !== true)
+ $req = false;
+
+ $this->textFields[] = array(
+ 'name' => $name,
+ 'deflt' => $deflt,
+ 'req' => $req
+ );
+ }
+
+ /*
+ * Add new numeric field to the form
+ */
+ function field_numeric($name, $min = null, $max = null, $deflt = null, $integer = true, $req = true)
+ {
+ if ($req !== true)
+ $req = false;
+
+ if ($integer !== true)
+ $integer = false;
+
+ $this->numbFields[] = array(
+ 'name' => $name,
+ 'min' => $min,
+ 'max' => $max,
+ 'deflt' => $deflt,
+ 'int' => $integer,
+ 'req' => $req
+ );
+ }
+
+ /*
+ * Add new enumeration field to the form
+ */
+ function field_enum($name, $values, $deflt = null, $req = true)
+ {
+ if ($req !== true)
+ $req = false;
+
+ $this->enumFields[] = array(
+ 'name' => $name,
+ 'vals' => $values,
+ 'deflt' => $deflt,
+ 'req' => $req
+ );
+ }
+
+ /*
+ * Add new boolean field to the form
+ */
+ function field_bool($name)
+ {
+ $this->field_enum($name, array("true", "false"), "false");
+ }
+
+ /*
+ * Populate the form with input data from web page
+ */
+ function populate($input)
+ {
+ /* detect duplicate names */
+ $names = array();
+ foreach ($this->textFields as $fld)
+ $names[] = $fld['name'];
+ foreach ($this->numbFields as $fld)
+ $names[] = $fld['name'];
+ foreach ($this->enumFields as $fld)
+ $names[] = $fld['name'];
+
+ if (count(array_unique($names)) != count($names))
+ {
+ $this->logError("Internal error: Duplicate field names defined in form");
+ return false;
+ }
+
+ /* init text fields */
+ foreach ($this->textFields as $fld)
+ {
+ if (isset($input[$fld['name']]) && $input[$fld['name']] != "")
+ $this->$fld['name'] = htmlEntities($input[$fld['name']], ENT_QUOTES);
+
+ else if (!is_null($fld['deflt']))
+ $this->$fld['name'] = $fld['deflt'];
+
+ else if ($fld['req'])
+ $this->logError($fld['name'] . " is required");
+ }
+
+ /* init numeric fields */
+ foreach ($this->numbFields as $fld)
+ {
+ if (isset($input[$fld['name']]) && $input[$fld['name']] != "")
+ {
+ if (!is_numeric($input[$fld['name']]))
+ {
+ $this->logError($fld['name'] . " must be numeric");
+ continue;
+ }
+
+ if ($fld['int'] && (floor($input[$fld['name']]) != $input[$fld['name']]))
+ {
+ $this->logError($fld['name'] . " must be an integer");
+ continue;
+ }
+
+ if (!is_null($fld['min']) && ($input[$fld['name']] < $fld['min']))
+ {
+ $this->logError($fld['name'] . " must be no less than " . $fld['min']);
+ continue;
+ }
+
+ if (!is_null($fld['max']) && ($input[$fld['name']] > $fld['max']))
+ {
+ $this->logError($fld['name'] . " must be no more than " . $fld['max']);
+ continue;
+ }
+
+ $this->$fld['name'] = $input[$fld['name']];
+ }
+
+ else if (!is_null($fld['deflt']))
+ $this->$fld['name'] = $fld['deflt'];
+
+ else if ($fld['req'])
+ $this->logError($fld['name'] . " is required");
+ }
+
+ /* init enum fields */
+ foreach ($this->enumFields as $fld)
+ {
+ if (isset($input[$fld['name']]) && $input[$fld['name']] != "")
+ {
+ if (array_search($input[$fld['name']], $fld['vals']) === false)
+ {
+ $this->logError($fld['name'] . " is not an appropriate value");
+ continue;
+ }
+
+ $this->$fld['name'] = $input[$fld['name']];
+ }
+
+ else if (!is_null($fld['deflt']))
+ $this->$fld['name'] = $fld['deflt'];
+
+ else if ($fld['req'])
+ $this->logError($fld['name'] . " is required");
+ }
+
+ /* return */
+ return count($this->errorlist) == 0;
+ }
+}
+
+?>