/
home
/
infinitibizsol
/
www
/
wp-content
/
plugins
/
wpforms
/
pro
/
includes
/
File Upload :
llllll
Current File: /home/infinitibizsol/www/wp-content/plugins/wpforms/pro/includes/class-conditional-logic-core.php
<?php /** * Conditional logic core. * * Contains functionality for using conditional logic in the form builder as * well as a global processing method that can be leveraged by all types of * conditional logic. * * This was contained in an addon until version 1.3.8 when it was rolled into * core. * * @since 1.3.8 */ class WPForms_Conditional_Logic_Core { /** * One is the loneliest number that you'll ever do. * * @since 1.1.0 * * @var WPForms_Conditional_Logic_Core */ private static $instance; /** * Main Instance. * * @since 1.1.0 * * @return WPForms_Conditional_Logic_Core */ public static function instance() { if ( ! isset( self::$instance ) && ! ( self::$instance instanceof WPForms_Conditional_Logic_Core ) ) { self::$instance = new WPForms_Conditional_Logic_Core(); add_action( 'wpforms_loaded', [ self::$instance, 'init' ], 10 ); } return self::$instance; } /** * Initialize. * * @since 1.0.0 */ public function init() { // Form builder. add_action( 'wpforms_builder_enqueues', [ $this, 'builder_assets' ] ); add_action( 'wpforms_builder_print_footer_scripts', [ $this, 'builder_footer_scripts' ] ); } /** * Enqueue assets for the builder. * * @since 1.0.0 */ public function builder_assets() { $min = wpforms_get_min_suffix(); // CSS. wp_enqueue_style( 'wpforms-builder-conditionals', WPFORMS_PLUGIN_URL . "assets/pro/css/builder-conditional-logic-core{$min}.css", [], WPFORMS_VERSION ); // JavaScript. wp_enqueue_script( 'wpforms-builder-conditionals', WPFORMS_PLUGIN_URL . "assets/pro/js/admin/builder-conditional-logic-core{$min}.js", [ 'jquery', 'wpforms-utils', 'wpforms-builder' ], WPFORMS_VERSION, false ); } /** * Output footer scripts inside the form builder. * * @since 1.3.8 */ public function builder_footer_scripts() { ?> <script type="text/html" id="tmpl-wpforms-conditional-block"> <# var containerID = data.fieldName.replace(/]/g, '').replace(/\[/g, '-'); #> <div class="wpforms-conditional-groups" id="wpforms-conditional-groups-{{ containerID }}"> <h4> <select name="{{ data.fieldName }}[conditional_type]"> <# _.each(data.actions, function(key, val) { #> <option value="{{ val }}">{{ key }}</option> <# }) #> </select> {{ data.actionDesc }} </h4> <div class="wpforms-conditional-group" data-reference="{{ data.fieldID }}"> <table><tbody> <tr class="wpforms-conditional-row" data-field-id="{{ data.fieldID }}" data-input-name="{{ data.fieldName }}"> <td class="field"> <select name="{{ data.fieldName }}[conditionals][0][0][field]" class="wpforms-conditional-field" data-groupid="0" data-ruleid="0"> <option value="">{{ wpforms_builder.select_field }}</option> </select> </td> <td class="operator"> <select name="{{ data.fieldName }}[conditionals][0][0][operator]" class="wpforms-conditional-operator"> <option value="==">{{ wpforms_builder.operator_is }}</option> <option value="!=">{{ wpforms_builder.operator_is_not }}</option> <option value="e">{{ wpforms_builder.operator_empty }}</option> <option value="!e">{{ wpforms_builder.operator_not_empty }}</option> <option value="c">{{ wpforms_builder.operator_contains }}</option> <option value="!c">{{ wpforms_builder.operator_not_contains }}</option> <option value="^">{{ wpforms_builder.operator_starts }}</option> <option value="~">{{ wpforms_builder.operator_ends }}</option> <option value=">">{{ wpforms_builder.operator_greater_than }}</option> <option value="<">{{ wpforms_builder.operator_less_than }}</option> </select> </td> <td class="value"> <select name="{{ data.fieldName }}[conditionals][0][0][value]" class="wpforms-conditional-value"> <option value="">{{ wpforms_builder.select_choice }}</option> </select> </td> <td class="actions"> <button class="wpforms-conditional-rule-add wpforms-btn wpforms-btn-sm wpforms-btn-blue" title="{{ wpforms_builder.rule_create }}">{{ wpforms_builder.and }}</button><button class="wpforms-conditional-rule-delete" title="{{ wpforms_builder.rule_delete }}"><i class="fa fa-trash-o" aria-hidden="true"></i></button> </td> </tr> </tbody></table> <h5>{{ wpforms_builder.or }}</h5> </div> <button class="wpforms-conditional-groups-add wpforms-btn wpforms-btn-sm wpforms-btn-blue">{{ wpforms_builder.rule_create_group }}</button> </div> </script> <?php } /** * Get a list of text-based fields for processing Conditional Logic. * * @since 1.7.5 * * @return array */ private function get_text_based_fields() { /** * Allow modifying fields list for Conditional Logic processing as a text-based field. * * @since 1.7.5 * * @param array $text_based_fields Fields list for Conditional Logic processing as a text-based field. */ return (array) apply_filters( 'wpforms_conditional_logic_core_get_text_based_fields', [ 'text', 'textarea', 'email', 'url', 'number', 'hidden', 'rating', 'number-slider', 'net_promoter_score', 'richtext', ] ); } /** * Build the conditional logic settings to display in the form builder. * * @since 1.3.8 * * @param array $args Data needed for a block to be generated properly. * @param bool $echo Whether to return or print. Default: print. * * @return string */ public function builder_block( $args = [], $echo = true ) { if ( ! empty( $args['form'] ) ) { $form_fields = wpforms_get_form_fields( $args['form'], wpforms_get_conditional_logic_form_fields_supported() ); } else { $form_fields = []; } // Define data. $type = ! empty( $args['type'] ) ? $args['type'] : 'field'; $panel = ! empty( $args['panel'] ) ? $args['panel'] : false; // notifications/connections. $parent = ! empty( $args['parent'] ) ? $args['parent'] : false; // settings. $subsection = ! empty( $args['subsection'] ) ? $args['subsection'] : false; $index = isset( $args['index'] ) ? esc_attr( $args['index'] ) : ''; $index = is_numeric( $index ) ? absint( $index ) : $index; $field = ! empty( $args['field'] ) ? $args['field'] : false; $reference = ! empty( $args['reference'] ) ? $args['reference'] : ''; $data_attrs = ''; ob_start(); // Block open markup. printf( '<div class="wpforms-conditional-block wpforms-conditional-block-%s" data-type="%s">', esc_attr( $type ), esc_attr( $type ) ); switch ( $type ) { case 'field': /* * This settings block is for a field. */ // Define more data for this field. $fields_instance = $args['instance']; $field_id = absint( $field['id'] ); $field_name = "fields[{$field_id}]"; $groups_id = "wpforms-conditional-groups-fields-{$field_id}"; $action_selected = ! empty( $field['conditional_type'] ) ? $field['conditional_type'] : ''; $conditionals = ! empty( $field['conditionals'] ) ? $field['conditionals'] : [ [ [] ] ]; $data_attrs = 'data-field-id="' . $field_id . '" '; $reference = $field_id; $enabled = isset( $field['conditional_logic'] ) ? $field['conditional_logic'] : false; $action_desc = ! empty( $args['action_desc'] ) ? $args['action_desc'] : esc_html__( 'this field if', 'wpforms' ); if ( empty( $args['actions'] ) ) { $actions = [ 'show' => esc_attr__( 'Show', 'wpforms' ), 'hide' => esc_attr__( 'Hide', 'wpforms' ), ]; } else { $actions = array_map( 'esc_attr', $args['actions'] ); } // Output Conditional Logic toggle checkbox field option. $fld = $fields_instance->field_element( 'toggle', $field, [ 'slug' => 'conditional_logic', 'value' => $enabled, 'desc' => esc_html__( 'Enable Conditional Logic', 'wpforms' ), 'tooltip' => sprintf( '<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a>', esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-use-conditional-logic-with-wpforms/', 'Field Options', 'Conditional Logic Documentation' ) ), esc_html__( 'How to use Conditional Logic', 'wpforms' ) ), 'data' => [ 'name' => $field_name, 'actions' => $actions, 'action-desc' => esc_attr( $action_desc ), ], ], false ); $fields_instance->field_element( 'row', $field, [ 'slug' => 'conditional_logic', 'content' => $fld, 'class' => 'wpforms-conditionals-enable-toggle', ] ); // Prevent conditional logic from being applied to itself. if ( ! empty( $form_fields[ $field['id'] ] ) ) { unset( $form_fields[ $field['id'] ] ); } break; case 'panel': /* * This settings block is for something else - connections / notifications etc. */ $form_data = $args['form']; $action_desc = ! empty( $args['action_desc'] ) ? $args['action_desc'] : esc_html__( 'this connection if', 'wpforms' ); if ( empty( $args['actions'] ) ) { $actions = [ 'go' => esc_attr__( 'Process', 'wpforms' ), 'stop' => esc_attr__( 'Don\'t process', 'wpforms' ), ]; } else { $actions = array_map( 'esc_attr', $args['actions'] ); } // Below we do a bunch of voodoo to determine where this block // is located in the form builder - eg is it in a top level // setting or in a subsection, etc. if ( ! empty( $parent ) ) { if ( ! empty( $subsection ) && ! wpforms_is_empty_string( $index ) ) { $field_name = sprintf( '%s[%s][%s][%s]', $parent, $panel, $subsection, $index ); $groups_id = sprintf( 'wpforms-conditional-groups-%s-%s-%s', $parent, $panel, $subsection ); $enabled = ! empty( $form_data[ $parent ][ $panel ][ $subsection ][ $index ]['conditional_logic'] ); $action_selected = ! empty( $form_data[ $parent ][ $panel ][ $subsection ][ $index ]['conditional_type'] ) ? $form_data[ $parent ][ $panel ][ $subsection ][ $index ]['conditional_type'] : ''; $conditionals = ! empty( $form_data[ $parent ][ $panel ][ $subsection ][ $index ]['conditionals'] ) ? $form_data[ $parent ][ $panel ][ $subsection ][ $index ]['conditionals'] : [ [ [] ] ]; } elseif ( ! empty( $subsection ) ) { $field_name = sprintf( '%s[%s][%s]', $parent, $panel, $subsection ); $groups_id = sprintf( 'wpforms-conditional-groups-%s-%s-%s', $parent, $panel, $subsection ); $enabled = ! empty( $form_data[ $parent ][ $panel ][ $subsection ]['conditional_logic'] ); $action_selected = ! empty( $form_data[ $parent ][ $panel ][ $subsection ]['conditional_type'] ) ? $form_data[ $parent ][ $panel ][ $subsection ]['conditional_type'] : ''; $conditionals = ! empty( $form_data[ $parent ][ $panel ][ $subsection ]['conditionals'] ) ? $form_data[ $parent ][ $panel ][ $subsection ]['conditionals'] : [ [ [] ] ]; } else { $field_name = sprintf( '%s[%s]', $parent, $panel ); $groups_id = sprintf( 'wpforms-conditional-groups-%s-%s', $parent, $panel ); $enabled = ! empty( $form_data[ $parent ][ $panel ]['conditional_logic'] ); $action_selected = ! empty( $form_data[ $parent ][ $panel ]['conditional_type'] ) ? $form_data[ $parent ][ $panel ]['conditional_type'] : ''; $conditionals = ! empty( $form_data[ $parent ][ $panel ]['conditionals'] ) ? $form_data[ $parent ][ $panel ]['conditionals'] : [ [ [] ] ]; } } else { $field_name = sprintf( '%s', $panel ); $groups_id = sprintf( 'wpforms-conditional-groups-%s', $panel ); $enabled = ! empty( $form_data[ $panel ]['conditional_logic'] ); $action_selected = ! empty( $form_data[ $panel ]['conditional_type'] ) ? $form_data[ $panel ]['conditional_type'] : ''; $conditionals = ! empty( $form_data[ $panel ]['conditionals'] ) ? $form_data[ $panel ]['conditionals'] : [ [ [] ] ]; } // Output Conditional Logic toggle checkbox panel setting. wpforms_panel_field( 'toggle', $panel, 'conditional_logic', $args['form'], esc_html__( 'Enable Conditional Logic', 'wpforms' ), [ 'tooltip' => sprintf( '<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a>', esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-use-conditional-logic-with-wpforms/', 'Field Options', 'Conditional Logic Documentation' ) ), esc_html__( 'How to use Conditional Logic', 'wpforms' ) ), 'parent' => $parent, 'subsection' => $subsection, 'index' => $index, 'input_id' => 'wpforms-panel-field-' . implode( '-', array_filter( [ $parent, $panel, $subsection, 'conditional_logic', 'checkbox' ] ) ), 'input_class' => 'wpforms-panel-field-conditional_logic-checkbox', 'class' => 'wpforms-conditionals-enable-toggle', 'data' => [ 'name' => $field_name, 'actions' => $actions, 'action-desc' => esc_attr( $action_desc ), ], ] ); break; default: $enabled = false; $field_name = ''; $reference = ''; $action_selected = ''; $action_desc = ''; $groups_id = ''; $actions = []; $conditionals = []; } // Only display the block details if conditional logic is enabled. if ( $enabled ) : $data_attrs .= 'data-input-name="' . esc_attr( $field_name ) . '"'; $style = $enabled ? '' : 'display:none;'; // Groups wrap open markup. printf( '<div class="wpforms-conditional-groups" id="%s" style="%s">', sanitize_html_class( $groups_id ), esc_attr( $style ) ); // This is the "[Show] this field if" type text and setting. echo '<h4>'; echo '<select name="' . esc_attr( $field_name ) . '[conditional_type]">'; foreach ( $actions as $key => $label ) { printf( '<option value="%s" %s>%s</option>', esc_attr( trim( $key ) ), selected( $key, $action_selected, false ), esc_html( $label ) ); } echo '</select>'; echo esc_html( $action_desc ); // Eg "this field if". echo '</h4>'; // Go through each conditional logic group. foreach ( $conditionals as $group_id => $group ) : // Individual group open markup. echo '<div class="wpforms-conditional-group" data-reference="' . esc_attr( $reference ) . '">'; echo '<table><tbody>'; foreach ( $group as $rule_id => $rule ) : $selected_current = false; // Individual rule table row. echo '<tr class="wpforms-conditional-row" ' . $data_attrs . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped // Rule field - allows the user to select // which field the conditional logic rule is // anchored to. echo '<td class="field">'; printf( '<select name="%s[conditionals][%d][%d][field]" class="wpforms-conditional-field" data-groupid="%d" data-ruleid="%d">', esc_attr( $field_name ), (int) $group_id, (int) $rule_id, (int) $group_id, (int) $rule_id ); echo '<option value="">' . esc_html__( '--- Select Field ---', 'wpforms' ) . '</option>'; if ( ! empty( $form_fields ) ) { foreach ( $form_fields as $form_field ) { // Exclude fields that are // leveraging dynamic choices. if ( ! empty( $form_field['dynamic_choices'] ) ) { continue; } if ( isset( $rule['field'] ) ) { $selected = $rule['field']; $selected_current = $rule['field']; } else { $selected = false; } $field_label = isset( $form_field['label'] ) && ! wpforms_is_empty_string( trim( $form_field['label'] ) ) ? $form_field['label'] : sprintf( /* translators: %d - field ID. */ __( 'Field #%d', 'wpforms' ), absint( $form_field['id'] ) ); $selected = selected( $selected, $form_field['id'], false ); printf( '<option value="%s" %s>%s</option>', absint( $form_field['id'] ), esc_attr( $selected ), esc_html( $field_label ) ); } } echo '</select>'; echo '</td>'; $text_and_numbers_fields = $this->get_text_based_fields(); // Rule operator - allows the user to // determine the comparison operator used // for processing. echo '<td class="operator">'; printf( '<select name="%s[conditionals][%s][%s][operator]" class="wpforms-conditional-operator">', esc_attr( $field_name ), esc_attr( $group_id ), esc_attr( $rule_id ) ); $operator = ! empty( $rule['operator'] ) ? $rule['operator'] : false; printf( '<option value="==" %s>%s</option>', selected( $operator, '==', false ), esc_html__( 'is', 'wpforms' ) ); printf( '<option value="!=" %s>%s</option>', selected( $operator, '!=', false ), esc_html__( 'is not', 'wpforms' ) ); printf( '<option value="e" %s>%s</option>', selected( $operator, 'e', false ), esc_html__( 'empty', 'wpforms' ) ); printf( '<option value="!e" %s>%s</option>', selected( $operator, '!e', false ), esc_html__( 'not empty', 'wpforms' ) ); // Only text based fields support // these additional operators. $disabled = ''; if ( ! empty( $rule['field'] ) && ! empty( $form_fields[ $rule['field'] ]['type'] ) ) { $disabled = in_array( $form_fields[ $rule['field'] ]['type'], $text_and_numbers_fields, true ) ? '' : ' disabled'; } printf( '<option value="c" %s%s>%s</option>', selected( $operator, 'c', false ), esc_attr( $disabled ), esc_html__( 'contains', 'wpforms' ) ); printf( '<option value="!c" %s%s>%s</option>', selected( $operator, '!c', false ), esc_attr( $disabled ), esc_html__( 'does not contain', 'wpforms' ) ); printf( '<option value="^" %s%s>%s</option>', selected( $operator, '^', false ), esc_attr( $disabled ), esc_html__( 'starts with', 'wpforms' ) ); printf( '<option value="~" %s%s>%s</option>', selected( $operator, '~', false ), esc_attr( $disabled ), esc_html__( 'ends with', 'wpforms' ) ); printf( '<option value=">" %s%s>%s</option>', selected( $operator, '>', false ), esc_attr( $disabled ), esc_html__( 'greater than', 'wpforms' ) ); printf( '<option value="<" %s%s>%s</option>', selected( $operator, '<', false ), esc_attr( $disabled ), esc_html__( 'less than', 'wpforms' ) ); echo '</select>'; echo '</td>'; // Rule value - allows the user to // determine the value we are using for // comparison. echo '<td class="value">'; if ( isset( $rule['field'] ) ) { // For empty/not empty fields the field value input is not needed so we disable it. if ( ! empty( $rule['operator'] ) && in_array( $rule['operator'], [ 'e', '!e' ], true ) ) { $disabled = 'disabled'; $rule['value'] = ''; } else { $disabled = ''; } if ( isset( $form_fields[ $rule['field'] ]['type'] ) && in_array( $form_fields[ $rule['field'] ]['type'], $text_and_numbers_fields, true ) ) { $type = in_array( $form_fields[ $rule['field'] ]['type'], [ 'rating', 'net_promoter_score', 'number-slider' ], true ) ? 'number' : 'text'; printf( '<input type="%s" name="%s[conditionals][%s][%s][value]" value="%s" class="wpforms-conditional-value" %s>', esc_attr( $type ), esc_attr( $field_name ), esc_attr( $group_id ), esc_attr( $rule_id ), esc_attr( $rule['value'] ), esc_attr( $disabled ) ); } else { printf( '<select name="%1$s[conditionals][%2$s][%3$s][value]" class="wpforms-conditional-value" %4$d>', esc_attr( $field_name ), esc_attr( $group_id ), esc_attr( $rule_id ), esc_attr( $disabled ) ); echo '<option value="">' . esc_html__( '--- Select Choice ---', 'wpforms' ) . '</option>'; if ( ! empty( $form_fields[ $rule['field'] ]['choices'] ) ) { foreach ( $form_fields[ $rule['field'] ]['choices'] as $option_id => $option ) { $value = isset( $rule['value'] ) ? $rule['value'] : ''; $label = ! isset( $option['label'] ) || trim( $option['label'] ) === '' ? sprintf( /* translators: %d - choice number. */ esc_html__( 'Choice %d', 'wpforms' ), (int) $option_id ) : $option['label']; printf( '<option value="%1$s" %2$s>%3$s</option>', esc_attr( $option_id ), selected( $option_id, $value, false ), esc_html( trim( $label ) ) ); } } echo '</select>'; } } else { echo '<select></select>'; } // End `if()`. echo '</td>'; // Rule actions. echo '<td class="actions">'; echo '<button class="wpforms-conditional-rule-add wpforms-btn wpforms-btn-sm wpforms-btn-blue" title="' . esc_attr__( 'Create new rule', 'wpforms' ) . '">' . esc_html_x( 'And', 'Conditional Logic: new rule logic.', 'wpforms' ) . '</button>'; echo '<button class="wpforms-conditional-rule-delete" title="' . esc_attr__( 'Delete rule', 'wpforms' ) . '"><i class="fa fa-trash-o" aria-hidden="true"></i></button>'; echo '</td>'; echo '</tr>'; // Close individual rule table row. endforeach; // End foreach() for individual rules. echo '</tbody></table>'; echo '<h5>' . esc_html_x( 'or', 'Conditional Logic: new rule logic.', 'wpforms' ) . '</h5>'; echo '</div>'; // Close individual group markup. endforeach; // End foreach() for conditional logic groups. echo '<button class="wpforms-conditional-groups-add wpforms-btn wpforms-btn-sm wpforms-btn-blue">' . esc_html__( 'Add New Group', 'wpforms' ) . '</button>'; echo '</div>'; // Close Groups wrap markup. endif; // End $enabled. echo '</div>'; // Close block markup. $output = ob_get_clean(); if ( $echo ) { echo $output; //phpcs:ignore } else { return $output; } } /** * Alias method for backwards compatibility. * * @since 1.1.0 * @deprecated 1.3.8 * * @param array $args Data needed for a block to be generated properly. * @param bool $echo Whether to return or print. Default: print. * * @return string */ public function conditionals_block( $args = [], $echo = true ) { _deprecated_function( __METHOD__, '1.3.8 of the WPForms plugin', 'wpforms_conditional_logic()->builder_block()' ); if ( $echo ) { echo $this->builder_block( $args, $echo ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { return $this->builder_block( $args, $echo ); } } /** * Process conditional rules. * * Check if a form passes the conditional logic rules that are provided. * * @since 1.3.8 * @since 1.6.1 Added multiple select support. * * @param array $fields List of fields with data and settings. * @param array $form_data Form data and settings. * @param array $conditionals List of conditionals. * * @return bool */ public function process( $fields, $form_data, $conditionals ) { if ( empty( $conditionals ) ) { return true; } $pass = false; foreach ( $conditionals as $group_id => $group ) { $pass_group = true; if ( ! empty( $group ) ) { foreach ( $group as $rule_id => $rule ) { if ( ! isset( $rule['field'] ) || $rule['field'] === '' || ! isset( $rule['operator'] ) ) { continue; } if ( ! isset( $rule['value'] ) && ! in_array( $rule['operator'], [ 'e', '!e' ], true ) ) { continue; } $rule_field = $rule['field']; $rule_operator = $rule['operator']; $rule_value = isset( $rule['value'] ) ? $rule['value'] : ''; if ( in_array( $fields[ $rule_field ]['type'], $this->get_text_based_fields(), true ) ) { // Text based fields. $left = strtolower( trim( wpforms_decode_string( $fields[ $rule_field ]['value'] ) ) ); $right = strtolower( trim( $rule_value ) ); switch ( $rule_operator ) { case '==': $pass_rule = $left === $right; break; case '!=': $pass_rule = $left !== $right; break; case 'c': $pass_rule = ( strpos( $left, $right ) !== false ); break; case '!c': $pass_rule = ( strpos( $left, $right ) === false ); break; case '^': $pass_rule = ( strrpos( $left, $right, -strlen( $left ) ) !== false ); break; case '~': // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found $pass_rule = ( ( $temp = strlen( $left ) - strlen( $right ) ) >= 0 && strpos( $left, $right, $temp ) !== false ); break; case 'e': $pass_rule = $left === ''; break; case '!e': $pass_rule = $left !== ''; break; case '>': $left = preg_replace( '/[^-0-9.]/', '', $left ); $pass_rule = ( $left !== '' ) && ( floatval( $left ) > floatval( $right ) ); break; case '<': $left = preg_replace( '/[^-0-9.]/', '', $left ); $pass_rule = ( $left !== '' ) && ( floatval( $left ) < floatval( $right ) ); break; default: // phpcs:disable WPForms.Comments.PHPDocHooks.RequiredHookDocumentation, WPForms.PHP.ValidateHooks.InvalidHookName /* * Allows developers to extend conditional logic with own rule operators. * * @since 1.2.3 * * @param bool $pass_rule Pass rule, `false` by default. * @param string $rule_operator Rule operator. * @param string $field_value Field value. * @param string $rule_value Rule value. */ $pass_rule = apply_filters( 'wpforms_process_conditional_logic', false, $rule_operator, $left, $right ); // phpcs:enable break; } } else { // Selector based fields. $provided_id = false; if ( in_array( $fields[ $rule_field ]['type'], [ 'payment-multiple', 'payment-checkbox', 'payment-select' ], true ) && isset( $fields[ $rule_field ]['value_raw'] ) && (string) $fields[ $rule_field ]['value_raw'] !== '' ) { // Payment Multiple/Checkbox fields store the option key, // so we can reference that easily. $provided_id = explode( ',', (string) $fields[ $rule_field ]['value_raw'] ); } elseif ( isset( $fields[ $rule_field ]['value'] ) && (string) $fields[ $rule_field ]['value'] !== '' ) { // Other select type fields we don't store the // option key so we have to do the logic to locate // it ourselves. $provided_id = []; if ( in_array( $fields[ $rule_field ]['type'], [ 'checkbox', 'select' ], true ) ) { $values = explode( "\n", $fields[ $rule_field ]['value'] ); } else { $values = (array) $fields[ $rule_field ]['value']; } foreach ( $form_data['fields'][ $rule_field ]['choices'] as $key => $choice ) { $choice = array_map( 'wpforms_decode_string', $choice ); if ( in_array( $fields[ $rule_field ]['type'], [ 'radio', 'checkbox', 'select' ], true ) ) { // Remove newlines from the choice (label or value) before comparing. // Newlines can be pasted with a long text to the choice label (or value) in the form builder. $choice = array_map( 'sanitize_text_field', $choice ); } foreach ( $values as $value ) { $value = wpforms_decode_string( $value ); if ( in_array( $value, $choice, true ) ) { $provided_id[] = $key; } } } } $left = (array) $provided_id; $right = strtolower( trim( (int) $rule_value ) ); switch ( $rule_operator ) { case '==': case 'c': // BC, no longer available. case '^': // BC, no longer available. case '~': // BC, no longer available. // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict $pass_rule = in_array( $right, $left ); break; case '!=': case '!c': // BC, no longer available. // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict $pass_rule = ! in_array( $right, $left ); break; case 'e': $pass_rule = empty( $left[0] ); break; case '!e': $pass_rule = ! empty( $left[0] ); break; default: // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName /** This filter is documented in the current file. */ $pass_rule = apply_filters( 'wpforms_process_conditional_logic', false, $rule_operator, $left, $right ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName break; } } // End `if()`. if ( ! $pass_rule ) { $pass_group = false; break; } } // End `foreach()`. } // End `if()`. if ( $pass_group ) { $pass = true; } } // End `foreach()`. return $pass; } /** * Alias function for backwards compatibility. * * @since 1.0.0 * * @param array $fields List of fields with data and settings. * @param array $form_data Form data and settings. * @param array $conditionals List of conditionals. * * @return bool */ public function conditionals_process( $fields, $form_data, $conditionals ) { return $this->process( $fields, $form_data, $conditionals ); } } /** * The function which returns the one WPForms_Conditional_Logic_Core instance. * * Use this function like you would a global variable, except without needing * to declare the global. * * @since 1.1.0 * * @return WPForms_Conditional_Logic_Core */ function wpforms_conditional_logic() { return WPForms_Conditional_Logic_Core::instance(); } wpforms_conditional_logic();
Copyright ©2k19 -
Hexid
|
Tex7ure