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; } } ?>