Пример #1
0
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;
 }