Example #1
0
 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;
 }