function FormBuilderTest::testTriggeringElement

Tests the detection of the triggering element.

File

core/tests/Drupal/Tests/Core/Form/FormBuilderTest.php, line 1008

Class

FormBuilderTest
@coversDefaultClass \Drupal\Core\Form\FormBuilder[[api-linebreak]] @group Form

Namespace

Drupal\Tests\Core\Form

Code

public function testTriggeringElement() : void {
  $form_arg = 'Drupal\\Tests\\Core\\Form\\TestForm';
  // No triggering element.
  $form_state = new FormState();
  $this->formBuilder
    ->buildForm($form_arg, $form_state);
  $this->assertNull($form_state->getTriggeringElement());
  // When no op is provided, default to the first button element.
  $form_state = new FormState();
  $form_state->setMethod('GET');
  $form_state->setUserInput([
    'form_id' => 'test_form',
  ]);
  $this->formBuilder
    ->buildForm($form_arg, $form_state);
  $triggeringElement = $form_state->getTriggeringElement();
  $this->assertIsArray($triggeringElement);
  $this->assertSame('op', $triggeringElement['#name']);
  $this->assertSame('Submit', $triggeringElement['#value']);
  // A single triggering element.
  $form_state = new FormState();
  $form_state->setMethod('GET');
  $form_state->setUserInput([
    'form_id' => 'test_form',
    'op' => 'Submit',
  ]);
  $this->formBuilder
    ->buildForm($form_arg, $form_state);
  $triggeringElement = $form_state->getTriggeringElement();
  $this->assertIsArray($triggeringElement);
  $this->assertSame('op', $triggeringElement['#name']);
  // A different triggering element.
  $form_state = new FormState();
  $form_state->setMethod('GET');
  $form_state->setUserInput([
    'form_id' => 'test_form',
    'other_action' => 'Other action',
  ]);
  $this->formBuilder
    ->buildForm($form_arg, $form_state);
  $triggeringElement = $form_state->getTriggeringElement();
  $this->assertIsArray($triggeringElement);
  $this->assertSame('other_action', $triggeringElement['#name']);
  // Two triggering elements.
  $form_state = new FormState();
  $form_state->setMethod('GET');
  $form_state->setUserInput([
    'form_id' => 'test_form',
    'op' => 'Submit',
    'other_action' => 'Other action',
  ]);
  $this->formBuilder
    ->buildForm($form_arg, $form_state);
  // Verify that only the first triggering element is respected.
  $triggeringElement = $form_state->getTriggeringElement();
  $this->assertIsArray($triggeringElement);
  $this->assertSame('op', $triggeringElement['#name']);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.