public static function factory($form_definitions_file, $initial_values = '') { // system based if (strpos($form_definitions_file, 'system::') !== FALSE) { $form_definitions_file = PATH_SYSTEM . '/forms/' . str_replace('system::', '', $form_definitions_file); } else { $form_definitions_file = PATH_APP . '/forms/' . $form_definitions_file; } Form::$skeleton = array(); Form::$rules = array(); Form::$hookup = array(); Form::$release = array(); Form::$conf = Read::file($form_definitions_file . '_form.php', $initial_values); // cross site request forgery Form::csrf(); // run through fields foreach (Form::$conf['fields'] as $field_id => $field_setup) { // global mark setting if (Form::$conf['config']['mark'] !== TRUE) { $field_setup['mark'] = FALSE; } if (empty($field_setup['group'])) { // set default group $field_setup['group'] = 'default'; } // set field label $form['labels'][$field_id] = $field_setup['label']; // handle read only fields if ($field_setup['metas']['readonly'] === TRUE) { $field_setup['attr']['disabled'] = 'disabled'; $field_setup['attr']['class'] = 'readonly ' . $field_setup['attr']['class']; $field_setup['rules'] = array(); } // set defined and posted value ... and clean da shizzle $field_setup['defined_value'] = $field_setup['value']; $field_setup['value'] = Form::get_value($field_id, $field_setup); // handle hookups (turn optional fields into required) if (!empty($field_setup['metas']['hookup'])) { foreach ($field_setup['metas']['hookup'] as $hu_val => $hu_fields) { if ($field_setup['value'] == $hu_val) { foreach ($hu_fields as $hu_field_id) { Form::$hookup[] = $hu_field_id; } } Session::cache('jsinline', 'system.form.hookup("' . $field_id . '", "' . $hu_val . '", ["' . Format::array_join($hu_fields, '","') . '"])'); } } if (in_array($field_id, Form::$hookup)) { $field_setup['rules'] = array('required'); } // handle releases (turn required fields into optional) if (!empty($field_setup['metas']['release'])) { foreach ($field_setup['metas']['release'] as $rl_val => $rl_fields) { if ($field_setup['value'] == $rl_val) { foreach ($rl_fields as $rl_field_id) { Form::$release[] = $rl_field_id; } } Session::cache('jsinline', 'system.form.release("' . $field_id . '", "' . $rl_val . '", ["' . Format::array_join($rl_fields, '","') . '"])'); } } if (in_array($field_id, Form::$release)) { $field_setup['rules'] = array(); } // if no rules array, set it as an array if (empty($field_setup['rules'])) { $field_setup['rules'] = array(); } // create html field widget $widget = Form::$field_setup['type']($field_id, $field_setup); // cache field type & value Form::$skeleton['types'][$field_id] = $field_setup['type']; Form::$skeleton['values'][$field_id] = $field_setup['value']; // cache field rules Form::rules($field_id, $field_setup['rules']); Form::$skeleton['rules'] = Form::$rules; $is_single_buttonset = FALSE; // no label for single checkbox/radio fields if (in_array($field_setup['type'], array('radio', 'checkbox')) && empty($field_setup['options'])) { $is_single_buttonset = $field_setup['metas']['buttonset'] ? TRUE : FALSE; } // set labels Form::$skeleton['labels'][$field_id] = $field_setup['label']; if (!isset($field_setup['metas']['label'])) { $field_setup['metas']['label'] = TRUE; } // handle label if ($field_setup['metas']['label'] === TRUE && !$is_single_buttonset && !($field_setup['type'] == 'upload' || $field_setup['type'] == 'hidden' || $field_setup['type'] == 'date' && ($field_setup['metas']['range'] === TRUE || $field_setup['metas']['time']))) { $label = Form::label($field_id, $field_setup['label'] . ':' . Form::field_mark($field_id, $field_setup)); } else { $label = NULL; } // set form view Form::$skeleton['view'][$field_id] = array('label' => $label, 'widget' => $widget, 'note' => '<div class="form_field_note">' . $field_setup['note'] . '</div>'); // group input results if (Form::is_submitted()) { $multi = Format::string_explode(str_replace(']', '', $field_id), '['); $data = array('old' => Format::string_clean($field_setup['defined_value']), 'set' => Format::string_clean($field_setup['value'])); // if multidimensional if (count($multi) > 1) { if (count($multi) == 1) { Form::$skeleton['data'][$field_setup['group']][$multi[0]] = $data; } if (count($multi) == 2) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]] = $data; } if (count($multi) == 3) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]] = $data; } if (count($multi) == 4) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]] = $data; } if (count($multi) == 5) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]] = $data; } if (count($multi) == 6) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]][$multi[5]] = $data; } if (count($multi) == 7) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]][$multi[5]][$multi[6]] = $data; } if (count($multi) == 8) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]][$multi[5]][$multi[6]][$multi[7]] = $data; } if (count($multi) == 9) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]][$multi[5]][$multi[6]][$multi[7]][$multi[8]] = $data; } if (count($multi) == 10) { Form::$skeleton['data'][$field_setup['group']][$multi[0]][$multi[1]][$multi[2]][$multi[3]][$multi[4]][$multi[5]][$multi[6]][$multi[7]][$multi[8]][$multi[9]] = $data; } } else { Form::$skeleton['data'][$field_setup['group']][$field_id] = $data; } } // helper: set most used view structure Form::$skeleton['group'][$field_id] = (!empty($field_setup['note']) ? Form::$skeleton['view'][$field_id]['note'] : NULL) . (!empty(Form::$skeleton['view'][$field_id]['label']) ? Form::$skeleton['view'][$field_id]['label'] . '<br>' : NULL) . '<error></error>' . Form::$skeleton['view'][$field_id]['widget']; } // if we have rules validate the form as soon its submitted if (Form::is_submitted() && !empty(Form::$rules)) { $input = Validation::factory(Form::$skeleton); Form::$skeleton['valid'] = $input->valid(); if (!Form::$skeleton['valid']) { Form::$skeleton['validation_failed'] = '<a name="form"></a><div class="form_validation_failed">' . (empty(Form::$conf['config']['error']) ? Lang::get('system::form_validation_failed') : Form::$conf['config']['error']) . '</div>'; foreach ($input->error_messages as $field_id => $error) { if (empty(Form::$skeleton['view'][$field_id]['label'])) { $error = '<br>' . $error; } Form::$skeleton['group'][$field_id] = str_replace('<error></error>', $error, Form::$skeleton['group'][$field_id]); Form::$skeleton['error'][$field_id] = $error; } } } // at last create basic fields Form::$skeleton['view']['open'] = Form::open(Form::$conf['config']['submit']['url'], array('id' => Form::$conf['config']['id'], 'method' => !empty(Form::$conf['config']['method']) ? Form::$conf['config']['method'] : 'post', 'upload' => Form::$conf['config']['upload'] ? TRUE : FALSE)); Form::$skeleton['view']['submit'] = Form::submit('submit', !empty(Form::$conf['config']['submit']['label']) ? Form::$conf['config']['submit']['label'] : Lang::get('system::form_submit_string'), array('class' => 'button')) . (!empty(Form::$conf['config']['cancel']['url']) ? '<span class="form_cancel_container"><span class="form_cancel_prestring">' . Lang::get('system::form_cancel_prestring') . '</span>' . Html::anchor(Form::$conf['config']['cancel']['url'], !empty(Form::$conf['config']['cancel']['label']) ? Form::$conf['config']['cancel']['label'] : Lang::get('system::form_cancel_string'), array('class' => 'form_cancel')) . '</span>' : NULL); // secure post form $secure_me = NULL; if (Form::$conf['config']['method'] != 'get') { $secure_me = Form::hidden('csrf', array('value' => session_id())) . Form::hidden('fuid', array('value' => empty($_POST['fuid']) ? Security::create_uid() : $_POST['fuid'])); } Form::$skeleton['view']['close'] = $secure_me . Form::close(); return (object) Form::$skeleton; }