diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php index 54bbce1904075404de5a2e6e5ca233671380fdca..db67f9ae75d99ed77dfe615a81799b0ce4799945 100644 --- a/interface/lib/classes/tform.inc.php +++ b/interface/lib/classes/tform.inc.php @@ -35,29 +35,29 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * sowie zum vorbereiten von HTML und SQL * Ausgaben * -* Tabellendefinition -* -* Datentypen: -* - INTEGER (Wandelt Ausdrücke in Int um) -* - DOUBLE -* - CURRENCY (Formatiert Zahlen nach Währungsnotation) -* - VARCHAR (kein weiterer Format Check) -* - DATE (Datumsformat, Timestamp Umwandlung) -* -* Formtype: -* - TEXT (normales Textfeld) -* - PASSWORD (Feldinhalt wird nicht angezeigt) -* - SELECT (Gibt Werte als option Feld aus) -* - MULTIPLE (Select-Feld mit nehreren Werten) -* -* VALUE: -* - Wert oder Array -* -* SEPARATOR -* - Trennzeichen für multiple Felder +* Tabellendefinition * -* Hinweis: -* Das ID-Feld ist nicht bei den Table Values einzufügen. +* Datentypen: +* - INTEGER (Wandelt Ausdrücke in Int um) +* - DOUBLE +* - CURRENCY (Formatiert Zahlen nach Währungsnotation) +* - VARCHAR (kein weiterer Format Check) +* - DATE (Datumsformat, Timestamp Umwandlung) +* +* Formtype: +* - TEXT (normales Textfeld) +* - PASSWORD (Feldinhalt wird nicht angezeigt) +* - SELECT (Gibt Werte als option Feld aus) +* - MULTIPLE (Select-Feld mit nehreren Werten) +* +* VALUE: +* - Wert oder Array +* +* SEPARATOR +* - Trennzeichen für multiple Felder +* +* Hinweis: +* Das ID-Feld ist nicht bei den Table Values einzufügen. * * @package form * @author Till Brehm @@ -65,822 +65,830 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ class tform { - - /** - * Definition der Tabelle (array) - * @var tableDef - */ - var $tableDef; - - /** - * Private - * @var action - */ - var $action; - - /** - * Tabellenname (String) - * @var table_name - */ - var $table_name; - - /** - * Debug Variable - * @var debug - */ - var $debug = 0; - - /** - * name des primary Field der Tabelle (string) - * @var table_index - */ - var $table_index; - - /** - * enthält die Fehlermeldung bei Überprüfung - * der Variablen mit Regex - * @var errorMessage - */ - var $errorMessage = ''; - - var $dateformat = "d.m.Y"; + + /** + * Definition der Tabelle (array) + * @var tableDef + */ + var $tableDef; + + /** + * Private + * @var action + */ + var $action; + + /** + * Tabellenname (String) + * @var table_name + */ + var $table_name; + + /** + * Debug Variable + * @var debug + */ + var $debug = 0; + + /** + * name des primary Field der Tabelle (string) + * @var table_index + */ + var $table_index; + + /** + * enthält die Fehlermeldung bei Überprüfung + * der Variablen mit Regex + * @var errorMessage + */ + var $errorMessage = ''; + + var $dateformat = "d.m.Y"; var $formDef; - var $wordbook; - var $module; - var $primary_id; - - /** - * Laden der Tabellendefinition - * - * @param file: Pfad zur Tabellendefinition - * @return true - */ - /* - function loadTableDef($file) { - global $app,$conf; - - include_once($file); - $this->tableDef = $table; - $this->table_name = $table_name; - $this->table_index = $table_index; - return true; - } - */ - + var $wordbook; + var $module; + var $primary_id; + + /** + * Laden der Tabellendefinition + * + * @param file: Pfad zur Tabellendefinition + * @return true + */ + /* + function loadTableDef($file) { + global $app,$conf; + + include_once($file); + $this->tableDef = $table; + $this->table_name = $table_name; + $this->table_index = $table_index; + return true; + } + */ + function loadFormDef($file,$module = '') { - global $app,$conf; - - include_once($file); - $this->formDef = $form; - - $this->module = $module; - if($module == '') { - include_once("lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng"); - } else { - include_once("../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng"); - } - $this->wordbook = $wb; - - return true; - } - - - /** - * Konvertiert die Daten des übergebenen assoziativen - * Arrays in "menschenlesbare" Form. - * Datentyp Konvertierung, z.B. für Ausgabe in Listen. - * - * @param record - * @return record - */ - function decode($record,$tab) { - if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); - if(is_array($record)) { - foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { - switch ($field['datatype']) { - case 'VARCHAR': - $new_record[$key] = stripslashes($record[$key]); - break; - - case 'TEXT': - $new_record[$key] = stripslashes($record[$key]); - break; - - case 'DATE': - if($record[$key] > 0) { - $new_record[$key] = date($this->dateformat,$record[$key]); - } - break; - - case 'INTEGER': - $new_record[$key] = intval($record[$key]); - break; - - case 'DOUBLE': - $new_record[$key] = $record[$key]; - break; - - case 'CURRENCY': - $new_record[$key] = number_format($record[$key], 2, ',', ''); - break; - - default: - $new_record[$key] = stripslashes($record[$key]); - } - } - - } - return $new_record; - } - - /** - * Get the key => value array of a form filed from a datasource definitiom - * - * @param field = NEW oder EDIT - * @param record = Dataset as array - * @return key => value array for the value field of a form - */ - - function getDatasourceData($field, $record) { - global $app; - - $values = array(); - - if($field["datasource"]["type"] == 'SQL') { - - // Preparing SQL string. We will replace some - // common placeholders - $querystring = $field["datasource"]["querystring"]; - $querystring = str_replace("{USERID}",$_SESSION["s"]["user"]["userid"],$querystring); - $querystring = str_replace("{GROUPID}",$_SESSION["s"]["user"]["default_group"],$querystring); - $querystring = str_replace("{GROUPS}",$_SESSION["s"]["user"]["groups"],$querystring); - $table_idx = $this->formDef['db_table_idx']; - $querystring = str_replace("{RECORDID}",$record[$table_idx],$querystring); - $querystring = str_replace("{AUTHSQL}",$this->getAuthSQL('r'),$querystring); - - // Getting the records - $tmp_records = $app->db->queryAllRecords($querystring); - if($app->db->errorMessage != '') die($app->db->errorMessage); - if(is_array($tmp_records)) { - $key_field = $field["datasource"]["keyfield"]; - $value_field = $field["datasource"]["valuefield"]; - foreach($tmp_records as $tmp_rec) { - $tmp_id = $tmp_rec[$key_field]; - $values[$tmp_id] = $tmp_rec[$value_field]; - } - } - } - - if($field["datasource"]["type"] == 'CUSTOM') { - // Calls a custom class to validate this record - if($field["datasource"]['class'] != '' and $field["datasource"]['function'] != '') { - $datasource_class = $field["datasource"]['class']; - $datasource_function = $field["datasource"]['function']; - $app->uses($datasource_class); - $values = $app->$datasource_class->$datasource_function($field, $record); - } else { - $this->errorMessage .= "Custom datasource class or function is empty<br>\r\n"; - } - } - - return $values; - - } - - - /** - * Record für Ausgabe in Formularen vorbereiten. - * - * @param record = Datensatz als Array - * @param action = NEW oder EDIT - * @return record - */ - function getHTML($record, $tab, $action = 'NEW') { - - global $app; - - $this->action = $action; - - if(!is_array($this->formDef)) $app->error("Keine Formdefinition vorhanden."); - if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); - - $new_record = array(); - if($action == 'EDIT') { - $record = $this->decode($record,$tab); - if(is_array($record)) { - foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { - $val = $record[$key]; - - // If Datasource is set, get the data from there - if(is_array($field['datasource'])) { - $field["value"] = $this->getDatasourceData($field, $record); - } - - switch ($field['formtype']) { - case 'SELECT': - if(is_array($field['value'])) { - $out = ''; - foreach($field['value'] as $k => $v) { - $selected = ($k == $val)?' SELECTED':''; - $out .= "<option value='$k'$selected>$v</option>\r\n"; - } - } - $new_record[$key] = $out; - break; - case 'MULTIPLE': - if(is_array($field['value'])) { - - // aufsplitten ergebnisse - $vals = explode($field['separator'],$val); - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - - $selected = ''; - foreach($vals as $tvl) { - if(trim($tvl) == trim($k)) $selected = ' SELECTED'; - } - - $out .= "<option value='$k'$selected>$v</option>\r\n"; - } - } - $new_record[$key] = $out; - break; - - case 'PASSWORD': - $new_record[$key] = ''; - break; - - case 'CHECKBOX': - $checked = (empty($val))?'':' CHECKED'; - $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n"; - break; - - case 'CHECKBOXARRAY': - if(is_array($field['value'])) { - - // aufsplitten ergebnisse - $vals = explode($field['separator'],$val); - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - - $checked = ''; - foreach($vals as $tvl) { - if(trim($tvl) == trim($k)) $checked = ' CHECKED'; - } - - $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked>$v <br />\r\n"; - } - } - $new_record[$key] = $out; - break; - - case 'RADIO': - if(is_array($field['value'])) { - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - $checked = ($k == $val)?' CHECKED':''; - $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n"; - } - } - $new_record[$key] = $out; - break; - - default: - $new_record[$key] = htmlspecialchars($record[$key]); - } - } - } - } else { - // Action: NEW - foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { - - // If Datasource is set, get the data from there - if(is_array($field['datasource'])) { - $field["value"] = $this->getDatasourceData($field, $record); - } - - switch ($field['formtype']) { - case 'SELECT': - if(is_array($field['value'])) { - $out = ''; - foreach($field['value'] as $k => $v) { - $selected = ($k == $val)?' SELECTED':''; - $out .= "<option value='$k'$selected>$v</option>\r\n"; - } - } - $new_record[$key] = $out; - break; - case 'MULTIPLE': - if(is_array($field['value'])) { - - // aufsplitten ergebnisse - $vals = explode($field['separator'],$val); - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - - $out .= "<option value='$k'>$v</option>\r\n"; - } - } - $new_record[$key] = $out; - break; - - case 'PASSWORD': - $new_record[$key] = ''; - break; - - case 'CHECKBOX': - $checked = (empty($field["default"]))?'':' CHECKED'; - $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n"; - break; - - case 'CHECKBOXARRAY': - if(is_array($field['value'])) { - - // aufsplitten ergebnisse - $vals = explode($field['separator'],$field["default"]); - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - - $checked = ''; - foreach($vals as $tvl) { - if(trim($tvl) == trim($k)) $checked = ' CHECKED'; - } - - $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked> $v<br />\r\n"; - } - } - $new_record[$key] = $out; - break; - - case 'RADIO': - if(is_array($field['value'])) { - - // HTML schreiben - $out = ''; - foreach($field['value'] as $k => $v) { - $checked = ($k == $field["default"])?' CHECKED':''; - $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n"; - } - } - $new_record[$key] = $out; - break; - - default: - $new_record[$key] = htmlspecialchars($field['default']); - } - } - - } - - if($this->debug == 1) $this->dbg($new_record); - - return $new_record; - } - - /** - * Record in "maschinen lesbares" Format überführen - * und Werte gegen reguläre Ausdrücke prüfen. - * - * @param record = Datensatz als Array - * @return record - */ - function encode($record,$tab) { - - if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); - //$this->errorMessage = ''; - - if(is_array($record)) { - foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { - - if(is_array($field['validators'])) $this->validateField($key, $record[$key], $field['validators']); - - switch ($field['datatype']) { - case 'VARCHAR': - if(!is_array($record[$key])) { - $new_record[$key] = addslashes($record[$key]); - } else { - $new_record[$key] = implode($field['separator'],$record[$key]); - } - break; - case 'TEXT': - if(!is_array($record[$key])) { - $new_record[$key] = addslashes($record[$key]); - } else { - $new_record[$key] = implode($field['separator'],$record[$key]); - } - break; - case 'DATE': - if($record[$key] > 0) { - list($tag,$monat,$jahr) = explode('.',$record[$key]); - $new_record[$key] = mktime(0,0,0,$monat,$tag,$jahr); - } - break; - case 'INTEGER': - $new_record[$key] = intval($record[$key]); - break; - case 'DOUBLE': - $new_record[$key] = addslashes($record[$key]); - break; - case 'CURRENCY': - $new_record[$key] = str_replace(",",".",$record[$key]); - break; - } - - // The use of the field value is deprecated, use validators instead - if($field['regex'] != '') { - // Enable that "." matches also newlines - $field['regex'] .= 's'; - if(!preg_match($field['regex'], $record[$key])) { - $errmsg = $field['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - } - - - } - } - return $new_record; - } - - /** - * process the validators for a given field. - * - * @param field_name = Name of the field - * @param field_value = value of the field - * @param validatoors = Array of validators - * @return record - */ - - function validateField($field_name, $field_value, $validators) { - - global $app; - - // loop trough the validators - foreach($validators as $validator) { - - switch ($validator['type']) { - case 'REGEX': - $validator['regex'] .= 's'; - if(!preg_match($validator['regex'], $field_value)) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - break; - case 'UNIQUE': - if($this->action == 'NEW') { - $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."'"); - if($num_rec["number"] > 0) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - } else { - $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."' AND ".$this->formDef['db_table_idx']." != ".$this->primary_id); - if($num_rec["number"] > 0) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - } - break; - case 'NOTEMPTY': - if(empty($field_value)) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - break; - case 'ISEMAIL': - if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,4}$/i", $field_value)) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - break; - case 'ISINT': - $tmpval = intval($field_value); - if($tmpval === 0 and !empty($field_value)) { - $errmsg = $validator['errmsg']; - $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; - } - break; - case 'CUSTOM': - // Calls a custom class to validate this record - if($validator['class'] != '' and $validator['function'] != '') { - $validator_class = $validator['class']; - $validator_function = $validator['function']; - $app->uses($validator_class); - $this->errorMessage .= $app->$validator_class->$validator_function($validator); - } else { - $this->errorMessage .= "Custom validator class or function is empty<br>\r\n"; - } - break; - } - - - } - - return true; - } - - /** - * SQL Statement für Record erzeugen. - * - * @param record = Datensatz als Array - * @param action = INSERT oder UPDATE - * @param primary_id - * @return record - */ - function getSQL($record, $tab, $action = 'INSERT', $primary_id = 0, $sql_ext_where = '') { - - global $app; - - // If there are no data records on the tab, return empty sql string - if(count($this->formDef['tabs'][$tab]['fields']) == 0) return ''; - - // checking permissions - if($this->formDef['auth'] == 'yes') { - if($action == "INSERT") { - if(!$this->checkPerm($primary_id,'i')) $this->errorMessage .= "Insert denied.<br>\r\n"; - } else { - if(!$this->checkPerm($primary_id,'u')) $this->errorMessage .= "Insert denied.<br>\r\n"; - } - } - - $this->action = $action; - $this->primary_id = $primary_id; - - $record = $this->encode($record,$tab); - $sql_insert_key = ''; - $sql_insert_val = ''; - $sql_update = ''; - - if(!is_array($this->formDef)) $app->error("Keine Formulardefinition vorhanden."); - if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); - - // gehe durch alle Felder des Tabs - if(is_array($record)) { - foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { - // Wenn es kein leeres Passwortfeld ist - if (!($field['formtype'] == 'PASSWORD' and $record[$key] == '')) { - // Erzeuge Insert oder Update Quelltext - if($action == "INSERT") { - if($field['formtype'] == 'PASSWORD') { - $sql_insert_key .= "`$key`, "; - if($field['encryption'] == 'CRYPT') { - $sql_insert_val .= "'".crypt($record[$key])."', "; - } else { - $sql_insert_val .= "md5('".$record[$key]."'), "; - } - } else { - $sql_insert_key .= "`$key`, "; - $sql_insert_val .= "'".$record[$key]."', "; - } - } else { - if($field['formtype'] == 'PASSWORD') { - if($field['encryption'] == 'CRYPT') { - $sql_update .= "`$key` = '".crypt($record[$key])."', "; - } else { - $sql_update .= "`$key` = md5('".$record[$key]."'), "; - } - } else { - $sql_update .= "`$key` = '".$record[$key]."', "; - } - } - } - } + global $app,$conf; + + include_once($file); + $this->formDef = $form; + + $this->module = $module; + if($module == '') { + include_once("lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng"); + } else { + include_once("../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng"); + } + $this->wordbook = $wb; + + return true; } - - - // Füge Backticks nur bei unvollständigen Tabellennamen ein - if(stristr($this->formDef['db_table'],'.')) { - $escape = ''; - } else { - $escape = '`'; - } - - - if($action == "INSERT") { - if($this->formDef['auth'] == 'yes') { - // Setze User und Gruppe - $sql_insert_key .= "`sys_userid`, "; - $sql_insert_val .= ($this->formDef["auth_preset"]["userid"] > 0)?"'".$this->formDef["auth_preset"]["userid"]."', ":"'".$_SESSION["s"]["user"]["userid"]."', "; - $sql_insert_key .= "`sys_groupid`, "; - $sql_insert_val .= ($this->formDef["auth_preset"]["groupid"] > 0)?"'".$this->formDef["auth_preset"]["groupid"]."', ":"'".$_SESSION["s"]["user"]["default_group"]."', "; - $sql_insert_key .= "`sys_perm_user`, "; - $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_user"]."', "; - $sql_insert_key .= "`sys_perm_group`, "; - $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_group"]."', "; - $sql_insert_key .= "`sys_perm_other`, "; - $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_other"]."', "; - } - $sql_insert_key = substr($sql_insert_key,0,-2); - $sql_insert_val = substr($sql_insert_val,0,-2); - $sql = "INSERT INTO ".$escape.$this->formDef['db_table'].$escape." ($sql_insert_key) VALUES ($sql_insert_val)"; - } else { - if($primary_id != 0) { - $sql_update = substr($sql_update,0,-2); - $sql = "UPDATE ".$escape.$this->formDef['db_table'].$escape." SET ".$sql_update." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id; - if($sql_ext_where != '') $sql .= " and ".$sql_ext_where; - } else { - $app->error("Primary ID fehlt!"); - } - } - - // Daten in History tabelle speichern - if($this->errorMessage == '' and $this->formDef['db_history'] == 'yes') $this->datalogSave($action,$primary_id,$record); - - return $sql; - } - - /** - * Debugging arrays. - * - * @param array_data - */ - function dbg($array_data) { - - echo "<pre>"; - print_r($array_data); - echo "</pre>"; - - } - - + + + /** + * Konvertiert die Daten des übergebenen assoziativen + * Arrays in "menschenlesbare" Form. + * Datentyp Konvertierung, z.B. für Ausgabe in Listen. + * + * @param record + * @return record + */ + function decode($record,$tab) { + if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); + if(is_array($record)) { + foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { + switch ($field['datatype']) { + case 'VARCHAR': + $new_record[$key] = stripslashes($record[$key]); + break; + + case 'TEXT': + $new_record[$key] = stripslashes($record[$key]); + break; + + case 'DATE': + if($record[$key] > 0) { + $new_record[$key] = date($this->dateformat,$record[$key]); + } + break; + + case 'INTEGER': + $new_record[$key] = intval($record[$key]); + break; + + case 'DOUBLE': + $new_record[$key] = $record[$key]; + break; + + case 'CURRENCY': + $new_record[$key] = number_format($record[$key], 2, ',', ''); + break; + + default: + $new_record[$key] = stripslashes($record[$key]); + } + } + + } + return $new_record; + } + + /** + * Get the key => value array of a form filed from a datasource definitiom + * + * @param field = NEW oder EDIT + * @param record = Dataset as array + * @return key => value array for the value field of a form + */ + + function getDatasourceData($field, $record) { + global $app; + + $values = array(); + + if($field["datasource"]["type"] == 'SQL') { + + // Preparing SQL string. We will replace some + // common placeholders + $querystring = $field["datasource"]["querystring"]; + $querystring = str_replace("{USERID}",$_SESSION["s"]["user"]["userid"],$querystring); + $querystring = str_replace("{GROUPID}",$_SESSION["s"]["user"]["default_group"],$querystring); + $querystring = str_replace("{GROUPS}",$_SESSION["s"]["user"]["groups"],$querystring); + $table_idx = $this->formDef['db_table_idx']; + $querystring = str_replace("{RECORDID}",$record[$table_idx],$querystring); + $querystring = str_replace("{AUTHSQL}",$this->getAuthSQL('r'),$querystring); + + // Getting the records + $tmp_records = $app->db->queryAllRecords($querystring); + if($app->db->errorMessage != '') die($app->db->errorMessage); + if(is_array($tmp_records)) { + $key_field = $field["datasource"]["keyfield"]; + $value_field = $field["datasource"]["valuefield"]; + foreach($tmp_records as $tmp_rec) { + $tmp_id = $tmp_rec[$key_field]; + $values[$tmp_id] = $tmp_rec[$value_field]; + } + } + } + + if($field["datasource"]["type"] == 'CUSTOM') { + // Calls a custom class to validate this record + if($field["datasource"]['class'] != '' and $field["datasource"]['function'] != '') { + $datasource_class = $field["datasource"]['class']; + $datasource_function = $field["datasource"]['function']; + $app->uses($datasource_class); + $values = $app->$datasource_class->$datasource_function($field, $record); + } else { + $this->errorMessage .= "Custom datasource class or function is empty<br>\r\n"; + } + } + + return $values; + + } + + + /** + * Record für Ausgabe in Formularen vorbereiten. + * + * @param record = Datensatz als Array + * @param action = NEW oder EDIT + * @return record + */ + function getHTML($record, $tab, $action = 'NEW') { + + global $app; + + $this->action = $action; + + if(!is_array($this->formDef)) $app->error("Keine Formdefinition vorhanden."); + if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); + + $new_record = array(); + if($action == 'EDIT') { + $record = $this->decode($record,$tab); + if(is_array($record)) { + foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { + $val = $record[$key]; + + // If Datasource is set, get the data from there + if(is_array($field['datasource'])) { + $field["value"] = $this->getDatasourceData($field, $record); + } + + switch ($field['formtype']) { + case 'SELECT': + if(is_array($field['value'])) { + $out = ''; + foreach($field['value'] as $k => $v) { + $selected = ($k == $val)?' SELECTED':''; + $out .= "<option value='$k'$selected>$v</option>\r\n"; + } + } + $new_record[$key] = $out; + break; + case 'MULTIPLE': + if(is_array($field['value'])) { + + // aufsplitten ergebnisse + $vals = explode($field['separator'],$val); + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + + $selected = ''; + foreach($vals as $tvl) { + if(trim($tvl) == trim($k)) $selected = ' SELECTED'; + } + + $out .= "<option value='$k'$selected>$v</option>\r\n"; + } + } + $new_record[$key] = $out; + break; + + case 'PASSWORD': + $new_record[$key] = ''; + break; + + case 'CHECKBOX': + $checked = (empty($val))?'':' CHECKED'; + $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n"; + break; + + case 'CHECKBOXARRAY': + if(is_array($field['value'])) { + + // aufsplitten ergebnisse + $vals = explode($field['separator'],$val); + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + + $checked = ''; + foreach($vals as $tvl) { + if(trim($tvl) == trim($k)) $checked = ' CHECKED'; + } + + $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked>$v <br />\r\n"; + } + } + $new_record[$key] = $out; + break; + + case 'RADIO': + if(is_array($field['value'])) { + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + $checked = ($k == $val)?' CHECKED':''; + $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n"; + } + } + $new_record[$key] = $out; + break; + + default: + $new_record[$key] = htmlspecialchars($record[$key]); + } + } + } + } else { + // Action: NEW + foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { + + // If Datasource is set, get the data from there + if(is_array($field['datasource'])) { + $field["value"] = $this->getDatasourceData($field, $record); + } + + switch ($field['formtype']) { + case 'SELECT': + if(is_array($field['value'])) { + $out = ''; + foreach($field['value'] as $k => $v) { + $selected = ($k == $val)?' SELECTED':''; + $out .= "<option value='$k'$selected>$v</option>\r\n"; + } + } + $new_record[$key] = $out; + break; + case 'MULTIPLE': + if(is_array($field['value'])) { + + // aufsplitten ergebnisse + $vals = explode($field['separator'],$val); + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + + $out .= "<option value='$k'>$v</option>\r\n"; + } + } + $new_record[$key] = $out; + break; + + case 'PASSWORD': + $new_record[$key] = ''; + break; + + case 'CHECKBOX': + $checked = (empty($field["default"]))?'':' CHECKED'; + $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n"; + break; + + case 'CHECKBOXARRAY': + if(is_array($field['value'])) { + + // aufsplitten ergebnisse + $vals = explode($field['separator'],$field["default"]); + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + + $checked = ''; + foreach($vals as $tvl) { + if(trim($tvl) == trim($k)) $checked = ' CHECKED'; + } + + $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked> $v<br />\r\n"; + } + } + $new_record[$key] = $out; + break; + + case 'RADIO': + if(is_array($field['value'])) { + + // HTML schreiben + $out = ''; + foreach($field['value'] as $k => $v) { + $checked = ($k == $field["default"])?' CHECKED':''; + $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n"; + } + } + $new_record[$key] = $out; + break; + + default: + $new_record[$key] = htmlspecialchars($field['default']); + } + } + + } + + if($this->debug == 1) $this->dbg($new_record); + + return $new_record; + } + + /** + * Record in "maschinen lesbares" Format überführen + * und Werte gegen reguläre Ausdrücke prüfen. + * + * @param record = Datensatz als Array + * @return record + */ + function encode($record,$tab) { + + if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); + //$this->errorMessage = ''; + + if(is_array($record)) { + foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { + + if(is_array($field['validators'])) $this->validateField($key, $record[$key], $field['validators']); + + switch ($field['datatype']) { + case 'VARCHAR': + if(!is_array($record[$key])) { + $new_record[$key] = addslashes($record[$key]); + } else { + $new_record[$key] = implode($field['separator'],$record[$key]); + } + break; + case 'TEXT': + if(!is_array($record[$key])) { + $new_record[$key] = addslashes($record[$key]); + } else { + $new_record[$key] = implode($field['separator'],$record[$key]); + } + break; + case 'DATE': + if($record[$key] > 0) { + list($tag,$monat,$jahr) = explode('.',$record[$key]); + $new_record[$key] = mktime(0,0,0,$monat,$tag,$jahr); + } + break; + case 'INTEGER': + $new_record[$key] = intval($record[$key]); + //if($new_record[$key] != $record[$key]) $new_record[$key] = $field['default']; + //if($key == 'refresh') die($record[$key]); + break; + case 'DOUBLE': + $new_record[$key] = addslashes($record[$key]); + break; + case 'CURRENCY': + $new_record[$key] = str_replace(",",".",$record[$key]); + break; + } + + // The use of the field value is deprecated, use validators instead + if($field['regex'] != '') { + // Enable that "." matches also newlines + $field['regex'] .= 's'; + if(!preg_match($field['regex'], $record[$key])) { + $errmsg = $field['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + } + + + } + } + return $new_record; + } + + /** + * process the validators for a given field. + * + * @param field_name = Name of the field + * @param field_value = value of the field + * @param validatoors = Array of validators + * @return record + */ + + function validateField($field_name, $field_value, $validators) { + + global $app; + + // loop trough the validators + foreach($validators as $validator) { + + switch ($validator['type']) { + case 'REGEX': + $validator['regex'] .= 's'; + if(!preg_match($validator['regex'], $field_value)) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + break; + case 'UNIQUE': + if($this->action == 'NEW') { + $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."'"); + if($num_rec["number"] > 0) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + } else { + $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."' AND ".$this->formDef['db_table_idx']." != ".$this->primary_id); + if($num_rec["number"] > 0) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + } + break; + case 'NOTEMPTY': + if(empty($field_value)) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + break; + case 'ISEMAIL': + if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,4}$/i", $field_value)) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + break; + case 'ISINT': + $tmpval = intval($field_value); + if($tmpval === 0 and !empty($field_value)) { + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + break; + case 'ISPOSITIVE': + if(!is_numeric($field_value) || $field_value <= 0){ + $errmsg = $validator['errmsg']; + $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n"; + } + break; + case 'CUSTOM': + // Calls a custom class to validate this record + if($validator['class'] != '' and $validator['function'] != '') { + $validator_class = $validator['class']; + $validator_function = $validator['function']; + $app->uses($validator_class); + $this->errorMessage .= $app->$validator_class->$validator_function($validator); + } else { + $this->errorMessage .= "Custom validator class or function is empty<br>\r\n"; + } + break; + } + + + } + + return true; + } + + /** + * SQL Statement für Record erzeugen. + * + * @param record = Datensatz als Array + * @param action = INSERT oder UPDATE + * @param primary_id + * @return record + */ + function getSQL($record, $tab, $action = 'INSERT', $primary_id = 0, $sql_ext_where = '') { + + global $app; + + // If there are no data records on the tab, return empty sql string + if(count($this->formDef['tabs'][$tab]['fields']) == 0) return ''; + + // checking permissions + if($this->formDef['auth'] == 'yes') { + if($action == "INSERT") { + if(!$this->checkPerm($primary_id,'i')) $this->errorMessage .= "Insert denied.<br>\r\n"; + } else { + if(!$this->checkPerm($primary_id,'u')) $this->errorMessage .= "Insert denied.<br>\r\n"; + } + } + + $this->action = $action; + $this->primary_id = $primary_id; + + $record = $this->encode($record,$tab); + $sql_insert_key = ''; + $sql_insert_val = ''; + $sql_update = ''; + + if(!is_array($this->formDef)) $app->error("Keine Formulardefinition vorhanden."); + if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab)."); + + // gehe durch alle Felder des Tabs + if(is_array($record)) { + foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { + // Wenn es kein leeres Passwortfeld ist + if (!($field['formtype'] == 'PASSWORD' and $record[$key] == '')) { + // Erzeuge Insert oder Update Quelltext + if($action == "INSERT") { + if($field['formtype'] == 'PASSWORD') { + $sql_insert_key .= "`$key`, "; + if($field['encryption'] == 'CRYPT') { + $sql_insert_val .= "'".crypt($record[$key])."', "; + } else { + $sql_insert_val .= "md5('".$record[$key]."'), "; + } + } else { + $sql_insert_key .= "`$key`, "; + $sql_insert_val .= "'".$record[$key]."', "; + } + } else { + if($field['formtype'] == 'PASSWORD') { + if($field['encryption'] == 'CRYPT') { + $sql_update .= "`$key` = '".crypt($record[$key])."', "; + } else { + $sql_update .= "`$key` = md5('".$record[$key]."'), "; + } + } else { + $sql_update .= "`$key` = '".$record[$key]."', "; + } + } + } + } + } + + + // Füge Backticks nur bei unvollständigen Tabellennamen ein + if(stristr($this->formDef['db_table'],'.')) { + $escape = ''; + } else { + $escape = '`'; + } + + + if($action == "INSERT") { + if($this->formDef['auth'] == 'yes') { + // Setze User und Gruppe + $sql_insert_key .= "`sys_userid`, "; + $sql_insert_val .= ($this->formDef["auth_preset"]["userid"] > 0)?"'".$this->formDef["auth_preset"]["userid"]."', ":"'".$_SESSION["s"]["user"]["userid"]."', "; + $sql_insert_key .= "`sys_groupid`, "; + $sql_insert_val .= ($this->formDef["auth_preset"]["groupid"] > 0)?"'".$this->formDef["auth_preset"]["groupid"]."', ":"'".$_SESSION["s"]["user"]["default_group"]."', "; + $sql_insert_key .= "`sys_perm_user`, "; + $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_user"]."', "; + $sql_insert_key .= "`sys_perm_group`, "; + $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_group"]."', "; + $sql_insert_key .= "`sys_perm_other`, "; + $sql_insert_val .= "'".$this->formDef["auth_preset"]["perm_other"]."', "; + } + $sql_insert_key = substr($sql_insert_key,0,-2); + $sql_insert_val = substr($sql_insert_val,0,-2); + $sql = "INSERT INTO ".$escape.$this->formDef['db_table'].$escape." ($sql_insert_key) VALUES ($sql_insert_val)"; + } else { + if($primary_id != 0) { + $sql_update = substr($sql_update,0,-2); + $sql = "UPDATE ".$escape.$this->formDef['db_table'].$escape." SET ".$sql_update." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id; + if($sql_ext_where != '') $sql .= " and ".$sql_ext_where; + } else { + $app->error("Primary ID fehlt!"); + } + } + + // Daten in History tabelle speichern + if($this->errorMessage == '' and $this->formDef['db_history'] == 'yes') $this->datalogSave($action,$primary_id,$record); + + return $sql; + } + + /** + * Debugging arrays. + * + * @param array_data + */ + function dbg($array_data) { + + echo "<pre>"; + print_r($array_data); + echo "</pre>"; + + } + + function showForm() { - global $app,$conf; - + global $app,$conf; + if(!is_array($this->formDef)) die("Form Definition wurde nicht geladen."); - - $active_tab = $this->getNextTab(); - + + $active_tab = $this->getNextTab(); + // definiere Tabs foreach( $this->formDef["tabs"] as $key => $tab) { - - $tab['name'] = $key; + + $tab['name'] = $key; if($tab['name'] == $active_tab) { - - // Wenn Modul gesetzt, dann setzte template pfad relativ zu modul. - if($this->module != '') $tab["template"] = "../".$this->module."/".$tab["template"]; - - // überprüfe, ob das Template existiert, wenn nicht - // dann generiere das Template - if(!is_file($tab["template"])) { - $app->uses('tform_tpl_generator'); - $app->tform_tpl_generator->buildHTML($this->formDef,$tab['name']); - } - - $app->tpl->setInclude('content_tpl',$tab["template"]); + + // Wenn Modul gesetzt, dann setzte template pfad relativ zu modul. + if($this->module != '') $tab["template"] = "../".$this->module."/".$tab["template"]; + + // überprüfe, ob das Template existiert, wenn nicht + // dann generiere das Template + if(!is_file($tab["template"])) { + $app->uses('tform_tpl_generator'); + $app->tform_tpl_generator->buildHTML($this->formDef,$tab['name']); + } + + $app->tpl->setInclude('content_tpl',$tab["template"]); $tab["active"] = 1; $_SESSION["s"]["form"]["tab"] = $tab['name']; } else { - $tab["active"] = 0; + $tab["active"] = 0; } - - // Die Datenfelder werden für die Tabs nicht benötigt - unset($tab["fields"]); - unset($tab["plugins"]); - + + // Die Datenfelder werden für die Tabs nicht benötigt + unset($tab["fields"]); + unset($tab["plugins"]); + $frmTab[] = $tab; } - + // setting form tabs $app->tpl->setLoop("formTab", $frmTab); - // Set form action - $app->tpl->setVar('form_action',$this->formDef["action"]); - $app->tpl->setVar('form_active_tab',$active_tab); - - // Set form title - $form_hint = '<b>'.$this->formDef["title"].'</b>'; - if($this->formDef["description"] != '') $form_hint .= '<br><br>'.$this->formDef["description"]; - $app->tpl->setVar('form_hint',$form_hint); - - // Set Wordbook for this form - - $app->tpl->setVar($this->wordbook); + // Set form action + $app->tpl->setVar('form_action',$this->formDef["action"]); + $app->tpl->setVar('form_active_tab',$active_tab); + + // Set form title + $form_hint = '<b>'.$this->formDef["title"].'</b>'; + if($this->formDef["description"] != '') $form_hint .= '<br><br>'.$this->formDef["description"]; + $app->tpl->setVar('form_hint',$form_hint); + + // Set Wordbook for this form + + $app->tpl->setVar($this->wordbook); } - - - - function datalogSave($action,$primary_id,$record_new) { - global $app,$conf; - - // Füge Backticks nur bei unvollständigen Tabellennamen ein - if(stristr($this->formDef['db_table'],'.')) { - $escape = ''; - } else { - $escape = '`'; - } - - if($action == "UPDATE") { - $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id; - $record_old = $app->db->queryOneRecord($sql); - } else { - $record_old = array(); - } - - $diffrec = array(); - - if(is_array($record_new)) { - foreach($record_new as $key => $val) { - if($record_old[$key] != $val) { - // Datensatz hat sich geändert - $diffrec[$key] = array('old' => $record_old[$key], - 'new' => $val); - } - } - } - - if(count($diffrec) > 0) { - $diffstr = $app->db->quote(serialize($diffrec)); - $username = $app->db->quote($_SESSION["s"]["user"]["username"]); - $dbidx = $this->formDef['db_table_idx'].":".$primary_id; - $action = ($action == 'INSERT')?'i':'u'; - $sql = "INSERT INTO sys_datalog (dbtable,dbidx,action,tstamp,user,data) VALUES ('".$this->formDef['db_table']."','$dbidx','$action','".time()."','$username','$diffstr')"; - $app->db->query($sql); - } - - return true; - - } - - function getAuthSQL($perm) { - - $sql = '('; - $sql .= "(sys_userid = ".$_SESSION["s"]["user"]["userid"]." AND sys_perm_user like '%$perm%') OR "; - $sql .= "(sys_groupid IN (".$_SESSION["s"]["user"]["groups"].") AND sys_perm_group like '%$perm%') OR "; - $sql .= "sys_perm_other like '%$perm%'"; - $sql .= ')'; - - return $sql; - } - - /* - Diese funktion überprüft, ob ein User die Berechtigung $perm für den Datensatz mit der ID $record_id - hat. It record_id = 0, dann wird gegen die user Defaults des Formulares getestet. - */ - function checkPerm($record_id,$perm) { - global $app; - - if($record_id > 0) { - // Füge Backticks nur bei unvollständigen Tabellennamen ein - if(stristr($this->formDef['db_table'],'.')) { - $escape = ''; - } else { - $escape = '`'; - } - - $sql = "SELECT ".$this->formDef['db_table_idx']." FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$record_id." AND ".$this->getAuthSQL($perm); - if($record = $app->db->queryOneRecord($sql)) { - return true; - } else { - return false; - } - } else { - $result = false; - if($this->formDef["auth_preset"]["userid"] == $_SESSION["s"]["user"]["userid"] && stristr($perm,$this->formDef["auth_preset"]["perm_user"])) $result = true; - if($this->formDef["auth_preset"]["groupid"] == $_SESSION["s"]["user"]["groupid"] && stristr($perm,$this->formDef["auth_preset"]["perm_group"])) $result = true; - if(@stristr($perm,$this->formDef["auth_preset"]["perm_other"])) $result = true; - - // if preset == 0, everyone can insert a record of this type - if($this->formDef["auth_preset"]["userid"] == 0 AND $this->formDef["auth_preset"]["groupid"] == 0) $result = true; - - return $result; - - } - - } - - function getNextTab() { - // Welcher Tab wird angezeigt - if($this->errorMessage == '') { - // wenn kein Fehler vorliegt - if($_REQUEST["next_tab"] != '') { - // wenn nächster Tab bekannt - $active_tab = $_REQUEST["next_tab"]; - } else { - // ansonsten ersten tab nehmen - $active_tab = $this->formDef['tab_default']; - } - } else { - // bei Fehlern den gleichen Tab nochmal anzeigen - $active_tab = $_SESSION["s"]["form"]["tab"]; - } - - return $active_tab; - } - - function getCurrentTab() { - return $_SESSION["s"]["form"]["tab"]; - } - + + + + function datalogSave($action,$primary_id,$record_new) { + global $app,$conf; + + // Füge Backticks nur bei unvollständigen Tabellennamen ein + if(stristr($this->formDef['db_table'],'.')) { + $escape = ''; + } else { + $escape = '`'; + } + + if($action == "UPDATE") { + $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id; + $record_old = $app->db->queryOneRecord($sql); + } else { + $record_old = array(); + } + + $diffrec = array(); + + if(is_array($record_new)) { + foreach($record_new as $key => $val) { + if($record_old[$key] != $val) { + // Datensatz hat sich geändert + $diffrec[$key] = array('old' => $record_old[$key], + 'new' => $val); + } + } + } + + if(count($diffrec) > 0) { + $diffstr = $app->db->quote(serialize($diffrec)); + $username = $app->db->quote($_SESSION["s"]["user"]["username"]); + $dbidx = $this->formDef['db_table_idx'].":".$primary_id; + $action = ($action == 'INSERT')?'i':'u'; + $sql = "INSERT INTO sys_datalog (dbtable,dbidx,action,tstamp,user,data) VALUES ('".$this->formDef['db_table']."','$dbidx','$action','".time()."','$username','$diffstr')"; + $app->db->query($sql); + } + + return true; + + } + + function getAuthSQL($perm) { + + $sql = '('; + $sql .= "(sys_userid = ".$_SESSION["s"]["user"]["userid"]." AND sys_perm_user like '%$perm%') OR "; + $sql .= "(sys_groupid IN (".$_SESSION["s"]["user"]["groups"].") AND sys_perm_group like '%$perm%') OR "; + $sql .= "sys_perm_other like '%$perm%'"; + $sql .= ')'; + + return $sql; + } + + /* + Diese funktion überprüft, ob ein User die Berechtigung $perm für den Datensatz mit der ID $record_id + hat. It record_id = 0, dann wird gegen die user Defaults des Formulares getestet. + */ + function checkPerm($record_id,$perm) { + global $app; + + if($record_id > 0) { + // Füge Backticks nur bei unvollständigen Tabellennamen ein + if(stristr($this->formDef['db_table'],'.')) { + $escape = ''; + } else { + $escape = '`'; + } + + $sql = "SELECT ".$this->formDef['db_table_idx']." FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$record_id." AND ".$this->getAuthSQL($perm); + if($record = $app->db->queryOneRecord($sql)) { + return true; + } else { + return false; + } + } else { + $result = false; + if($this->formDef["auth_preset"]["userid"] == $_SESSION["s"]["user"]["userid"] && stristr($perm,$this->formDef["auth_preset"]["perm_user"])) $result = true; + if($this->formDef["auth_preset"]["groupid"] == $_SESSION["s"]["user"]["groupid"] && stristr($perm,$this->formDef["auth_preset"]["perm_group"])) $result = true; + if(@stristr($perm,$this->formDef["auth_preset"]["perm_other"])) $result = true; + + // if preset == 0, everyone can insert a record of this type + if($this->formDef["auth_preset"]["userid"] == 0 AND $this->formDef["auth_preset"]["groupid"] == 0) $result = true; + + return $result; + + } + + } + + function getNextTab() { + // Welcher Tab wird angezeigt + if($this->errorMessage == '') { + // wenn kein Fehler vorliegt + if($_REQUEST["next_tab"] != '') { + // wenn nächster Tab bekannt + $active_tab = $_REQUEST["next_tab"]; + } else { + // ansonsten ersten tab nehmen + $active_tab = $this->formDef['tab_default']; + } + } else { + // bei Fehlern den gleichen Tab nochmal anzeigen + $active_tab = $_SESSION["s"]["form"]["tab"]; + } + + return $active_tab; + } + + function getCurrentTab() { + return $_SESSION["s"]["form"]["tab"]; + } + } ?> \ No newline at end of file diff --git a/interface/web/dns/form/rr.tform.php b/interface/web/dns/form/rr.tform.php index 40284a838f78691f71fab12121840ea1976d7033..f58d1c4f39f765e781256c0e3910c9e43f6c378e 100644 --- a/interface/web/dns/form/rr.tform.php +++ b/interface/web/dns/form/rr.tform.php @@ -118,8 +118,8 @@ $form["tabs"]['rr'] = array ( 'ttl' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', - 'validators' => array (0 => array ('type' => 'NOTEMPTY', - 'errmsg'=> 'rr_ttl_error_empty'), + 'validators' => array (0 => array ('type' => 'ISPOSITIVE', + 'errmsg'=> 'rr_ttl_error_notpositive'), ), 'default' => '86400', 'value' => '86400', diff --git a/interface/web/dns/form/soa.tform.php b/interface/web/dns/form/soa.tform.php index 354b969ffd05c84bed857483903c3d51535fefa5..9b39b6ad10187a2bf925926f1b5dfce27606664a 100644 --- a/interface/web/dns/form/soa.tform.php +++ b/interface/web/dns/form/soa.tform.php @@ -109,6 +109,9 @@ $form["tabs"]['soa'] = array ( 'serial' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'serial_error_notpositive'), + ), 'default' => date("Ymd").'01', 'value' => date("Ymd").'01', 'width' => '30', @@ -117,6 +120,9 @@ $form["tabs"]['soa'] = array ( 'refresh' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'refresh_error_notpositive'), + ), 'default' => $conf['default_refresh'], 'value' => $conf['default_refresh'], 'width' => '30', @@ -125,6 +131,9 @@ $form["tabs"]['soa'] = array ( 'retry' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'retry_error_notpositive'), + ), 'default' => $conf['default_retry'], 'value' => $conf['default_retry'], 'width' => '30', @@ -133,6 +142,9 @@ $form["tabs"]['soa'] = array ( 'expire' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'expire_error_notpositive'), + ), 'default' => $conf['default_expire'], 'value' => $conf['default_expire'], 'width' => '30', @@ -141,6 +153,9 @@ $form["tabs"]['soa'] = array ( 'minimum' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'minimum_error_notpositive'), + ), 'default' => $conf['default_minimum_ttl'], 'value' => $conf['default_minimum_ttl'], 'width' => '30', @@ -149,6 +164,9 @@ $form["tabs"]['soa'] = array ( 'ttl' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', + 'validators' => array (0 => array ( 'type' => 'ISPOSITIVE', + 'errmsg'=> 'ttl_error_notpositive'), + ), 'default' => $conf['default_ttl'], 'value' => $conf['default_ttl'], 'width' => '30', diff --git a/interface/web/dns/lib/lang/en_rr.lng b/interface/web/dns/lib/lang/en_rr.lng index 7b70435738a1efeb5b54773ad5fe641701ca07b7..1a3aba7ee8c5f66302bd2faa9ae047b72f79fd8b 100644 --- a/interface/web/dns/lib/lang/en_rr.lng +++ b/interface/web/dns/lib/lang/en_rr.lng @@ -1,10 +1,12 @@ <?php -$wb["zone_txt"] = 'zone'; -$wb["name_txt"] = 'name'; -$wb["type_txt"] = 'type'; -$wb["data_txt"] = 'data'; -$wb["aux_txt"] = 'aux'; -$wb["ttl_txt"] = 'ttl'; +$wb["zone_txt"] = 'Zone'; +$wb["name_txt"] = 'Name'; +$wb["type_txt"] = 'Type'; +$wb["data_txt"] = 'Data'; +$wb["aux_txt"] = 'Preference/Priority'; +$wb["ttl_txt"] = 'TTL'; $wb["btn_save_txt"] = 'Save'; $wb["btn_cancel_txt"] = 'Cancel'; +$wb["rr_data_error_empty"] = 'The data field must not be empty!'; +$wb["rr_ttl_error_notpositive"] = 'The TTL must be positive!'; ?> \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_rr_list.lng b/interface/web/dns/lib/lang/en_rr_list.lng index c496f0445f85b55d64fdd35068065f30ac5cb8d7..cfd6e864c69e38c1d528ba1b7f2f1f9df49bef63 100644 --- a/interface/web/dns/lib/lang/en_rr_list.lng +++ b/interface/web/dns/lib/lang/en_rr_list.lng @@ -1,14 +1,15 @@ <?php -$wb["list_head_txt"] = 'rr'; -$wb["name_txt"] = 'name'; -$wb["type_txt"] = 'type'; -$wb["data_txt"] = 'data'; -$wb["aux_txt"] = 'aux'; -$wb["ttl_txt"] = 'ttl'; +$wb["list_head_txt"] = 'Records'; +$wb["name_txt"] = 'Name'; +$wb["type_txt"] = 'Type'; +$wb["data_txt"] = 'Data'; +$wb["aux_txt"] = 'Preference/Priority'; +$wb["ttl_txt"] = 'TTL'; $wb["page_txt"] = 'Page'; $wb["page_of_txt"] = 'of'; $wb["page_next_txt"] = 'Next'; $wb["page_back_txt"] = 'Back'; $wb["delete_txt"] = 'Delete'; $wb["filter_txt"] = 'Filter'; +$wb["add_new_record_txt"] = 'Add New Record'; ?> \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_soa.lng b/interface/web/dns/lib/lang/en_soa.lng index d543c0d5cddd0512c48d0e95572dcf8179bcdbc3..e5bb800dc90c6a6376f03d1529a2b1570f5baa14 100644 --- a/interface/web/dns/lib/lang/en_soa.lng +++ b/interface/web/dns/lib/lang/en_soa.lng @@ -1,15 +1,25 @@ <?php -$wb["origin_txt"] = 'origin'; -$wb["ns_txt"] = 'ns'; -$wb["mbox_txt"] = 'mbox'; -$wb["serial_txt"] = 'serial'; -$wb["refresh_txt"] = 'refresh'; -$wb["retry_txt"] = 'retry'; -$wb["expire_txt"] = 'expire'; -$wb["minimum_txt"] = 'minimum'; -$wb["ttl_txt"] = 'ttl'; -$wb["active_txt"] = 'active'; -$wb["xfer_txt"] = 'xfer'; +$wb["origin_txt"] = 'Origin'; +$wb["ns_txt"] = 'Name Server'; +$wb["mbox_txt"] = 'Admin Email'; +$wb["serial_txt"] = 'Serial No.'; +$wb["refresh_txt"] = 'Refresh'; +$wb["retry_txt"] = 'Retry'; +$wb["expire_txt"] = 'Expire'; +$wb["minimum_txt"] = 'Minimum TTL'; +$wb["ttl_txt"] = 'TTL'; +$wb["active_txt"] = 'Active'; +$wb["xfer_txt"] = 'Zone Transfers'; $wb["btn_save_txt"] = 'Save'; $wb["btn_cancel_txt"] = 'Cancel'; +$wb["soa_error_empty"] = 'The origin must not be empty!'; +$wb["soa_error_unique"] = 'This origin does already exist! The origin must be unique!'; +$wb["ns_error_empty"] = 'The name server must not be empty!'; +$wb["mbox_error_empty"] = 'The admin email address must not be empty!'; +$wb["serial_error_notpositive"] = 'The serial no. must be positive!'; +$wb["refresh_error_notpositive"] = 'The refresh must be positive!'; +$wb["retry_error_notpositive"] = 'The retry must be positive!'; +$wb["expire_error_notpositive"] = 'The expire must be positive!'; +$wb["minimum_error_notpositive"] = 'The minimum TTL must be positive!'; +$wb["ttl_error_notpositive"] = 'The TTL must be positive!'; ?> \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_soa_list.lng b/interface/web/dns/lib/lang/en_soa_list.lng index 6d77a784e54eed509c02119d4c5144b720df0e53..febb2649e40e49905f369a915f660b87a732e2eb 100644 --- a/interface/web/dns/lib/lang/en_soa_list.lng +++ b/interface/web/dns/lib/lang/en_soa_list.lng @@ -1,20 +1,23 @@ <?php -$wb["list_head_txt"] = 'soa'; -$wb["origin_txt"] = 'origin'; -$wb["ns_txt"] = 'ns'; -$wb["mbox_txt"] = 'mbox'; -$wb["serial_txt"] = 'serial'; -$wb["refresh_txt"] = 'refresh'; -$wb["retry_txt"] = 'retry'; -$wb["expire_txt"] = 'expire'; -$wb["minimum_txt"] = 'minimum'; -$wb["ttl_txt"] = 'ttl'; -$wb["active_txt"] = 'active'; -$wb["xfer_txt"] = 'xfer'; +$wb["list_head_txt"] = 'Zones (SOA)'; +$wb["origin_txt"] = 'Origin'; +$wb["ns_txt"] = 'Name Server'; +$wb["mbox_txt"] = 'Admin Email'; +$wb["serial_txt"] = 'Serial No.'; +$wb["refresh_txt"] = 'Refresh'; +$wb["retry_txt"] = 'Retry'; +$wb["expire_txt"] = 'Expire'; +$wb["minimum_txt"] = 'Minimum TTL'; +$wb["ttl_txt"] = 'TTL'; +$wb["active_txt"] = 'Active'; +$wb["xfer_txt"] = 'Zone Transfer'; $wb["page_txt"] = 'Page'; $wb["page_of_txt"] = 'of'; $wb["page_next_txt"] = 'Next'; $wb["page_back_txt"] = 'Back'; $wb["delete_txt"] = 'Delete'; $wb["filter_txt"] = 'Filter'; +$wb["Y"] = 'Yes'; +$wb["N"] = 'No'; +$wb["add_new_record_txt"] = 'Add New Zone'; ?> \ No newline at end of file diff --git a/interface/web/dns/list/soa.list.php b/interface/web/dns/list/soa.list.php index 3c6c46c9ee2814d42c646b0bbfd226765e4e81ca..9755c1ed5e9550d115cc774186edc5ff69705c2b 100644 --- a/interface/web/dns/list/soa.list.php +++ b/interface/web/dns/list/soa.list.php @@ -65,6 +65,7 @@ $liste["item"][] = array( 'field' => "ns", 'width' => "", 'value' => ""); +/* $liste["item"][] = array( 'field' => "mbox", 'datatype' => "VARCHAR", 'formtype' => "TEXT", @@ -118,6 +119,7 @@ $liste["item"][] = array( 'field' => "minimum", 'suffix' => "", 'width' => "", 'value' => ""); +*/ $liste["item"][] = array( 'field' => "ttl", 'datatype' => "INTEGER", @@ -137,6 +139,7 @@ $liste["item"][] = array( 'field' => "active", 'width' => "", 'value' => ""); +/* $liste["item"][] = array( 'field' => "xfer", 'datatype' => "VARCHAR", 'formtype' => "TEXT", @@ -145,6 +148,6 @@ $liste["item"][] = array( 'field' => "xfer", 'suffix' => "%", 'width' => "", 'value' => ""); - +*/ ?> \ No newline at end of file diff --git a/interface/web/dns/templates/soa_edit.htm b/interface/web/dns/templates/soa_edit.htm index bd24e73ffab31e13fdd3b3ad4cd6f95a9e3a2417..adc0cc9c44c130dc09fc95a0b4d81c685569f0b0 100644 --- a/interface/web/dns/templates/soa_edit.htm +++ b/interface/web/dns/templates/soa_edit.htm @@ -36,7 +36,7 @@ <td width="366" class="frmText11"><input name="ttl" type="text" class="text" value="{tmpl_var name='ttl'}" size="30" maxlength="255"></td> </tr> <tr> - <td width="126" class="frmText11">{tmpl_var name='active_txt'}:</td> + <td width="126" class="frmText11" valign="top">{tmpl_var name='active_txt'}:</td> <td width="366" class="frmText11">{tmpl_var name='active'}</td> </tr> <tr> diff --git a/interface/web/dns/templates/soa_list.htm b/interface/web/dns/templates/soa_list.htm index 42c3faa3a1cbb8d61985c3bf7f94184eb3610ec0..30404b125655aca8dc0e7b01143cc4c05fb9e1b7 100644 --- a/interface/web/dns/templates/soa_list.htm +++ b/interface/web/dns/templates/soa_list.htm @@ -5,50 +5,62 @@ <tr> <td class="tblHead"><tmpl_var name="origin_txt"></td> <td class="tblHead"><tmpl_var name="ns_txt"></td> + <!-- <td class="tblHead"><tmpl_var name="mbox_txt"></td> <td class="tblHead"><tmpl_var name="serial_txt"></td> <td class="tblHead"><tmpl_var name="refresh_txt"></td> <td class="tblHead"><tmpl_var name="retry_txt"></td> <td class="tblHead"><tmpl_var name="expire_txt"></td> <td class="tblHead"><tmpl_var name="minimum_txt"></td> + //--> <td class="tblHead"><tmpl_var name="ttl_txt"></td> <td class="tblHead"><tmpl_var name="active_txt"></td> + <!-- <td class="tblHead"><tmpl_var name="xfer_txt"></td> + //--> <td class="tblHead"> </td> </tr> <tr> <td class="frmText11"><input type="text" name="search_origin" value="{tmpl_var name='search_origin'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_ns" value="{tmpl_var name='search_ns'}" class="text" /></td> + <!-- <td class="frmText11"><input type="text" name="search_mbox" value="{tmpl_var name='search_mbox'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_serial" value="{tmpl_var name='search_serial'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_refresh" value="{tmpl_var name='search_refresh'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_retry" value="{tmpl_var name='search_retry'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_expire" value="{tmpl_var name='search_expire'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_minimum" value="{tmpl_var name='search_minimum'}" class="text" /></td> + //--> <td class="frmText11"><input type="text" name="search_ttl" value="{tmpl_var name='search_ttl'}" class="text" /></td> <td class="frmText11"><input type="text" name="search_active" value="{tmpl_var name='search_active'}" class="text" /></td> + <!-- <td class="frmText11"><input type="text" name="search_xfer" value="{tmpl_var name='search_xfer'}" class="text" /></td> + //--> <td class="frmText11" align="right"><input name="Filter" type="submit" id="Filter" value="{tmpl_var name="filter_txt"}"></td> </tr> <tmpl_loop name="records"> <tr bgcolor="{tmpl_var name="bgcolor"}"> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="origin"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="ns"}</a></td> + <!-- <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="mbox"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="serial"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="refresh"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="retry"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="expire"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="minimum"}</a></td> + //--> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="ttl"}</a></td> <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="active"}</a></td> + <!-- <td class="frmText11"><a href="soa_edit.php?id={tmpl_var name='id'}" class="frmText11">{tmpl_var name="xfer"}</a></td> + //--> <td class="frmText11" align="right">[<a href="javascript: del_record('soa_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}');" class="frmText11">{tmpl_var name='delete_txt'}</a>]</td> </tr> </tmpl_loop> <tr> - <td colspan="12" height="40" align="center" class="tblFooter"><tmpl_var name="paging"></td> + <td colspan="5" height="40" align="center" class="tblFooter"><tmpl_var name="paging"></td> </tr> </table> </form> \ No newline at end of file