Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Gravity Forms gform_validation to ensure at least one of email or phone are entered

I'm a designer rather than a developer.

I'm using Gravity Forms. I have a simple Gravity Form:

  • [name]
  • [phone]
  • [email]
  • [message]

I'd like to ensure at least one of [phone] or [email] have been entered, rather than requiring both to be filled in.

Gravity Forms support say I can use gform_validation but I don't know how to build the code to validate the form such that if both [phone] and [email] are empty a message is displayed: please enter either phone or email.

Help appreciated.

like image 329
Steve Avatar asked Jul 18 '16 10:07

Steve


2 Answers

In my opinion, it might be easier to do it this way:

  1. Verify that one of phone or email inputs is filled by submitting the input data to a script. It could be JS or a PHP script. This can be done easily by using logical operators to check if both are empty.
  2. Then use https://www.gravityhelp.com/documentation/article/gform_validation/#2-send-entry-data-to-third-party
like image 70
theabhinavdas Avatar answered Sep 18 '22 16:09

theabhinavdas


For a singular form, using ID's to require atleast 1 of 2 fields being filled

This works great on smaller sites who only have 1 Gravity Form with an email field and phone field. Easily customizable. Most of the code is explained with comments.

    <?php
    // 1 = ID of form
    add_filter( 'gform_validation_1', 'custom_validation' );
    function custom_validation( $validation_result ) {
        $form = $validation_result['form'];
        // Our desired input fields
        $phone = rgpost( 'input_6' );
        $email = rgpost( 'input_7' );

        // Fields that must be empty
        if ( empty( $phone ) && empty( $email )) {

            // Looping through the fields
            foreach( $form['fields'] as &$field ) {

                // Finds the field with ID of 7
                // This is the field where the validation message will appear, can add multiple inbetween with ||-operator
            if ( $field->id == '7' /*|| $field->id == '6'*/ ) {
                    $field->failed_validation = true;
                    $field->validation_message = 'Please enter either an email address or phone number.';
                    $validation_result['is_valid'] = false;
                }
            }
        }
        // Assign modified $form object back to the validation result
        $validation_result['form'] = $form;
        return $validation_result;
    }
    ?>

Dynamic script that will run on all forms with input type="email" & input type="tel"

This works great on larger sites with multiple Gravity Forms. The script below will affect all Gravity Forms. Code is explained with comments.

    <?php
    add_filter( 'gform_validation', 'custom_validation' );
    function custom_validation( $validation_result ) {
        $form = $validation_result['form'];

        // Finds current page
        $current_page = rgpost( 'gform_source_page_number_' . $form['id'] ) ? rgpost( 'gform_source_page_number_' . $form['id'] ) : 1;

        // Initiated when $current_page is true
        if ( $current_page ) {
            // Loops through all fields
            foreach( $form['fields'] as &$field ) {
                // Input types
                $field_phone = $field["type"] == 'phone';
                $field_email = $field["type"] == 'email';
                // Accessing field value with rgpost()
                $field_value = rgpost("input_{$field['id']}");

                if ( $field_phone ) {
                    // Assigning the field value of field type phone
                    $field_phone_type = $field_value;
                }

                if ( $field_email ) {
                    // Assigning the field value of field type email
                    $field_email_type = $field_value;

                    // Only runs if theres both a field type email AND field type phone
                    if (isset( $field_email_type ) && isset( $field_phone_type )) {
                        // If both the email and phone fields are empty
                        if ( empty( $field_phone_type ) && empty( $field_email_type )) {
                            // Validation message is applied to $field_email field only - can be modified to be both
                            $validation_result['is_valid'] = false;
                            $field->failed_validation = true;
                            $field->validation_message = 'Please enter either an email address or phone number.';
                        }
                    }
                }
            }
        }

        // Assign modified $form back to the validation result
        $validation_result['form'] = $form;
        return $validation_result;
    }
    ?>
like image 41
Sigurd Mazanti Avatar answered Sep 18 '22 16:09

Sigurd Mazanti