| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- <?php if ( ! defined( 'ABSPATH' ) ) exit;
- /**
- * Function to register a new field for calculations
- *
- * @since 2.2.28
- * @return void
- */
- function ninja_forms_register_field_calc() {
- $args = array(
- 'name' => __( 'Calculation', 'ninja-forms' ),
- 'sidebar' => 'template_fields',
- 'edit_function' => 'ninja_forms_field_calc_edit',
- 'display_function' => 'ninja_forms_field_calc_display',
- 'group' => 'standard_fields',
- 'edit_conditional' => true,
- 'edit_req' => false,
- 'edit_label' => false,
- 'edit_label_pos' => false,
- 'edit_custom_class' => false,
- 'edit_help' => false,
- //'process_field' => false,
- //'pre_process' => 'ninja_forms_field_calc_strip_currency_symbol',
- 'edit_options' => array(
- array(
- 'type' => 'hidden',
- 'name' => 'payment_field_group',
- 'default' => 1,
- ),
- array(
- 'type' => 'hidden',
- 'name' => 'payment_total',
- //'label' => __( 'Total', 'ninja-forms' ),
- ),
- array(
- 'type' => 'hidden',
- 'name' => 'payment_sub_total',
- //'label' => __( 'Sub Total', 'ninja-forms' ),
- ),
- array(
- 'type' => 'text',
- 'name' => 'calc_places',
- 'label' => __( 'Number of decimal places.', 'ninja-forms' ),
- 'default' => 2,
- ),
- ),
- 'conditional' => array(
- 'value' => array(
- 'type' => 'text',
- ),
- ),
- );
- ninja_forms_register_field( '_calc', $args );
- }
- add_action( 'init', 'ninja_forms_register_field_calc' );
- /**
- * Function that filters the field LI label on the edit field back-end.
- *
- * @since 2.2.28
- * @return $li_label
- */
- function ninja_forms_calc_edit_label_filter( $li_label, $field_id ) {
- $field_row = ninja_forms_get_field_by_id( $field_id );
- if ( $field_row['type'] == '_calc' ) {
- if ( isset ( $field_row['data']['calc_name'] ) ) {
- $li_label = $field_row['data']['calc_name'];
- } else {
- $li_label = __( 'Calculation', 'ninja-forms' );
- }
- }
- return $li_label;
- }
- add_filter( 'ninja_forms_edit_field_li_label', 'ninja_forms_calc_edit_label_filter', 10, 2 );
- /**
- * Function that outputs the edit options for our calculation field
- *
- * @since 2.2.28
- * @return void
- */
- function ninja_forms_field_calc_edit( $field_id, $data ) {
- $calc_name = isset ( $data['calc_name'] ) ? $data['calc_name'] : 'calc_name';
- $default_value = isset ( $data['default_value'] ) ? $data['default_value'] : '';
- $calc_payment = isset ( $data['calc_payment'] ) ? $data['calc_payment'] : '';
- $calc_autho = isset ( $data['calc_auto'] ) ? $data['calc_auto'] : 0;
- // Output calculation display type
- $options = array(
- array( 'name' => __( '- None', 'ninja-forms' ), 'value' => 'hidden' ),
- array( 'name' => __( 'Textbox', 'ninja-forms' ), 'value' => 'text'),
- array( 'name' => __( 'HTML', 'ninja-forms' ), 'value' => 'html'),
- );
- $calc_display_type = isset ( $data['calc_display_type'] ) ? $data['calc_display_type'] : 'text';
- ninja_forms_edit_field_el_output($field_id, 'select', __( 'Output calculation as', 'ninja-forms' ), 'calc_display_type', $calc_display_type, 'wide', $options, 'widefat ninja-forms-calc-display');
- // If the calc_display_type is set to text, then we have several options to output.
- // Set the output to hidden for these options if the calc_display_type is not set to text.
- if ( $calc_display_type != 'text' ) {
- $class = 'hidden';
- } else {
- $class = '';
- }
- echo '<div id="ninja_forms_field_'.$field_id.'_calc_text_display" class="'.$class.'">';
- // Output a label input textbox.
- $label = isset ( $data['label'] ) ? stripslashes( $data['label'] ) : __( 'Calculation', 'ninja-forms' );
- ninja_forms_edit_field_el_output($field_id, 'text', __( 'Label', 'ninja-forms' ), 'label', $label, 'wide', '', 'widefat');
- // Output a label position select box.
- if ( isset ( $data['label_pos'] ) ) {
- $label_pos = $data['label_pos'];
- } else {
- $label_pos = '';
- }
- $options = array(
- array('name' => __( 'Left of Element', 'ninja-forms' ), 'value' => 'left'),
- array('name' => __( 'Above Element', 'ninja-forms' ), 'value' => 'above'),
- array('name' => __( 'Below Element', 'ninja-forms' ), 'value' => 'below'),
- array('name' => __( 'Right of Element', 'ninja-forms' ), 'value' => 'right'),
- );
- ninja_forms_edit_field_el_output($field_id, 'select', __( 'Label Position', 'ninja-forms' ), 'label_pos', $label_pos, 'wide', $options, 'widefat');
- // Output a disabled option checkbox.
- if( isset ( $data['calc_display_text_disabled'] ) ) {
- $calc_display_text_disabled = $data['calc_display_text_disabled'];
- } else {
- $calc_display_text_disabled = 1;
- }
- ninja_forms_edit_field_el_output($field_id, 'checkbox', __( 'Disable input?', 'ninja-forms' ), 'calc_display_text_disabled', $calc_display_text_disabled, 'wide', '', '');
- echo '</div>';
- // Set the output to hidden for the HTML RTE if the calc_display_type is not set to HTML.
- if ( $calc_display_type != 'html' ) {
- $class = 'hidden';
- } else {
- $class = '';
- }
- // Output our RTE. This is the only extra setting needed if the calc_display_type is set to HTML.
- if ( isset ( $data['calc_display_html'] ) ) {
- $calc_display_html = $data['calc_display_html'];
- } else {
- $calc_display_html = '[ninja_forms_calc]';
- }
- echo '<div id="ninja_forms_field_'.$field_id.'_calc_html_display" class="'.$class.'">';
- ninja_forms_edit_field_el_output($field_id, 'rte', '', 'calc_display_html', $calc_display_html, '', '', '', __( 'Use the following shortcode to insert the final calculation: [ninja_forms_calc]', 'ninja-forms' ) );
- echo '</div>';
- if ( isset ( $data['calc_method'] ) ) {
- $calc_method = $data['calc_method'];
- } else {
- $calc_method = 'auto';
- }
- switch ( $calc_method ) {
- case 'auto':
- $eq_class = 'hidden';
- $field_class = 'hidden';
- break;
- case 'fields':
- $eq_class = 'hidden';
- $field_class = '';
- break;
- case 'eq':
- $eq_class = '';
- $field_class = 'hidden';
- break;
- }
- if ( isset ( $data['calc_eq'] ) ) {
- $calc_eq = $data['calc_eq'];
- } else {
- $calc_eq = '';
- }
- if ( isset ( $data['calc'] ) AND $data['calc'] != '' ) {
- $calc = $data['calc'];
- } else {
- $calc = array();
- }
- $desc = '<p>' . sprintf( __( 'You can enter calculation equations here using field_x where x is the ID of the field you want to use. For example, %sfield_53 + field_28 + field_65%s.', 'field_ should NOT be translated.', 'ninja-forms' ), '<strong>', '</strong>' ) . '</p>';
- $desc .= '<p>' . sprintf( __( 'Complex equations can be created by adding parentheses: %s( field_45 * field_2 ) / 2%s.', 'field_ should NOT be translated.', 'ninja-forms' ), '<strong>', '</strong>' ) . '</p>';
- $desc .= '<p>' .__( 'Please use these operators: + - * /. This is an advanced feature. Watch out for things like division by 0.', 'ninja-forms' ).'</p>';
- $options = array(
- array( 'name' => __( 'Automatically Total Calculation Values', 'ninja-forms' ), 'value' => 'auto' ),
- array( 'name' => __( 'Specify Operations And Fields (Advanced)', 'ninja-forms' ), 'value' => 'fields' ),
- array( 'name' => __( 'Use An Equation (Advanced)', 'ninja-forms' ), 'value' => 'eq' ),
- );
- ninja_forms_edit_field_el_output($field_id, 'select', __( 'Calculation Method', 'ninja-forms' ), 'calc_method', $calc_method, 'wide', $options, 'widefat ninja-forms-calc-method');
- ?>
- <div class="ninja-forms-calculations <?php echo $field_class;?>">
- <div class="label">
- <?php _e( 'Field Operations', 'ninja-forms' );?> - <a href="#" name="" id="ninja_forms_field_<?php echo $field_id;?>_add_calc" class="ninja-forms-field-add-calc" rel="<?php echo $field_id;?>"><?php _e( 'Add Operation', 'ninja-forms' );?></a>
- <span class="spinner" style="float:left;"></span>
- </div>
- <input type="hidden" name="ninja_forms_field_<?php echo $field_id;?>[calc]" value="">
- <div id="ninja_forms_field_<?php echo $field_id;?>_calc" class="" name="">
- <?php
- $x = 0;
- foreach ( $calc as $c ) {
- ninja_forms_output_field_calc_row( $field_id, $c, $x );
- $x++;
- }
- ?>
- </div>
- </div>
- <div class="ninja-forms-eq <?php echo $eq_class;?>">
- <?php
- ninja_forms_edit_field_el_output($field_id, 'textarea', __( 'Advanced Equation', 'ninja-forms' ), 'calc_eq', $calc_eq, 'wide', '', 'widefat', $desc);
- ?>
- </div>
- <hr>
- <?php
- }
- function nf_field_calc_advanced_settings( $field_id, $data ) {
- $field = ninja_forms_get_field_by_id( $field_id );
- if ( '_calc' != $field['type'] )
- return false;
- $calc_name = isset ( $data['calc_name'] ) ? $data['calc_name'] : 'calc_name';
- $default_value = isset ( $data['default_value'] ) ? $data['default_value'] : '';
- $calc_payment = isset ( $data['calc_payment'] ) ? $data['calc_payment'] : '';
- $calc_autho = isset ( $data['calc_auto'] ) ? $data['calc_auto'] : 0;
- $calc_display_type = isset ( $data['calc_display_type'] ) ? $data['calc_display_type'] : 'text';
- ninja_forms_edit_field_el_output($field_id, 'text', __( 'Calculation name', 'ninja-forms' ), 'calc_name', $calc_name, 'wide', '', 'widefat ninja-forms-calc-name', __( 'This is the programmatic name of your field. Examples are: my_calc, price_total, user-total.', 'ninja-forms' ));
- ninja_forms_edit_field_el_output($field_id, 'text', __( 'Default Value', 'ninja-forms' ), 'default_value', $default_value, 'wide', '', 'widefat' );
-
- // If any option besides "none" is selected, then show our custom class and help options.
- if ( $calc_display_type == 'hidden' ) {
- $class = 'hidden';
- } else {
- $class = '';
- }
- if ( isset ( $data['class'] ) ) {
- $custom_class = $data['class'];
- } else {
- $custom_class = '';
- }
- if ( isset ( $data['show_help'] ) ) {
- $show_help = $data['show_help'];
- } else {
- $show_help = 0;
- }
- if ( isset ( $data['help_text'] ) ) {
- $help_text = $data['help_text'];
- } else {
- $help_text = '';
- }
- if( $show_help == 1 ){
- $display_span = '';
- } else {
- $display_span = 'display:none;';
- }
- echo '<div id="ninja_forms_field_'.$field_id.'_calc_extra_display" class="'.$class.'">';
- // Output our custom class textbox.
- ninja_forms_edit_field_el_output($field_id, 'text', __( 'Custom CSS Class', 'ninja-forms' ), 'class', $custom_class, 'wide', '', 'widefat');
- // Output our help text options.
- $help_desc = sprintf(__('If "help text" is enabled, there will be a question mark %s placed next to the input field. Hovering over this question mark will show the help text.', 'ninja-forms'), '<img src="'.NINJA_FORMS_URL.'images/question-ico.gif">');
- ninja_forms_edit_field_el_output($field_id, 'checkbox', __( 'Show Help Text', 'ninja-forms' ), 'show_help', $show_help, 'wide', '', 'ninja-forms-show-help');
- ?>
- <span id="ninja_forms_field_<?php echo $field_id;?>_help_span" style="<?php echo $display_span;?>">
- <?php
- ninja_forms_edit_field_el_output($field_id, 'textarea', __( 'Help Text', 'ninja-forms' ), 'help_text', $help_text, 'wide', '', 'widefat', $help_desc);
- ?>
- </span>
- <?php
- echo '</div>';
- }
- add_action( 'nf_edit_field_advanced', 'nf_field_calc_advanced_settings', 7, 2 );
- /**
- * Function that outputs the display for our calculation field
- *
- * @since 2.2.28
- * @return void
- */
- function ninja_forms_field_calc_display( $field_id, $data, $form_id = '' ){
- if ( isset( $data['default_value'] ) ) {
- $default_value = $data['default_value'];
- } else {
- $default_value = 0;
- }
- if ( $default_value == '' ) {
- $default_value = 0;
- }
- if ( isset ( $data['calc_display_text_disabled'] ) AND $data['calc_display_text_disabled'] == 1 ) {
- $disabled = "disabled";
- } else {
- $disabled = '';
- }
- if ( isset ( $data['calc_display_type'] ) ) {
- $calc_display_type = $data['calc_display_type'];
- } else {
- $calc_display_type = 'text';
- }
- if ( isset ( $data['calc_display_html'] ) ) {
- $calc_display_html = $data['calc_display_html'];
- } else {
- $calc_display_html = '';
- }
- if ( isset ( $data['calc_method'] ) ) {
- $calc_method = $data['calc_method'];
- } else {
- $calc_method = '';
- }
- $field_class = ninja_forms_get_field_class( $field_id, $form_id );
- ?>
- <input type="hidden" name="ninja_forms_field_<?php echo $field_id;?>" value="<?php echo $default_value;?>" class="<?php echo $field_class;?>">
- <?php
- switch ( $calc_display_type ) {
- case 'text':
- ?>
- <input type="text" id="ninja_forms_field_<?php echo $field_id;?>" name="ninja_forms_field_<?php echo $field_id;?>" value="<?php echo $default_value;?>" <?php echo $disabled;?> class="<?php echo $field_class;?>" rel="<?php echo $field_id;?>">
- <?php
- break;
- case 'html':
- $calc_display_html = str_replace( '[ninja_forms_calc]', '<span id="ninja_forms_field_'.$field_id.'" class="'.$field_class.'" rel="'.$field_id.'">'.$default_value.'</span>', $calc_display_html );
- echo $calc_display_html;
- break;
- }
- }
- /**
- * Function to output specific calculation options for a given field
- *
- * @param int $field_id - ID of the field being edited.
- * @param array $c - Array containing the data.
- * @param int $x - Index for this row of the calc array.
- * @since 2.2.28
- * @returns void
- */
- function ninja_forms_output_field_calc_row( $field_id, $c = array(), $x = 0 ){
- global $ninja_forms_fields;
- $field_row = ninja_forms_get_field_by_id( $field_id );
- $field_type = $field_row['type'];
- $form_id = $field_row['form_id'];
- if ( isset ( $c['field'] ) ) {
- $calc_field = $c['field'];
- } else {
- $calc_field = '';
- }
- if ( isset ( $c['op'] ) ) {
- $op = $c['op'];
- } else {
- $op = '';
- }
- ?>
- <div id="ninja_forms_field_<?php echo $field_id;?>_calc_row_<?php echo $x;?>" class="ninja-forms-calc-row" rel="<?php echo $x;?>">
- <a href="#" id="ninja_forms_field_<?php echo $field_id;?>_remove_calc" name="<?php echo $x;?>" rel="<?php echo $field_id;?>" class="ninja-forms-field-remove-calc">X</a>
- <select name="ninja_forms_field_<?php echo $field_id;?>[calc][<?php echo $x;?>][op]">
- <option value="add" <?php selected( $op, 'add' );?>>+</option>
- <option value="subtract" <?php selected( $op, 'subtract' );?>>-</option>
- <option value="multiply" <?php selected( $op, 'multiply' );?>>*</option>
- <option value="divide" <?php selected( $op, 'divide' );?>>/</option>
- </select>
- <select name="ninja_forms_field_<?php echo $field_id;?>[calc][<?php echo $x;?>][field]" class="ninja-forms-calc-select">
- <option value=""><?php _e( '- Select a Field', 'ninja-forms' );?></option>
- <?php
- // Loop through our fields and output all of our calculation fields.
- $fields = ninja_forms_get_fields_by_form_id( $form_id );
- foreach ( $fields as $field ) {
- if ( isset ( $field['data']['label'] ) ) {
- $label = $field['data']['label'];
- } else {
- $label = '';
- }
- if ( strlen ( $label ) > 15 ) {
- $label = substr ( $label, 0, 15 );
- $label .= '...';
- }
- $process_field = $ninja_forms_fields[$field['type']]['process_field'];
- if ( $field['id'] != $field_id AND $process_field ) {
- ?>
- <option value="<?php echo $field['id'];?>" <?php selected( $calc_field, $field['id'] );?>><?php echo $field['id'];?> - <?php echo $label;?></option>
- <?php
- }
- }
- ?>
- </select>
- </div>
- <?php
- }
- /**
- * Function that runs during pre_processing and calcuates the value of this field.
- *
- * @since 2.2.30
- * @return void
- */
- function ninja_forms_field_calc_pre_process(){
- global $ninja_forms_loading, $ninja_forms_processing, $wp_locale;
- 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();
- }
- if ( is_array ( $all_fields ) ) {
- foreach ( $all_fields as $field_id => $user_value ) {
- if ( isset ( $ninja_forms_loading ) ) {
- $field_row = $ninja_forms_loading->get_field_settings( $field_id );
- } else {
- $field_row = $ninja_forms_processing->get_field_settings( $field_id );
- }
- if ( isset ( $field_row['type'] ) ) {
- $field_type = $field_row['type'];
- } else {
- $field_type = '';
- }
- if ( $field_type == '_calc' ) {
- $field_data = $field_row['data'];
- if ( isset ( $field_data['default_value'] ) ){
- $default_value = $field_data['default_value'];
- } else {
- $default_value = 0;
- }
- $result = $default_value;
- // Figure out which method we are using to calculate this field.
- if ( isset ( $field_data['calc_method'] ) ) {
- $calc_method = $field_data['calc_method'];
- } else {
- $calc_method = 'auto';
- }
- // Get our advanced field op settings if they exist.
- if ( isset ( $field_data['calc'] ) ) {
- $calc_fields = $field_data['calc'];
- } else {
- $calc_fields = array();
- }
- // Get our calculation equation if it exists.
- if ( isset ( $field_data['calc_eq'] ) ) {
- $calc_eq = $field_data['calc_eq'];
- } else {
- $calc_eq = array();
- }
- // Get our calculation equation if it exists.
- if ( isset ( $field_data['calc_places'] ) ) {
- $calc_places = $field_data['calc_places'];
- } else {
- $calc_places = 0;
- }
- // 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;
- if ( is_array ( $all_fields ) ) {
- 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 );
- }
- if ( isset ( $field['type'] ) ) {
- $f_type = $field['type'];
- } else {
- $f_type = '';
- }
- $data = apply_filters( 'ninja_forms_field', $field['data'], $f_id );
- if ( $f_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 ( $field_data['payment_total'] ) AND $field_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.' )';
- 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 );
- }
- $field_settings['data']['calc_method'] = $calc_method;
- $field_settings['data']['calc_eq'] = $calc_eq;
- if ( isset ( $ninja_forms_loading ) ) {
- $ninja_forms_loading->update_field_settings( $field_id, $field_settings );
- } else {
- $ninja_forms_processing->update_field_settings( $field_id, $field_settings );
- }
- }
- // Loop through our fields and see which ones should be used for calculations.
- if ( is_array ( $all_fields ) ) {
- 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 == $tax ) {
- $tax = ninja_forms_field_calc_value( $field['id'], $field_value, 'auto' );;
- }
- 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 && $field_value ) {
- 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' ) {
- $calc_value = ninja_forms_calc_field_loop( $field['id'], '', $result );
- }
- $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_".$f_id."\b/i", $calc_eq ) ) {
- if ( $field['type'] == '_calc' ) {
- $calc_value = ninja_forms_calc_field_loop( $field['id'], $calc_eq );
- } 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();
- // Swap out decimal separator
- $decimal_point = $wp_locale->number_format['decimal_point'];
- $calc_eq = str_replace( $decimal_point, '.', $calc_eq );
- $result = $eq->solveIF($calc_eq);
- // Swap back decimal separator
- $result = str_replace( '.', $decimal_point, $result );
- }
- if ( isset ( $calc_places ) ) {
- if ( empty( $calc_places ) ) {
- $calc_places = 0;
- }
- // Swap out decimal separator
- $decimal_point = $wp_locale->number_format['decimal_point'];
- $result = str_replace( $decimal_point, '.', $result );
- // Round and Format
- $result = number_format( round( $result, $calc_places ), $calc_places );
- // Swap back decimal separator
- $result = str_replace( '.', $decimal_point, $result );
- }
- $result = str_replace( $wp_locale->number_format['thousands_sep'], '', $result );
- if ( isset ( $ninja_forms_loading ) ) {
- $ninja_forms_loading->update_field_value( $field_id, $result );
- } else {
- $ninja_forms_processing->update_field_value( $field_id, $result );
- }
- }
- }
- }
- }
- add_action( 'ninja_forms_pre_process', 'ninja_forms_field_calc_pre_process', 999 );
- function ninja_forms_calc_check_load() {
- global $ninja_forms_processing;
- if ( ! is_object ( $ninja_forms_processing ) ) {
- ninja_forms_field_calc_pre_process();
- }
- }
- add_action( 'ninja_forms_display_pre_init', 'ninja_forms_calc_check_load', 999 );
- 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 filters the list options span and adds the appropriate listener class if there is a calc needed for the field.
- *
- * @since 2.2.28
- * @return $class
- */
- function ninja_forms_calc_filter_list_options_span( $class, $field_id ) {
- global $ninja_forms_loading, $ninja_forms_processing;
- if ( isset ( $ninja_forms_loading ) ) {
- $field_row = $ninja_forms_loading->get_field_settings( $field_id );
- } else {
- $field_row = $ninja_forms_processing->get_field_settings( $field_id );
- }
- $add_class = false;
- // Check to see if this field has cal_auto_include set to 1. If it does, we want to output a class name.
- if ( isset ( $field_row['data']['calc_auto_include'] ) AND !empty ( $field_row['data']['calc_auto_include'] ) ) {
- $add_class = true;
- }
- if ( isset ( $ninja_forms_loading ) ) {
- $all_fields = $ninja_forms_loading->get_all_fields();
- } else {
- $all_fields = $ninja_forms_processing->get_all_fields();
- }
- 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 );
- }
- if ( isset ( $field['type'] ) && $field['type'] == '_calc' ) {
- if ( isset ( $field['data']['calc_method'] ) ) {
- $calc_method = $field['data']['calc_method'];
- } else {
- $calc_method = 'auto';
- }
- switch ( $calc_method ) {
- case 'fields':
- if ( isset ( $field['data']['calc'] ) ) {
- foreach ( $field['data']['calc'] as $calc ) {
- if ( $calc['field'] == $field_id ) {
- $add_class = true;
- break;
- }
- }
- }
- break;
- case 'eq':
- $eq = $field['data']['calc_eq'];
- if (preg_match("/\bfield_".$field_id."\b/i", $eq ) ) {
- $add_class = true;
- break;
- }
- break;
- }
- }
- }
- if ( $add_class ) {
- $class .= ' ninja-forms-field-list-options-span-calc-listen';
- }
- return $class;
- }
- add_filter( 'ninja_forms_display_list_options_span_class', 'ninja_forms_calc_filter_list_options_span', 10, 2 );
- /**
- * Function that takes two variables and our calculation string operator and returns the result.
- *
- * @since 2.2.28
- * @return int value
- */
- function ninja_forms_calc_evaluate( $op, $value1, $value2 ) {
- switch ( $op ) {
- case 'add':
- return $value1 + $value2;
- break;
- case 'subtract':
- return $value1 - $value2;
- break;
- case 'multiply':
- return $value1 * $value2;
- break;
- case 'divide':
- return $value1 / $value2;
- break;
- }
- }
- /**
- * Function that returns the calculation value of a field given by field_id if it is to be included in the auto total.
- *
- * @since 2.2.30
- * @return calc_value
- */
- function ninja_forms_field_calc_value( $field_id, $field_value = '', $calc_method = 'auto' ) {
- global $ninja_forms_loading, $ninja_forms_processing, $wp_locale;
- if ( isset ( $ninja_forms_loading ) ) {
- $field = $ninja_forms_loading->get_field_settings( $field_id );
- } else {
- $field = $ninja_forms_processing->get_field_settings( $field_id );
- }
- $field_data = apply_filters( 'ninja_forms_field', $field['data'], $field_id );
- if ( isset ( $field_data['default_value'] ) ) {
- $default_value = $field_data['default_value'];
- } else {
- $default_value = '';
- }
- if ( $field_value == '' ) {
- $field_value = $default_value;
- }
- $calc_value = 0;
- if ( $field['type'] == '_list' ) {
- if ( isset ( $field_data['list']['options'] ) ) {
- foreach ( $field_data['list']['options'] as $option ) {
- if ( isset ( $field_data['list_show_value'] ) AND $field_data['list_show_value'] == 1 ) {
- $option_value = $option['value'];
- } else {
- $option_value = $option['label'];
- }
- if ( $option_value == $field_value OR ( is_array ( $field_value ) AND in_array ( $option_value, $field_value ) ) ) {
- $calc_value += $option['calc'];
- }
- }
- }
- } else if ( $field['type'] == '_checkbox' ) {
- if ( $field_value == 'checked' ){
- $calc_value = $field_data['calc_value']['checked'];
- } else {
- if ( $calc_method == 'auto' ) {
- return false;
- } else {
- $calc_value = $field_data['calc_value']['unchecked'];
- }
- }
- } else {
- if ( !$field_value OR $field_value == '' ) {
- $field_value = 0;
- }
- $decimal_point = $wp_locale->number_format['decimal_point'];
- /* Casting to a Float removes decimal */
- // $calc_value = (float) preg_replace('/[^0-9' . $decimal_point . '-]*/','',$field_value);
- $calc_value = preg_replace('/[^0-9' . $decimal_point . '-]*/','',$field_value);
- }
- if ( is_string( $calc_value ) AND strpos( $calc_value, "%" ) !== false ) {
- $calc_value = str_replace( "%", "", $calc_value );
- $calc_value = $calc_value / 100;
- }
- if ( $calc_value == '' OR !$calc_value ) {
- $calc_value = 0;
- }
- return $calc_value;
- }
|