Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 87 additions & 5 deletions gravity-forms/gw-conditional-logic-entry-meta.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,12 @@ public function output_admin_script() {
endif;
}

public function get_conditional_logic_options() {
public function get_conditional_logic_options( $form_id = null ) {

$form_ids = 0;
$form_ids = $form_id ? $form_id : 0;

// Scope entry meta to the current form for GP Email Users and other admin screens
if ( is_admin() ) {
if ( ! $form_ids && is_admin() ) {
if ( rgget( 'page' ) === 'gp-email-users' ) {
$form_ids = rgpost( '_gform_setting_form' );
if ( ! $form_ids ) {
Expand Down Expand Up @@ -129,6 +129,38 @@ public function get_conditional_logic_options() {
);
}
}

if ( function_exists( 'gp_email_validator' ) ) {
$email_fields = GFAPI::get_fields_by_type( $form, 'email' );
foreach ( $email_fields as $field ) {
if ( gp_email_validator()->is_email_validator_field( $field ) ) {
$props = array(
'free' => esc_html__( 'Is Free Email', 'gravityforms' ),
'disposable' => esc_html__( 'Is Disposable Email', 'gravityforms' ),
);
foreach ( $props as $prop => $label ) {
$options[ "gpev_is_{$prop}_{$field->id}" ] = array(
'label' => sprintf( '%s (%s)', $field->label, $label ),
'value' => "gpev_is_{$prop}_{$field->id}",
'operators' => array(
'is' => 'is',
'isnot' => 'isNot',
),
'choices' => array(
array(
'text' => esc_html__( 'Yes', 'gravityforms' ),
'value' => '1',
),
array(
'text' => esc_html__( 'No', 'gravityforms' ),
'value' => '0',
),
),
);
}
}
}
}
Comment on lines +133 to +163
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Move GPEV integration inside the if ( $form ) block.

The email validator integration code uses $form but is placed outside the if ( $form ) block (which ends at line 131). This will cause errors when $form is null or false.

Apply this diff to fix the scope issue:

 			$form = GFAPI::get_form( is_array( $form_ids ) ? $form_ids[0] : $form_ids );
 			if ( $form ) {
 				$fields = GFAPI::get_fields_by_type( $form, array_keys( $post_submission_conditional_logic_field_types ) );
 				foreach ( $fields as $field ) {
 					$options[ $field->id ] = array(
 						'label'     => $field->label,
 						'value'     => $field->id,
 						'operators' => rgars( $post_submission_conditional_logic_field_types, $field->type . '/operators', array() ),
 					);
 				}
-			}
-
-			if ( function_exists( 'gp_email_validator' ) ) {
-				$email_fields = GFAPI::get_fields_by_type( $form, 'email' );
-				foreach ( $email_fields as $field ) {
-					if ( gp_email_validator()->is_email_validator_field( $field ) ) {
-						$props = array(
-							'free'       => esc_html__( 'Is Free Email', 'gravityforms' ),
-							'disposable' => esc_html__( 'Is Disposable Email', 'gravityforms' ),
-						);
-						foreach ( $props as $prop => $label ) {
-							$options[ "gpev_is_{$prop}_{$field->id}" ] = array(
-								'label'     => sprintf( '%s (%s)', $field->label, $label ),
-								'value'     => "gpev_is_{$prop}_{$field->id}",
-								'operators' => array(
-									'is'    => 'is',
-									'isnot' => 'isNot',
-								),
-								'choices'   => array(
-									array(
-										'text'  => esc_html__( 'Yes', 'gravityforms' ),
-										'value' => '1',
-									),
-									array(
-										'text'  => esc_html__( 'No', 'gravityforms' ),
-										'value' => '0',
-									),
-								),
-							);
-						}
-					}
-				}
+
+				if ( function_exists( 'gp_email_validator' ) ) {
+					$email_fields = GFAPI::get_fields_by_type( $form, 'email' );
+					foreach ( $email_fields as $field ) {
+						if ( gp_email_validator()->is_email_validator_field( $field ) ) {
+							$props = array(
+								'free'       => esc_html__( 'Is Free Email', 'gravityforms' ),
+								'disposable' => esc_html__( 'Is Disposable Email', 'gravityforms' ),
+							);
+							foreach ( $props as $prop => $label ) {
+								$options[ "gpev_is_{$prop}_{$field->id}" ] = array(
+									'label'     => sprintf( '%s (%s)', $field->label, $label ),
+									'value'     => "gpev_is_{$prop}_{$field->id}",
+									'operators' => array(
+										'is'    => 'is',
+										'isnot' => 'isNot',
+									),
+									'choices'   => array(
+										array(
+											'text'  => esc_html__( 'Yes', 'gravityforms' ),
+											'value' => '1',
+										),
+										array(
+											'text'  => esc_html__( 'No', 'gravityforms' ),
+											'value' => '0',
+										),
+									),
+								);
+							}
+						}
+					}
+				}
 			}
 		}

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In gravity-forms/gw-conditional-logic-entry-meta.php around lines 133 to 163,
the GPEV (gp_email_validator) integration block references $form but currently
sits outside the surrounding if ( $form ) conditional, which can cause errors
when $form is null; move the entire gp_email_validator() integration block so it
is inside the existing if ( $form ) { ... } scope (i.e., place lines 133–163
within that if block), preserving all existing logic/indentation and ensuring it
only runs when $form is truthy.

}

$entry_meta = GFFormsModel::get_entry_meta( $form_ids );
Expand Down Expand Up @@ -197,7 +229,7 @@ public function get_payment_status_choices() {

public function set_rule_source_value( $source_value, $rule, $form, $logic, $entry ) {

$keys = array_keys( $this->get_conditional_logic_options() );
$keys = array_keys( $this->get_conditional_logic_options( $form['id'] ) );
$target = $rule['fieldId'];

if ( in_array( $target, $keys ) && $entry ) {
Expand All @@ -206,7 +238,12 @@ public function set_rule_source_value( $source_value, $rule, $form, $logic, $ent
// Fetch the latest from the database.
$entry = GFAPI::get_entry( $entry['id'] );
}
$source_value = rgar( $entry, $rule['fieldId'] );

if ( strpos( $target, 'gpev_is_' ) === 0 ) {
$source_value = $this->get_email_validator_result_value( $entry, $target );
} else {
$source_value = rgar( $entry, $rule['fieldId'] );
}
}

return $source_value;
Expand Down Expand Up @@ -239,6 +276,51 @@ public function get_runtime_entry_meta_keys() {
return apply_filters( 'gwclem_runtime_entry_meta_keys', array( 'payment_status' ) );
}

public function get_email_validator_result_value( $entry, $target ) {

if ( ! preg_match( '/^gpev_is_(free|disposable)_(\d+)$/', $target, $matches ) ) {
return '';
}

$prop = $matches[1];
$field_id = $matches[2];
$services = array( 'basic', 'kickbox', 'zerobounce' );
$result = false;

foreach ( $services as $service ) {
$data = gform_get_meta( $entry['id'], "gpev_{$service}_result_{$field_id}" );
if ( empty( $data ) || empty( $data['metadata'] ) ) {
continue;
}

$meta = $data['metadata'];

if ( $prop === 'free' ) {
if ( isset( $meta['free'] ) ) {
$result = $meta['free'];
} elseif ( isset( $meta['is_free_email'] ) ) {
$result = $meta['is_free_email'];
} elseif ( isset( $meta['free_email'] ) ) {
$result = $meta['free_email'];
}
} elseif ( $prop === 'disposable' ) {
if ( isset( $meta['disposable'] ) ) {
$result = $meta['disposable'];
} elseif ( isset( $meta['is_disposable'] ) ) {
$result = $meta['is_disposable'];
} elseif ( isset( $meta['sub_status'] ) && $meta['sub_status'] === 'disposable' ) {
$result = true;
}
}

if ( $result ) {
break;
}
}

return $result ? '1' : '0';
}

}

function gw_cl_entry_meta() {
Expand Down