验证至少一个要填写的字段,重力形式

时间:2016-05-03 09:57:07

标签: php wordpress forms validation gravity-forms-plugin

我一直在尝试为Gravity Forms插件创建一个自定义验证钩子。

验证检查至少一个字段已从一组字段中填写。

查看下面的代码,我无法理解它。我认为它与输入的变量有关,即使填写了一个字段,错误仍会显示在每个字段上?

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 );

3 个答案:

答案 0 :(得分:1)

我认为你可能应该使用类型"单选按钮"。

无论如何,如果你的表格有几个"数字"字段,您需要验证其中至少有一个已填写,然后您应该使用gform_validation过滤器,因为您要验证整个表单,而不仅仅是单个字段。

提示:将自定义css类添加到组中的每个字段以标识它们。例如" validate-quantity"。

add_filter('gform_validation_2', 'quantity_validation', 1, 4);
function quantity_validation($validation_result) {
    if ($validation_result['is_valid']) {
        $valid=false;
        $form = $validation_result['form'];
        foreach( $form['fields'] as &$field ) {
            if ( strpos( $field->cssClass, 'validate-quantity' ) === false ) {
                continue;
            }
            $field_value = rgpost( "input_{$field['id']}" );
            if (!empty($field_value)) {
               $valid=true;
               break;
            }
        }

        if (!$valid) {
            $field["failed_validation"] = true;
            $field["validation_message"] = 'Please select a quantity of materials to order';
            $validation_result['form'] = $form;
        }

    }
    return $validation_result;
}

答案 1 :(得分:0)

看起来你应该将你的if子句改为:

if ( empty($a) || empty($b) || empty($c) || empty($d) || empty($e) || empty($f) || empty($g) || empty($h) || empty($i) || empty($j) || empty($k) ) {

验证是否至少选择了一个选项。

要跳过非目标字段,请在复杂之前添加以下代码(如果符合上述内容):

$target_fields = array('name_1', 'name_2');
if (!in_array($field, $target_fields)) {
    $result['is_valid'] = true;
    $result['message']  = '';
}

答案 2 :(得分:0)

所以这是一个正在运行的版本(感谢gform_validation暗示Francisco R) - 走了一条略有不同的路线,但是效果很好,也包括对未来感兴趣的人!

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;

}