Esempio n. 1
0
/**
 * Setup processors on the connected form
 *
 * @since 0.2.0
 *
 * @uses "caldera_forms_submit_get_form"
 *
 * @param array $form The form configuration
 *
 * @return array|null
 */
function cf_form_connector_setup_processors($form)
{
    if (empty($form['is_connected_form'])) {
        return $form;
    }
    // fetch the connected stage form
    $base_form = Caldera_Forms_Forms::get_form(cf_form_connector_get_base_form($form));
    if (!empty($_POST['cffld_stage'])) {
        $current_form = Caldera_Forms_Sanitize::sanitize($_POST['cffld_stage']);
        // check this is part of the flow
        if (false === cf_form_connector_verify_id($form, $current_form)) {
            // erp.. hmm set the base
            $current_form = $base_form['ID'];
        }
    } else {
        $current_form = $base_form['ID'];
    }
    $stage = $form;
    // set the primary ( staging form )
    // get the process record
    $process_record = cf_form_connector_get_current_position();
    // get this form to be run
    $form = Caldera_Forms_Forms::get_form($current_form);
    // check to see if its a back track
    if (!empty($_POST['cffld_backnav']) && !empty($process_record[$stage['ID']])) {
        if ($current_form === $process_record[$stage['ID']]['current_form']) {
            // prepare state jump
            $previous_form = $process_record[$stage['ID']]['previous_form'];
            // create backtrack record
            if (!empty($process_record[$stage['ID']][$previous_form]['back'])) {
                $previous_back_form = $process_record[$stage['ID']][$previous_form]['back'];
                $process_record[$stage['ID']]['previous_form'] = $previous_back_form;
            } else {
                unset($process_record[$stage['ID']]['previous_form']);
            }
            $process_record[$stage['ID']]['current_form'] = $previous_form;
            // capture this without saving on a back as not to do processing
            if (!empty($form['fields'])) {
                if (empty($process_record[$stage['ID']][$current_form])) {
                    $process_record[$stage['ID']][$current_form] = array();
                }
                foreach ($form['fields'] as $field_id => $field) {
                    if (!empty($_POST[$field_id])) {
                        $process_record[$stage['ID']][$current_form]['pre_data'][$field_id] = $_POST[$field_id];
                    }
                }
            }
            cf_form_connector_set_current_position($process_record);
            // check for ajax
            if (!empty($stage['form_ajax'])) {
                wp_send_json(array('target' => $stage['ID'] . '_' . (int) $_POST['_cf_frm_ct'], 'form' => Caldera_Forms::render_form($stage)));
            }
        }
    }
    $form['stage_form'] = $stage['ID'];
    if (empty($process_record[$stage['ID']])) {
        // first form - make the ID if not an edit;
        if (empty($_POST['_cf_frm_edt'])) {
            global $wpdb;
            // CREATE ENTRY
            $new_entry = array('form_id' => $stage['ID'], 'user_id' => 0, 'datestamp' => date_i18n('Y-m-d H:i:s', time(), 0), 'status' => 'pending');
            // if user logged in
            if (is_user_logged_in()) {
                $new_entry['user_id'] = get_current_user_id();
            }
            $wpdb->insert($wpdb->prefix . 'cf_form_entries', $new_entry);
            $entryid = $wpdb->insert_id;
            $process_record = array();
            $process_record[$stage['ID']] = array('entry_id' => $entryid, 'fields' => array(), 'field_values' => array(), 'completed' => false, 'current_form' => $form['ID']);
            cf_form_connector_set_current_position($process_record);
        }
    }
    // disable mailer
    $form['mailer']['enable_mailer'] = false;
    $form['mailer']['on_insert'] = false;
    // setup each connection condition
    $final_form_fields = array();
    foreach ($stage['condition_points']['conditions'] as $condition_point => $condition) {
        // ye, lets only use the conditions for this form
        if ($condition['form'] != $form['ID']) {
            continue;
        }
        // check its there
        if (empty($stage['node'][$condition['connect']])) {
            continue;
        }
        // create a processor IF
        $processor_id = 'cfp_' . $stage['ID'] . '_' . $condition_point;
        $hasBack = false;
        if (!empty($condition['back'])) {
            $hasBack = true;
        }
        $form['processors'][$processor_id] = array('ID' => $processor_id, 'type' => 'form-connector', 'config' => array('next_form_id' => $stage['node'][$condition['connect']]['form'], 'back_button' => $hasBack), 'runtimes' => array('insert' => true), 'conditions' => array());
        if (!empty($condition['group'])) {
            $form['processors'][$processor_id]['conditions'] = array('type' => 'use', 'group' => $condition['group']);
        }
        $has_condition_points = true;
    }
    if (empty($has_condition_points) && $process_record[$stage['ID']]['current_form'] == $stage['ID']) {
        // last in process!
        $form = $stage;
        $form['stage_form'] = $stage['ID'];
        // setup field values
        global $processed_data;
        $processed_data[$stage['ID']] = $process_record[$stage['ID']]['field_values'];
        $form['fields'] = $process_record[$stage['ID']]['fields'];
        unset($process_record[$stage['ID']]['fields']);
        unset($process_record[$stage['ID']]['field_values']);
        unset($process_record[$stage['ID']]['completed']);
        unset($process_record[$stage['ID']]['current_form']);
        unset($process_record[$stage['ID']]['previous_form']);
        unset($process_record[$stage['ID']]['entry_id']);
        foreach ($process_record[$stage['ID']] as $form_id => $data) {
            Caldera_Forms::set_submission_meta('form', array($form_id => $data['id']), $form, '_connected_form');
        }
        $process_record[$form['stage_form']] = array();
        cf_form_connector_set_current_position($process_record);
    }
    return $form;
}