diff --git a/integrations/ninja-forms/class-field.php b/integrations/ninja-forms/class-field.php
index ec8fcd22..adf3567f 100755
--- a/integrations/ninja-forms/class-field.php
+++ b/integrations/ninja-forms/class-field.php
@@ -62,6 +62,30 @@ public function admin_form_element($id, $value)
return "";
}
+ /**
+ * Validate the field value.
+ *
+ * Overrides parent to handle checkbox-specific required validation,
+ * since checkboxes submit '0' when unchecked which the parent considers valid.
+ *
+ * @since 4.9
+ *
+ * @param array $field The field data.
+ * @param array $data The form data.
+ * @return array Array of validation errors, empty if valid.
+ */
+ public function validate($field, $data)
+ {
+ $errors = parent::validate($field, $data);
+
+ if (isset($field['required']) && 1 == intval($field['required']) && empty($field['value'])) {
+ $errors['slug'] = 'required-error';
+ $errors['message'] = esc_html__('This field is required.', 'mailchimp-for-wp');
+ }
+
+ return $errors;
+ }
+
/**
* Custom Columns
* Creates what is displayed in the columns on the submissions page.
diff --git a/tests/NinjaFormsValidationTest.php b/tests/NinjaFormsValidationTest.php
new file mode 100644
index 00000000..d056afdb
--- /dev/null
+++ b/tests/NinjaFormsValidationTest.php
@@ -0,0 +1,100 @@
+ 1,
+ 'value' => 0,
+ ];
+ $form_data = [];
+
+ $errors = $field->validate($field_data, $form_data);
+
+ $this->assertIsArray($errors);
+ $this->assertArrayHasKey('slug', $errors, 'Error slug should be present');
+ $this->assertEquals('required-error', $errors['slug']);
+ }
+
+ public function testRequiredValidationPassesOnChecked()
+ {
+ $field = new MC4WP_Ninja_Forms_Field();
+
+ $field_data = [
+ 'required' => 1,
+ 'value' => 1,
+ ];
+ $form_data = [];
+
+ $errors = $field->validate($field_data, $form_data);
+
+ $this->assertEmpty($errors, 'Validation should pass for required checked field');
+ }
+
+ public function testOptionalValidationPassesOnUnchecked()
+ {
+ $field = new MC4WP_Ninja_Forms_Field();
+
+ $field_data = [
+ 'required' => 0,
+ 'value' => 0,
+ ];
+ $form_data = [];
+
+ $errors = $field->validate($field_data, $form_data);
+
+ $this->assertEmpty($errors, 'Validation should pass for optional unchecked field');
+ }
+}