function ninja_forms_calc_field_loop($field_id, $calc_eq = '', $result = '') { global $ninja_forms_loading, $ninja_forms_processing; if (isset($ninja_forms_loading)) { $field_settings = $ninja_forms_loading->get_field_settings($field_id); } else { $field_settings = $ninja_forms_processing->get_field_settings($field_id); } $calc_data = $field_settings['data']; // Figure out which method we are using to calculate this field. if (isset($calc_data['calc_method'])) { $calc_method = $calc_data['calc_method']; } else { $calc_method = 'auto'; } // Get our advanced field op settings if they exist. if (isset($calc_data['calc'])) { $calc_fields = $calc_data['calc']; } else { $calc_fields = array(); } // Get our calculation equation if it exists. if (isset($calc_data['calc_eq'])) { $calc_eq = $calc_data['calc_eq']; } else { $calc_eq = array(); } if (isset($ninja_forms_loading)) { $form_id = $ninja_forms_loading->get_form_ID(); $all_fields = $ninja_forms_loading->get_all_fields(); } else { $form_id = $ninja_forms_processing->get_form_ID(); $all_fields = $ninja_forms_processing->get_all_fields(); } // Figure out if there is a sub_total and a tax field. If there are, and this is a total field set to calc_method auto, we're using an equation, not auto. $tax = false; $sub_total = false; foreach ($all_fields as $f_id => $user_value) { if (isset($ninja_forms_loading)) { $field = $ninja_forms_loading->get_field_settings($f_id); } else { $field = $ninja_forms_processing->get_field_settings($f_id); } $field_value = $user_value; $data = $field['data']; if ($field['type'] == '_tax') { // There is a tax field; save its field_id. $tax = $field['id']; } else { if (isset($data['payment_sub_total']) and $data['payment_sub_total'] == 1) { // There is a sub_total field; save its field_id. $sub_total = $field['id']; } } } // If the tax and sub_total have been found, and this is a total field set to auto, change the calc_method and calc_eq. if ($tax and $sub_total and isset($calc_data['payment_total']) and $calc_data['payment_total'] == 1 and $calc_method == 'auto') { $calc_method = 'eq'; if (isset($ninja_forms_loading)) { $tax_rate = $ninja_forms_loading->get_field_value($tax); } else { $tax_rate = $ninja_forms_processing->get_field_value($tax); } if (strpos($tax_rate, "%") !== false) { $tax_rate = str_replace("%", "", $tax_rate); $tax_rate = $tax_rate / 100; } $calc_eq = 'field_' . $sub_total . ' + ( field_' . $sub_total . ' * ' . $tax_rate . ' )'; } // Figure out how many calculation fields we have and run foreach ($all_fields as $f_id => $user_value) { if (isset($ninja_forms_loading)) { $field = $ninja_forms_loading->get_field_settings($f_id); $field_value = $ninja_forms_loading->get_field_value($f_id); } else { $field = $ninja_forms_processing->get_field_settings($f_id); $field_value = $ninja_forms_processing->get_field_value($f_id); } $field_data = $field['data']; if ($f_id != $field_id) { switch ($calc_method) { case 'auto': // We are automatically totalling the fields that have a calc_auto_include set to 1. if (isset($field_data['calc_auto_include']) and $field_data['calc_auto_include'] == 1) { if ($field['type'] == '_calc') { $calc_value = ninja_forms_calc_field_loop($field['id'], '', $result); } else { $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); } if ($calc_value !== false) { $result = ninja_forms_calc_evaluate('add', $result, $calc_value); } } break; case 'fields': // We are performing a specific set of operations on a set of fields. if (is_array($calc_fields)) { foreach ($calc_fields as $c) { if ($c['field'] == $field['id']) { if ($field['type'] == '_calc') { $result = ninja_forms_calc_field_loop($field['id'], '', $result); } else { $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); if ($calc_value !== false) { $result = ninja_forms_calc_evaluate($c['op'], $result, $calc_value); } } } } } break; case 'eq': if (preg_match("/\\bfield_" . $field['id'] . "\\b/i", $calc_eq)) { if ($field['type'] == '_calc') { $calc_value = ninja_forms_calc_field_loop($field['id'], $calc_eq, $result); } else { $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); } if ($calc_value !== false) { $calc_eq = preg_replace('/\\bfield_' . $field['id'] . '\\b/', $calc_value, $calc_eq); } } break; } } } if ($calc_method == 'eq') { $eq = new eqEOS(); $result = $eq->solveIF($calc_eq); } if ($result == '') { $result = 0; } return $result; }
/** * Function that returns an array of field IDs and calc_values that contributed to the given calc id. * * @since 2.2.30 * @returns array $calc_array */ function get_calc_fields($calc_id = '') { if ($calc_id == '' or !isset($this->data['field_data'])) { return false; } // Get our calculation settings. $field_settings = $this->get_field_settings($calc_id); $calc_method = $field_settings['data']['calc_method']; if (isset($field_settings['data']['calc_eq'])) { $calc_eq = $field_settings['data']['calc_eq']; } else { $calc_eq = ''; } if (isset($field_settings['data']['calc'])) { $calc_fields = $field_settings['data']['calc']; } else { $calc_fields = ''; } $tmp_array = array(); // Loop through the fields foreach ($this->data['fields'] as $field_id => $user_value) { $field = $this->data['field_data'][$field_id]; $field_value = $this->get_field_value($field['id']); // We don't want our field to be added if it's a tax field. if ($field['type'] != '_tax') { switch ($calc_method) { case 'auto': // If this field's calc_auto_include is set to 1, then add this field's ID to the list. if (isset($field['data']['calc_auto_include']) and $field['data']['calc_auto_include'] == 1) { if ($field['type'] != '_calc') { $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); if ($calc_value) { $tmp_array[] = array($field['id'] => $calc_value); } } else { if ($this->get_field_value($field['id'])) { $tmp_array[] = array($field['id'] => $this->get_field_value($field['id'])); } // If this is a calc field, then call this same function so that we can get all the fields that contributed to that. $tmp_array[] = $this->get_calc_fields($field['id']); } } break; case 'fields': // If this field is in our list of field operations, add this field's ID to our list. if ($calc_fields != '') { foreach ($calc_fields as $calc) { if ($field['id'] == $calc['field']) { if ($field['type'] != '_calc') { //echo "FIELD ID: ".$field['id']; $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); if ($calc_value) { $tmp_array[] = array($field['id'] => $calc_value); } } else { if ($this->get_field_value($field['id'])) { $tmp_array[] = array($field['id'] => $this->get_field_value($field['id'])); } // If this is a calc field, then call this same function so that we can get all the fields that contributed to that. $tmp_array[] = $this->get_calc_fields($field['id']); } } } } break; case 'eq': // If this field exists in our equation, then add this field's ID to our list. if ($calc_eq != '') { if (preg_match("/\\bfield_" . $field['id'] . "\\b/i", $calc_eq)) { if ($field['type'] != '_calc') { $calc_value = ninja_forms_field_calc_value($field['id'], $field_value, $calc_method); if ($calc_value) { $tmp_array[] = array($field['id'] => $calc_value); } } else { if ($this->get_field_value($field['id'])) { $tmp_array[] = array($field['id'] => $this->get_field_value($field['id'])); } // If this is a calc field, then call this same function so that we can get all the fields that contributed to that. $tmp_array[] = $this->get_calc_fields($field['id']); } } } break; } } } // Loop through our array and make sure that it's not multi-dimensional. $calc_array = array(); foreach ($tmp_array as $key => $field) { foreach ($field as $field_id => $value) { if (count($value) <= 1) { $calc_array[$field_id] = $value; } else { foreach ($value as $f_id => $v) { $calc_array[$f_id] = $v; } } } } return $calc_array; }