Search code examples
phpwordpressformsvalidationgravity-forms-plugin

Validate at least one field to be filled in, Gravity forms


I have been trying to create a custom validation hook for Gravity Forms plugin.

The validation checks that at least one field has been filled in from a set of fields.

Check out the code below, I just can't get it too work. I think it is something to do with the variables for the inputs, even if a field is filled in, the error still shows on each field?

add_filter( 'gform_field_validation_2', function ( $result, $value, $form, $field ) {

    if ( $field->type == 'number') {

        $a = rgar( $value, $field->id . '10' );
        $b = rgar( $value, $field->id . '12' );
        $c = rgar( $value, $field->id . '13' );
        $d = rgar( $value, $field->id . '14' );
        $e = rgar( $value, $field->id . '15' );
        $f = rgar( $value, $field->id . '17' );
        $g = rgar( $value, $field->id . '18' );
        $h = rgar( $value, $field->id . '20' );
        $i = rgar( $value, $field->id . '21' );
        $j = rgar( $value, $field->id . '22' );
        $k = rgar( $value, $field->id . '23' );


        if ( !empty($a) || !empty($b) || !empty($c) || !empty($d) || !empty($e) || !empty($f) || !empty($g) || !empty($h) || !empty($i) || !empty($j) || !empty($k) ) {
          $result['is_valid'] = true;
          $result['message'] ='';
        } else {
          $result['is_valid'] = false;
          $result['message']  = 'Please select a quantity of materials to order';
        }

    }

    return $result;
}, 10, 4 );

Solution

  • So heres a working version (Thanks for the gform_validation hint Francisco R) - Went down a slightly different route, but works perfectly, incase anyone interested in future!

    add_filter( 'gform_validation_2', 'custom_validation_2' );
    function custom_validation_2( $validation_result ) {
    
        // array of field IDs to be checked
        $field_ids = array (10, 12, 13, 14, 15, 17, 18, 20, 21, 23, 22);
    
        // get the form object from the validation result
        $form = $validation_result['form'];
    
        // counter to store how many fields have a value > 0 submitted
        $number_of_fields = 0;
    
        // loop through all the fields to be sure one has a value > 0
        foreach ( $field_ids as $input ) {
            // the rgpost string we are going to check
            $input_id = 'input_' . intval( $input );
    
            // the value that was submitted
            $input_value = rgpost ( $input_id );
    
            if ( $input_value > 0 ) {
                // if any field in the array has a value, we can just continue
                $number_of_fields++;
            } // end if
            else {
                // no value for this input, so continue without incrementing the counter
                continue;
            } // end else
    
        } // end foreach
    
        // check the $number_of_fields and if it is 0 return a validation error
        if ( $number_of_fields == 0 ){
    
            // set the form validation to false
            $validation_result['is_valid'] = false;
    
            // mark all the fields with a validation error
            foreach( $form['fields'] as &$field ) {
    
                // add a validation error to *all* the inputs if none were submitted > 0
                if ( in_array( $field->id, $field_ids ) ) {
                    $field->failed_validation = true;
                    $field->validation_message = 'Please select a quantity of materials to order from one or all of these fields.';
                } // end if
            } // end foreach
    
        } // end if
    
        // assign modified $form object back to the validation result
        $validation_result['form'] = $form;
        return $validation_result;
    
    }