Just experimenting, inspired by rubyonrails.
class gemilang_standardform_auto extends gemilang_standardform { var $_my_elements = array(); var $_my_tablename; function setup_auto_init_elements() { $db = &$GLOBALS['db']; $rs = $db->Execute("select * from $this->_my_tablename limit 1"); while (!$rs->EOF) { $fld = array(); while ($count < $rs->_numOfFields) { $fld[] = $rs->FetchField($count); $count++; } $rs->MoveNext(); } $this->my_elements = array(); foreach ($fld as $field) { $attr = array(); $attr['name'] = $field->name; $attr['type'] = $field->type; $attr['length'] = $field->max_length; if (!isset($this->_my_elements[$field->name]['control'])) { $attr['control'] = 'text'; } else { $attr['control'] = $this->_my_elements[$field->name]['control']; } if (!isset($this->_my_elements[$field->name]['data'])) { $attr['data'] = array(); } else { $attr['data'] = $this->_my_elements[$field->name]['data']; } $this->_my_elements[$field->name] = $attr; } } function auto_init_elements() { foreach ($this->_my_elements as $element) { switch($element['control']) { case 'listbox': $this->add_element(new FEListBox($element['name'], False, Null, Null, $element['data'])); if (!isset($this->description[$element['name']])) { $this->description[$element['name']] = $element['name']; } break; default: $this->add_element(new FEText($element['name'], False, $element['length'])); if (!isset($this->description[$element['name']])) { $this->description[$element['name']] = $element['name']; } } } } function set_description($element_name, $description) { $this->description[$element_name] = $description; } function set_control($element_name, $control, $data = Null) { $this->_my_elements[$element_name]['control'] = $control; if (is_array($data)) { $this->_my_elements[$element_name]['data'] = $data; } }