From 3a4ce9808aa886d0b3b32175038c0e2468a9a038 Mon Sep 17 00:00:00 2001 From: Dave Mello Date: Fri, 8 Jun 2018 16:33:31 -0400 Subject: [PATCH 1/6] pass the original form id, as well as the instance number of this particular form on the page, as hidden values in the form submission --- gravityforms-multiple-form-instances.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravityforms-multiple-form-instances.php b/gravityforms-multiple-form-instances.php index d232504..903fd89 100644 --- a/gravityforms-multiple-form-instances.php +++ b/gravityforms-multiple-form-instances.php @@ -96,7 +96,7 @@ public function gform_get_form_filter( $form_string, $form ) { 'GFCalc(' . $form['id'] . ',' => 'GFCalc(' . $random_id . ',', 'gf_global["number_formats"][' . $form['id'] . ']' => 'gf_global["number_formats"][' . $random_id . ']', 'gform_next_button_' . $form['id'] . '_' => 'gform_next_button_' . $random_id . '_', - $hidden_field => "" . $hidden_field, + $hidden_field => "" . $hidden_field, ); // allow addons & plugins to add additional find & replace strings From 75a4926f9758b84f4ca9980d499b59778e3cc171 Mon Sep 17 00:00:00 2001 From: Dave Mello Date: Fri, 8 Jun 2018 16:36:05 -0400 Subject: [PATCH 2/6] fix bug where posted random ID was being applied to all forms on a page when a non-ajax submissions resulted in validation errors, which was then breaking conditional logic --- gravityforms-multiple-form-instances.php | 47 ++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/gravityforms-multiple-form-instances.php b/gravityforms-multiple-form-instances.php index 903fd89..8df5640 100644 --- a/gravityforms-multiple-form-instances.php +++ b/gravityforms-multiple-form-instances.php @@ -16,6 +16,8 @@ */ class Gravity_Forms_Multiple_Form_Instances { + private $instance_count = Array(); + /** * Constructor. * @@ -41,10 +43,49 @@ public function __construct() { * @return string $form_string The modified form HTML string. */ public function gform_get_form_filter( $form_string, $form ) { - // if form has been submitted, use the submitted ID, otherwise generate a new unique ID - if ( isset( $_POST['gform_random_id'] ) ) { - $random_id = absint( $_POST['gform_random_id'] ); // Input var okay. + + global $_POST; + + $random_id = null; + + // Keep track of the instance number for each form type + if (!array_key_exists($form['id'], $this->instance_count)) { + $this->instance_count[ $form['id'] ] = 1; } else { + $this->instance_count[ $form['id'] ] = $this->instance_count[ $form['id'] ] + 1; + } + + // Get the instance number for this particular form + $instance_number = $this->instance_count[ $form['id'] ]; + + // Are we processing after a form has just been submitted? + if ( isset( $_POST['gform_random_id'] )) { + + // Is it of the same type as the form we're currently modifying? + if ((isset( $_POST['gform_original_id'] ) && $_POST['gform_original_id'] == $form['id'] )) { + + // Is it an ajax submission? + if (array_key_exists('gform_ajax', $_POST)) { + + // Yes, use the previous random ID + $random_id = absint( $_POST['gform_random_id'] ); + + // Also use the previous instance ID + $instance_number = absint( $_POST['gform_instance_number'] ); + } + + // Is it the same instance of the form? + else if (isset( $_POST['gform_instance_number'] ) && $_POST['gform_instance_number'] == $instance_number ) { + + // Yes, use the previous random ID + $random_id = absint( $_POST['gform_random_id'] ); + + } + } + } + + // Otherwise generate a new unique ID + if (!$random_id) { $random_id = mt_rand(); } From 1a2be2f7cacc503eed5952664d1255bdd9164139 Mon Sep 17 00:00:00 2001 From: Dave Mello Date: Fri, 8 Jun 2018 16:37:18 -0400 Subject: [PATCH 3/6] use the calculated instance number value --- ___gravityforms-multiple-form-instances___php___8kOHnN | 0 gravityforms-multiple-form-instances.php | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 ___gravityforms-multiple-form-instances___php___8kOHnN diff --git a/___gravityforms-multiple-form-instances___php___8kOHnN b/___gravityforms-multiple-form-instances___php___8kOHnN new file mode 100644 index 0000000..e69de29 diff --git a/gravityforms-multiple-form-instances.php b/gravityforms-multiple-form-instances.php index 8df5640..6bad23b 100644 --- a/gravityforms-multiple-form-instances.php +++ b/gravityforms-multiple-form-instances.php @@ -137,7 +137,7 @@ public function gform_get_form_filter( $form_string, $form ) { 'GFCalc(' . $form['id'] . ',' => 'GFCalc(' . $random_id . ',', 'gf_global["number_formats"][' . $form['id'] . ']' => 'gf_global["number_formats"][' . $random_id . ']', 'gform_next_button_' . $form['id'] . '_' => 'gform_next_button_' . $random_id . '_', - $hidden_field => "" . $hidden_field, + $hidden_field => "" . $hidden_field, ); // allow addons & plugins to add additional find & replace strings From 6477bc804287ffd89e7eb2094a83247b17856833 Mon Sep 17 00:00:00 2001 From: Dave Mello Date: Fri, 8 Jun 2018 16:38:24 -0400 Subject: [PATCH 4/6] remove tmp file --- ___gravityforms-multiple-form-instances___php___8kOHnN | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ___gravityforms-multiple-form-instances___php___8kOHnN diff --git a/___gravityforms-multiple-form-instances___php___8kOHnN b/___gravityforms-multiple-form-instances___php___8kOHnN deleted file mode 100644 index e69de29..0000000 From e182751c2d4bc70a623e0fc6d4627355f435a68d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Drago=C8=99=20Mocrii?= Date: Wed, 29 Aug 2018 15:57:07 -0600 Subject: [PATCH 5/6] Update gravityforms-multiple-form-instances.php Things added: - Support for multi-page forms (paginated forms) - Support for regular expression matching Things fixed: - Replace IDs properly for forms with multiple Chosen select fields - Add back support of selecting input by corresponding label (fixed input ID matching pattern) --- gravityforms-multiple-form-instances.php | 117 ++++++++++++++--------- 1 file changed, 70 insertions(+), 47 deletions(-) diff --git a/gravityforms-multiple-form-instances.php b/gravityforms-multiple-form-instances.php index d232504..f75ff03 100644 --- a/gravityforms-multiple-form-instances.php +++ b/gravityforms-multiple-form-instances.php @@ -38,12 +38,13 @@ public function __construct() { * * @param string $form_string The form HTML string. * @param array $form Array with the form settings. + * * @return string $form_string The modified form HTML string. */ public function gform_get_form_filter( $form_string, $form ) { // if form has been submitted, use the submitted ID, otherwise generate a new unique ID - if ( isset( $_POST['gform_random_id'] ) ) { - $random_id = absint( $_POST['gform_random_id'] ); // Input var okay. + if ( isset( $_POST[ 'gform_random_id' ] ) ) { + $random_id = absint( $_POST[ 'gform_random_id' ] ); // Input var okay. } else { $random_id = mt_rand(); } @@ -53,59 +54,81 @@ public function gform_get_form_filter( $form_string, $form ) { // define all occurences of the original form ID that wont hurt the form input $strings = array( - ' gform_wrapper' => ' gform_wrapper gform_wrapper_original_id_' . $form['id'], - "for='choice_" => "for='choice_" . $random_id . '_', - "id='label_" => "id='label_" . $random_id . '_', - "'gform_wrapper_" . $form['id'] . "'" => "'gform_wrapper_" . $random_id . "'", - "'gf_" . $form['id'] . "'" => "'gf_" . $random_id . "'", - "'gform_" . $form['id'] . "'" => "'gform_" . $random_id . "'", - "'gform_ajax_frame_" . $form['id'] . "'" => "'gform_ajax_frame_" . $random_id . "'", - '#gf_' . $form['id'] . "'" => '#gf_' . $random_id . "'", - "'gform_fields_" . $form['id'] . "'" => "'gform_fields_" . $random_id . "'", - "id='field_" . $form['id'] . '_' => "id='field_" . $random_id . '_', - "for='input_" . $form['id'] . '_' => "for='input_" . $random_id . '_', - "id='input_" . $form['id'] . '_' => "id='input_" . $random_id . '_', - "id='choice_" . $form['id'] . '_' => "id='choice_" . $random_id . '_', - "'gform_submit_button_" . $form['id'] . "'" => "'gform_submit_button_" . $random_id . "'", - '"gf_submitting_' . $form['id'] . '"' => '"gf_submitting_' . $random_id . '"', - "'gf_submitting_" . $form['id'] . "'" => "'gf_submitting_" . $random_id . "'", - '#gform_ajax_frame_' . $form['id'] => '#gform_ajax_frame_' . $random_id, - '#gform_wrapper_' . $form['id'] => '#gform_wrapper_' . $random_id, - '#gform_' . $form['id'] => '#gform_' . $random_id, - "trigger('gform_post_render', [" . $form['id'] => "trigger('gform_post_render', [" . $random_id, - 'gformInitSpinner( ' . $form['id'] . ',' => 'gformInitSpinner( ' . $random_id . ',', - "trigger('gform_page_loaded', [" . $form['id'] => "trigger('gform_page_loaded', [" . $random_id, - "'gform_confirmation_loaded', [" . $form['id'] . ']' => "'gform_confirmation_loaded', [" . $random_id . ']', - 'gf_apply_rules(' . $form['id'] . ',' => 'gf_apply_rules(' . $random_id . ',', - 'gform_confirmation_wrapper_' . $form['id'] => 'gform_confirmation_wrapper_' . $random_id, - 'gforms_confirmation_message_' . $form['id'] => 'gforms_confirmation_message_' . $random_id, - 'gform_confirmation_message_' . $form['id'] => 'gform_confirmation_message_' . $random_id, - 'if(formId == ' . $form['id'] . ')' => 'if(formId == ' . $random_id . ')', - "window['gf_form_conditional_logic'][" . $form['id'] . ']' => "window['gf_form_conditional_logic'][" . $random_id . ']', - "trigger('gform_post_conditional_logic', [" . $form['id'] . ',' => "trigger('gform_post_conditional_logic', [" . $random_id . ',', - 'gformShowPasswordStrength("input_' . $form['id'] . '_' => 'gformShowPasswordStrength("input_' . $random_id . '_', - "gformInitChosenFields('#input_" . $form['id'] . '_' => "gformInitChosenFields('#input_" . $random_id . '_', - "jQuery('#input_" . $form['id'] . '_' => "jQuery('#input_" . $random_id . '_', - 'gforms_calendar_icon_input_' . $form['id'] . '_' => 'gforms_calendar_icon_input_' . $random_id . '_', - "id='ginput_base_price_" . $form['id'] . '_' => "id='ginput_base_price_" . $random_id . '_', - "id='ginput_quantity_" . $form['id'] . '_' => "id='ginput_quantity_" . $random_id . '_', - 'gfield_price_' . $form['id'] . '_' => 'gfield_price_' . $random_id . '_', - 'gfield_quantity_' . $form['id'] . '_' => 'gfield_quantity_' . $random_id . '_', - 'gfield_product_' . $form['id'] . '_' => 'gfield_product_' . $random_id . '_', - 'ginput_total_' . $form['id'] => 'ginput_total_' . $random_id, - 'GFCalc(' . $form['id'] . ',' => 'GFCalc(' . $random_id . ',', - 'gf_global["number_formats"][' . $form['id'] . ']' => 'gf_global["number_formats"][' . $random_id . ']', - 'gform_next_button_' . $form['id'] . '_' => 'gform_next_button_' . $random_id . '_', - $hidden_field => "" . $hidden_field, + ' gform_wrapper' => ' gform_wrapper gform_wrapper_original_id_' . $form[ 'id' ], + "for='choice_" => "for='choice_" . $random_id . '_', + "id='choice_" => "id='choice_" . $random_id . '_', + "id='label_" => "id='label_" . $random_id . '_', + "'gform_wrapper_" . $form[ 'id' ] . "'" => "'gform_wrapper_" . $random_id . "'", + "'gf_" . $form[ 'id' ] . "'" => "'gf_" . $random_id . "'", + "'gform_" . $form[ 'id' ] . "'" => "'gform_" . $random_id . "'", + "'gform_ajax_frame_" . $form[ 'id' ] . "'" => "'gform_ajax_frame_" . $random_id . "'", + '#gf_' . $form[ 'id' ] . "'" => '#gf_' . $random_id . "'", + "id='gform_fields_" . $form[ 'id' ] => "id='gform_fields_" . $random_id, + "id='field_" . $form[ 'id' ] . '_' => "id='field_" . $random_id . '_', + "for='input_" . $form[ 'id' ] . '_' => "for='input_" . $random_id . '_', + "id='input_" . $form[ 'id' ] . '_' => "id='input_" . $random_id . '_', + "'gform_submit_button_" . $form[ 'id' ] . "'" => "'gform_submit_button_" . $random_id . "'", + '"gf_submitting_' . $form[ 'id' ] . '"' => '"gf_submitting_' . $random_id . '"', + "'gf_submitting_" . $form[ 'id' ] . "'" => "'gf_submitting_" . $random_id . "'", + '#gform_ajax_frame_' . $form[ 'id' ] => '#gform_ajax_frame_' . $random_id, + '#gform_wrapper_' . $form[ 'id' ] => '#gform_wrapper_' . $random_id, + '#gform_' . $form[ 'id' ] => '#gform_' . $random_id, + "trigger('gform_post_render', [" . $form[ 'id' ] => "trigger('gform_post_render', [" . $random_id, + 'gformInitSpinner( ' . $form[ 'id' ] . ',' => 'gformInitSpinner( ' . $random_id . ',', + "trigger('gform_page_loaded', [" . $form[ 'id' ] => "trigger('gform_page_loaded', [" . $random_id, + "'gform_confirmation_loaded', [" . $form[ 'id' ] . ']' => "'gform_confirmation_loaded', [" . $random_id . ']', + 'gf_apply_rules(' . $form[ 'id' ] . ',' => 'gf_apply_rules(' . $random_id . ',', + 'gform_confirmation_wrapper_' . $form[ 'id' ] => 'gform_confirmation_wrapper_' . $random_id, + 'gforms_confirmation_message_' . $form[ 'id' ] => 'gforms_confirmation_message_' . $random_id, + 'gform_confirmation_message_' . $form[ 'id' ] => 'gform_confirmation_message_' . $random_id, + 'if(formId == ' . $form[ 'id' ] . ')' => 'if(formId == ' . $random_id . ')', + "window['gf_form_conditional_logic'][" . $form[ 'id' ] . ']' => "window['gf_form_conditional_logic'][" . $random_id . ']', + "trigger('gform_post_conditional_logic', [" . $form[ 'id' ] . ',' => "trigger('gform_post_conditional_logic', [" . $random_id . ',', + 'gformShowPasswordStrength("input_' . $form[ 'id' ] . '_' => 'gformShowPasswordStrength("input_' . $random_id . '_', + "gformInitChosenFields('#input_" . $form[ 'id' ] . '_' => "gformInitChosenFields('#input_" . $random_id . '_', + "jQuery('#input_" . $form[ 'id' ] . '_' => "jQuery('#input_" . $random_id . '_', + 'gforms_calendar_icon_input_' . $form[ 'id' ] . '_' => 'gforms_calendar_icon_input_' . $random_id . '_', + "id='ginput_base_price_" . $form[ 'id' ] . '_' => "id='ginput_base_price_" . $random_id . '_', + "id='ginput_quantity_" . $form[ 'id' ] . '_' => "id='ginput_quantity_" . $random_id . '_', + 'gfield_price_' . $form[ 'id' ] . '_' => 'gfield_price_' . $random_id . '_', + 'gfield_quantity_' . $form[ 'id' ] . '_' => 'gfield_quantity_' . $random_id . '_', + 'gfield_product_' . $form[ 'id' ] . '_' => 'gfield_product_' . $random_id . '_', + 'ginput_total_' . $form[ 'id' ] => 'ginput_total_' . $random_id, + 'GFCalc(' . $form[ 'id' ] . ',' => 'GFCalc(' . $random_id . ',', + 'gf_global["number_formats"][' . $form[ 'id' ] . ']' => 'gf_global["number_formats"][' . $random_id . ']', + 'gform_next_button_' . $form[ 'id' ] . '_' => 'gform_next_button_' . $random_id . '_', + $hidden_field => "" . $hidden_field, + //multi-page forms + "id='gform_page_" . $form[ 'id' ] => "id='gform_page_" . $random_id, + "id='gform_previous_button_" . $form[ 'id' ] => "id='gform_previous_button_" . $random_id, + "id='gform_next_button_" . $form[ 'id' ] => "id='gform_next_button_" . $random_id, + '#gform_target_page_number_' . $form[ 'id' ] => '#gform_target_page_number_' . $random_id, + 'id=\'gform_target_page_number_' . $form[ 'id' ] => 'id=\'gform_target_page_number_' . $random_id, + '#gform_source_page_number_' . $form[ 'id' ] => '#gform_source_page_number_' . $random_id, + 'id=\'gform_source_page_number_' . $form[ 'id' ] => 'id=\'gform_source_page_number_' . $random_id, + "id='gf_page_steps_" . $form[ 'id' ] => "id='gf_page_steps_" . $random_id, + "id='gf_step_" . $form[ 'id' ] . "_" => "id='gf_step_" . $random_id . "_" ); + $regex_strings = [ + '/(?<=gformInitChosenFields\(\'|,\G)(?:#input_[0-9]+_([0-9]+)(,?))/m' => '#input_' . $random_id . '_$1$2' + ]; + // allow addons & plugins to add additional find & replace strings - $strings = apply_filters( 'gform_multiple_instances_strings', $strings, $form['id'], $random_id ); + $strings = apply_filters( 'gform_multiple_instances_strings', $strings, $form[ 'id' ], $random_id ); + // allow addons & plugins to add additional regex find & replace strings + $regex_strings = apply_filters( 'gform_multiple_instances_regex_strings', $regex_strings, $form[ 'id' ], + $random_id ); // replace all occurences with the new unique ID foreach ( $strings as $find => $replace ) { $form_string = str_replace( $find, $replace, $form_string ); } + // replace all occurences with the new unique ID (using regex) + foreach ( $regex_strings as $find => $replace ) { + $form_string = preg_replace( $find, $replace, $form_string ); + } + return $form_string; } From 7260ca242fba1b331c82e243987717e36a716ae7 Mon Sep 17 00:00:00 2001 From: puremana Date: Wed, 2 Dec 2020 12:04:19 +1300 Subject: [PATCH 6/6] Fix conditional on radio and checkbox fields --- gravityforms-multiple-form-instances.php | 268 ++++++++++------------- 1 file changed, 116 insertions(+), 152 deletions(-) diff --git a/gravityforms-multiple-form-instances.php b/gravityforms-multiple-form-instances.php index 33f0c94..f7bcf33 100644 --- a/gravityforms-multiple-form-instances.php +++ b/gravityforms-multiple-form-instances.php @@ -16,158 +16,122 @@ */ class Gravity_Forms_Multiple_Form_Instances { - private $instance_count = Array(); - - /** - * Constructor. - * - * Used to initialize the plugin and hook the related functionality. - * - * @access public - */ - public function __construct() { - // hook the HTML ID string find & replace functionality - add_filter( 'gform_get_form_filter', array( $this, 'gform_get_form_filter' ), 10, 2 ); - add_filter( 'gform_confirmation', array( $this, 'gform_get_form_filter' ), 10, 2 ); - } - - /** - * Replaces all occurences of the form ID with a new, unique ID. - * - * This is where the magic happens. - * - * @access public - * - * @param string $form_string The form HTML string. - * @param array $form Array with the form settings. - * - * @return string $form_string The modified form HTML string. - */ - public function gform_get_form_filter( $form_string, $form ) { - // if form has been submitted, use the submitted ID, otherwise generate a new unique ID - if ( isset( $_POST[ 'gform_random_id' ] ) ) { - $random_id = absint( $_POST[ 'gform_random_id' ] ); // Input var okay. - } else { - $this->instance_count[ $form['id'] ] = $this->instance_count[ $form['id'] ] + 1; - } - - // Get the instance number for this particular form - $instance_number = $this->instance_count[ $form['id'] ]; - - // Are we processing after a form has just been submitted? - if ( isset( $_POST['gform_random_id'] )) { - - // Is it of the same type as the form we're currently modifying? - if ((isset( $_POST['gform_original_id'] ) && $_POST['gform_original_id'] == $form['id'] )) { - - // Is it an ajax submission? - if (array_key_exists('gform_ajax', $_POST)) { - - // Yes, use the previous random ID - $random_id = absint( $_POST['gform_random_id'] ); - - // Also use the previous instance ID - $instance_number = absint( $_POST['gform_instance_number'] ); - } - - // Is it the same instance of the form? - else if (isset( $_POST['gform_instance_number'] ) && $_POST['gform_instance_number'] == $instance_number ) { - - // Yes, use the previous random ID - $random_id = absint( $_POST['gform_random_id'] ); - - } - } - } - - // Otherwise generate a new unique ID - if (!$random_id) { - $random_id = mt_rand(); - } - - // this is where we keep our unique ID - $hidden_field = " ' gform_wrapper gform_wrapper_original_id_' . $form[ 'id' ], - "for='choice_" => "for='choice_" . $random_id . '_', - "id='choice_" => "id='choice_" . $random_id . '_', - "id='label_" => "id='label_" . $random_id . '_', - "'gform_wrapper_" . $form[ 'id' ] . "'" => "'gform_wrapper_" . $random_id . "'", - "'gf_" . $form[ 'id' ] . "'" => "'gf_" . $random_id . "'", - "'gform_" . $form[ 'id' ] . "'" => "'gform_" . $random_id . "'", - "'gform_ajax_frame_" . $form[ 'id' ] . "'" => "'gform_ajax_frame_" . $random_id . "'", - '#gf_' . $form[ 'id' ] . "'" => '#gf_' . $random_id . "'", - "id='gform_fields_" . $form[ 'id' ] => "id='gform_fields_" . $random_id, - "id='field_" . $form[ 'id' ] . '_' => "id='field_" . $random_id . '_', - "for='input_" . $form[ 'id' ] . '_' => "for='input_" . $random_id . '_', - "id='input_" . $form[ 'id' ] . '_' => "id='input_" . $random_id . '_', - "'gform_submit_button_" . $form[ 'id' ] . "'" => "'gform_submit_button_" . $random_id . "'", - '"gf_submitting_' . $form[ 'id' ] . '"' => '"gf_submitting_' . $random_id . '"', - "'gf_submitting_" . $form[ 'id' ] . "'" => "'gf_submitting_" . $random_id . "'", - '#gform_ajax_frame_' . $form[ 'id' ] => '#gform_ajax_frame_' . $random_id, - '#gform_wrapper_' . $form[ 'id' ] => '#gform_wrapper_' . $random_id, - '#gform_' . $form[ 'id' ] => '#gform_' . $random_id, - "trigger('gform_post_render', [" . $form[ 'id' ] => "trigger('gform_post_render', [" . $random_id, - 'gformInitSpinner( ' . $form[ 'id' ] . ',' => 'gformInitSpinner( ' . $random_id . ',', - "trigger('gform_page_loaded', [" . $form[ 'id' ] => "trigger('gform_page_loaded', [" . $random_id, - "'gform_confirmation_loaded', [" . $form[ 'id' ] . ']' => "'gform_confirmation_loaded', [" . $random_id . ']', - 'gf_apply_rules(' . $form[ 'id' ] . ',' => 'gf_apply_rules(' . $random_id . ',', - 'gform_confirmation_wrapper_' . $form[ 'id' ] => 'gform_confirmation_wrapper_' . $random_id, - 'gforms_confirmation_message_' . $form[ 'id' ] => 'gforms_confirmation_message_' . $random_id, - 'gform_confirmation_message_' . $form[ 'id' ] => 'gform_confirmation_message_' . $random_id, - 'if(formId == ' . $form[ 'id' ] . ')' => 'if(formId == ' . $random_id . ')', - "window['gf_form_conditional_logic'][" . $form[ 'id' ] . ']' => "window['gf_form_conditional_logic'][" . $random_id . ']', - "trigger('gform_post_conditional_logic', [" . $form[ 'id' ] . ',' => "trigger('gform_post_conditional_logic', [" . $random_id . ',', - 'gformShowPasswordStrength("input_' . $form[ 'id' ] . '_' => 'gformShowPasswordStrength("input_' . $random_id . '_', - "gformInitChosenFields('#input_" . $form[ 'id' ] . '_' => "gformInitChosenFields('#input_" . $random_id . '_', - "jQuery('#input_" . $form[ 'id' ] . '_' => "jQuery('#input_" . $random_id . '_', - 'gforms_calendar_icon_input_' . $form[ 'id' ] . '_' => 'gforms_calendar_icon_input_' . $random_id . '_', - "id='ginput_base_price_" . $form[ 'id' ] . '_' => "id='ginput_base_price_" . $random_id . '_', - "id='ginput_quantity_" . $form[ 'id' ] . '_' => "id='ginput_quantity_" . $random_id . '_', - 'gfield_price_' . $form[ 'id' ] . '_' => 'gfield_price_' . $random_id . '_', - 'gfield_quantity_' . $form[ 'id' ] . '_' => 'gfield_quantity_' . $random_id . '_', - 'gfield_product_' . $form[ 'id' ] . '_' => 'gfield_product_' . $random_id . '_', - 'ginput_total_' . $form[ 'id' ] => 'ginput_total_' . $random_id, - 'GFCalc(' . $form[ 'id' ] . ',' => 'GFCalc(' . $random_id . ',', - 'gf_global["number_formats"][' . $form[ 'id' ] . ']' => 'gf_global["number_formats"][' . $random_id . ']', - 'gform_next_button_' . $form[ 'id' ] . '_' => 'gform_next_button_' . $random_id . '_', - $hidden_field => "" . $hidden_field, - //multi-page forms - "id='gform_page_" . $form[ 'id' ] => "id='gform_page_" . $random_id, - "id='gform_previous_button_" . $form[ 'id' ] => "id='gform_previous_button_" . $random_id, - "id='gform_next_button_" . $form[ 'id' ] => "id='gform_next_button_" . $random_id, - '#gform_target_page_number_' . $form[ 'id' ] => '#gform_target_page_number_' . $random_id, - 'id=\'gform_target_page_number_' . $form[ 'id' ] => 'id=\'gform_target_page_number_' . $random_id, - '#gform_source_page_number_' . $form[ 'id' ] => '#gform_source_page_number_' . $random_id, - 'id=\'gform_source_page_number_' . $form[ 'id' ] => 'id=\'gform_source_page_number_' . $random_id, - "id='gf_page_steps_" . $form[ 'id' ] => "id='gf_page_steps_" . $random_id, - "id='gf_step_" . $form[ 'id' ] . "_" => "id='gf_step_" . $random_id . "_" - ); - - $regex_strings = [ - '/(?<=gformInitChosenFields\(\'|,\G)(?:#input_[0-9]+_([0-9]+)(,?))/m' => '#input_' . $random_id . '_$1$2' - ]; - - // allow addons & plugins to add additional find & replace strings - $strings = apply_filters( 'gform_multiple_instances_strings', $strings, $form[ 'id' ], $random_id ); - // allow addons & plugins to add additional regex find & replace strings - $regex_strings = apply_filters( 'gform_multiple_instances_regex_strings', $regex_strings, $form[ 'id' ], - $random_id ); - - // replace all occurences with the new unique ID - foreach ( $strings as $find => $replace ) { - $form_string = str_replace( $find, $replace, $form_string ); - } - // replace all occurences with the new unique ID (using regex) - foreach ( $regex_strings as $find => $replace ) { - $form_string = preg_replace( $find, $replace, $form_string ); - } - - - return $form_string; - } + /** + * Constructor. + * + * Used to initialize the plugin and hook the related functionality. + * + * @access public + */ + public function __construct() { + // hook the HTML ID string find & replace functionality + add_filter( 'gform_get_form_filter', array( $this, 'gform_get_form_filter' ), 10, 2 ); + add_filter( 'gform_confirmation', array( $this, 'gform_get_form_filter' ), 10, 2 ); + } + + /** + * Replaces all occurences of the form ID with a new, unique ID. + * + * This is where the magic happens. + * + * @access public + * + * @param string $form_string The form HTML string. + * @param array $form Array with the form settings. + * + * @return string $form_string The modified form HTML string. + */ + public function gform_get_form_filter( $form_string, $form ) { + // if form has been submitted, use the submitted ID, otherwise generate a new unique ID + if ( isset( $_POST[ 'gform_random_id' ] ) ) { + $random_id = absint( $_POST[ 'gform_random_id' ] ); // Input var okay. + } else { + $random_id = mt_rand(); + } + + // this is where we keep our unique ID + $hidden_field = " ' gform_wrapper gform_wrapper_original_id_' . $form[ 'id' ], + "for='choice_" . $form[ 'id' ] . '_' => "for='choice_" . $random_id . '_', + "id='choice_". $form[ 'id' ] . '_' => "id='choice_" . $random_id . '_', + "id='label_" . $form[ 'id' ] . '_' => "id='label_" . $random_id . '_', + "'gform_wrapper_" . $form[ 'id' ] . "'" => "'gform_wrapper_" . $random_id . "'", + "'gf_" . $form[ 'id' ] . "'" => "'gf_" . $random_id . "'", + "'gform_" . $form[ 'id' ] . "'" => "'gform_" . $random_id . "'", + "'gform_ajax_frame_" . $form[ 'id' ] . "'" => "'gform_ajax_frame_" . $random_id . "'", + '#gf_' . $form[ 'id' ] . "'" => '#gf_' . $random_id . "'", + "id='gform_fields_" . $form[ 'id' ] => "id='gform_fields_" . $random_id, + "id='field_" . $form[ 'id' ] . '_' => "id='field_" . $random_id . '_', + "for='input_" . $form[ 'id' ] . '_' => "for='input_" . $random_id . '_', + "id='input_" . $form[ 'id' ] . '_' => "id='input_" . $random_id . '_', + "'gform_submit_button_" . $form[ 'id' ] . "'" => "'gform_submit_button_" . $random_id . "'", + '"gf_submitting_' . $form[ 'id' ] . '"' => '"gf_submitting_' . $random_id . '"', + "'gf_submitting_" . $form[ 'id' ] . "'" => "'gf_submitting_" . $random_id . "'", + '#gform_ajax_frame_' . $form[ 'id' ] => '#gform_ajax_frame_' . $random_id, + '#gform_wrapper_' . $form[ 'id' ] => '#gform_wrapper_' . $random_id, + '#gform_' . $form[ 'id' ] => '#gform_' . $random_id, + "trigger('gform_post_render', [" . $form[ 'id' ] => "trigger('gform_post_render', [" . $random_id, + 'gformInitSpinner( ' . $form[ 'id' ] . ',' => 'gformInitSpinner( ' . $random_id . ',', + "trigger('gform_page_loaded', [" . $form[ 'id' ] => "trigger('gform_page_loaded', [" . $random_id, + "'gform_confirmation_loaded', [" . $form[ 'id' ] . ']' => "'gform_confirmation_loaded', [" . $random_id . ']', + 'gf_apply_rules(' . $form[ 'id' ] . ',' => 'gf_apply_rules(' . $random_id . ',', + 'gform_confirmation_wrapper_' . $form[ 'id' ] => 'gform_confirmation_wrapper_' . $random_id, + 'gforms_confirmation_message_' . $form[ 'id' ] => 'gforms_confirmation_message_' . $random_id, + 'gform_confirmation_message_' . $form[ 'id' ] => 'gform_confirmation_message_' . $random_id, + 'if(formId == ' . $form[ 'id' ] . ')' => 'if(formId == ' . $random_id . ')', + "window['gf_form_conditional_logic'][" . $form[ 'id' ] . ']' => "window['gf_form_conditional_logic'][" . $random_id . ']', + "trigger('gform_post_conditional_logic', [" . $form[ 'id' ] . ',' => "trigger('gform_post_conditional_logic', [" . $random_id . ',', + 'gformShowPasswordStrength("input_' . $form[ 'id' ] . '_' => 'gformShowPasswordStrength("input_' . $random_id . '_', + "gformInitChosenFields('#input_" . $form[ 'id' ] . '_' => "gformInitChosenFields('#input_" . $random_id . '_', + "jQuery('#input_" . $form[ 'id' ] . '_' => "jQuery('#input_" . $random_id . '_', + 'gforms_calendar_icon_input_' . $form[ 'id' ] . '_' => 'gforms_calendar_icon_input_' . $random_id . '_', + "id='ginput_base_price_" . $form[ 'id' ] . '_' => "id='ginput_base_price_" . $random_id . '_', + "id='ginput_quantity_" . $form[ 'id' ] . '_' => "id='ginput_quantity_" . $random_id . '_', + 'gfield_price_' . $form[ 'id' ] . '_' => 'gfield_price_' . $random_id . '_', + 'gfield_quantity_' . $form[ 'id' ] . '_' => 'gfield_quantity_' . $random_id . '_', + 'gfield_product_' . $form[ 'id' ] . '_' => 'gfield_product_' . $random_id . '_', + 'ginput_total_' . $form[ 'id' ] => 'ginput_total_' . $random_id, + 'GFCalc(' . $form[ 'id' ] . ',' => 'GFCalc(' . $random_id . ',', + 'gf_global["number_formats"][' . $form[ 'id' ] . ']' => 'gf_global["number_formats"][' . $random_id . ']', + 'gform_next_button_' . $form[ 'id' ] . '_' => 'gform_next_button_' . $random_id . '_', + $hidden_field => "" . $hidden_field, + //multi-page forms + "id='gform_page_" . $form[ 'id' ] => "id='gform_page_" . $random_id, + "id='gform_previous_button_" . $form[ 'id' ] => "id='gform_previous_button_" . $random_id, + "id='gform_next_button_" . $form[ 'id' ] => "id='gform_next_button_" . $random_id, + '#gform_target_page_number_' . $form[ 'id' ] => '#gform_target_page_number_' . $random_id, + 'id=\'gform_target_page_number_' . $form[ 'id' ] => 'id=\'gform_target_page_number_' . $random_id, + '#gform_source_page_number_' . $form[ 'id' ] => '#gform_source_page_number_' . $random_id, + 'id=\'gform_source_page_number_' . $form[ 'id' ] => 'id=\'gform_source_page_number_' . $random_id, + "id='gf_page_steps_" . $form[ 'id' ] => "id='gf_page_steps_" . $random_id, + "id='gf_step_" . $form[ 'id' ] . "_" => "id='gf_step_" . $random_id . "_" + ); + + $regex_strings = [ + '/(?<=gformInitChosenFields\(\'|,\G)(?:#input_[0-9]+_([0-9]+)(,?))/m' => '#input_' . $random_id . '_$1$2' + ]; + + // allow addons & plugins to add additional find & replace strings + $strings = apply_filters( 'gform_multiple_instances_strings', $strings, $form[ 'id' ], $random_id ); + // allow addons & plugins to add additional regex find & replace strings + $regex_strings = apply_filters( 'gform_multiple_instances_regex_strings', $regex_strings, $form[ 'id' ], + $random_id ); + + // replace all occurences with the new unique ID + foreach ( $strings as $find => $replace ) { + $form_string = str_replace( $find, $replace, $form_string ); + } + // replace all occurences with the new unique ID (using regex) + foreach ( $regex_strings as $find => $replace ) { + $form_string = preg_replace( $find, $replace, $form_string ); + } + + + return $form_string; + } }