'textfield', '#title' => 'One', '#required' => TRUE, ]; $form['two'] = [ '#type' => 'textfield', '#title' => 'Two', '#required' => TRUE, ]; $form['actions'] = ['#type' => 'actions']; $user_input = $form_state->getUserInput(); $form['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', '#limit_validation_errors' => [ [$user_input['section']], ], // Required for #limit_validation_errors. '#submit' => [[$this, 'submitForm']], ]; return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { // Verify that the only submit button was recognized as triggering_element. $this->assertEqual($form['actions']['submit']['#array_parents'], $form_state->getTriggeringElement()['#array_parents']); } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { } /** * Tests that #limit_validation_errors of the only submit button takes effect. */ public function testLimitValidationErrors() { // Programmatically submit the form. $form_state = new FormState(); $form_state->setValue('section', 'one'); $form_builder = $this->container->get('form_builder'); $form_builder->submitForm($this, $form_state); // Verify that only the specified section was validated. $errors = $form_state->getErrors(); $this->assertTrue(isset($errors['one']), "Section 'one' was validated."); $this->assertFalse(isset($errors['two']), "Section 'two' was not validated."); // Verify that there are only values for the specified section. $this->assertTrue($form_state->hasValue('one'), "Values for section 'one' found."); $this->assertFalse($form_state->hasValue('two'), "Values for section 'two' not found."); } }