diff --git a/core/modules/layout_builder/src/Form/OverridesEntityForm.php b/core/modules/layout_builder/src/Form/OverridesEntityForm.php index 29f940bdcc..789778fc8f 100644 --- a/core/modules/layout_builder/src/Form/OverridesEntityForm.php +++ b/core/modules/layout_builder/src/Form/OverridesEntityForm.php @@ -198,6 +198,8 @@ class OverridesEntityForm extends ContentEntityForm { '#value' => $this->t('Discard changes'), '#submit' => ['::redirectOnSubmit'], '#redirect' => 'discard_changes', + // Discard is not dependent on form input. + '#limit_validation_errors' => [], ]; // @todo This button should be conditionally displayed, see // https://www.drupal.org/node/2917777. diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php new file mode 100644 index 0000000000..b29b153a56 --- /dev/null +++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php @@ -0,0 +1,107 @@ + 'foo', + 'entity_type' => $entityTypeId, + 'type' => 'string', + ]); + $fieldStorage->save(); + + FieldConfig::create([ + 'field_storage' => $fieldStorage, + 'bundle' => $bundle, + // Expecting required value. + 'required' => TRUE, + ])->save(); + + /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $displayRepository */ + $displayRepository = \Drupal::service('entity_display.repository'); + + // Enable layout builder custom layouts. + $displayRepository->getViewDisplay($entityTypeId, $bundle, 'full') + ->enable() + ->setThirdPartySetting('layout_builder', 'enabled', TRUE) + ->setThirdPartySetting('layout_builder', 'allow_custom', TRUE) + ->save(); + + // Add the form mode and show the field with a constraint. + $formMode = 'layout_builder'; + EntityFormMode::create([ + 'id' => sprintf('%s.%s', $entityTypeId, $formMode), + 'targetEntityType' => $entityTypeId, + ])->save(); + $displayRepository->getFormDisplay($entityTypeId, $bundle, $formMode) + ->setComponent('foo', [ + 'type' => 'string_textfield', + ]) + ->save(); + + $user = $this->drupalCreateUser([ + 'view test entity', + 'configure any layout', + "configure all $entityTypeId $bundle layout overrides", + ]); + $this->drupalLogin($user); + + $entity = EntityTest::create(); + $entity->save(); + + $urlParameters = ['entity_test' => $entity->id()]; + $url = Url::fromRoute('layout_builder.overrides.entity_test.view', $urlParameters); + + $session = $this->assertSession(); + + // When submitting the form normally, a validation error should be shown. + $this->drupalGet($url); + $session->fieldExists('foo[0][value]'); + $session->elementAttributeContains('named', ['field', 'foo[0][value]'], 'required', 'required'); + $this->drupalPostForm(NULL, [], 'Save layout'); + $session->pageTextContains('foo field is required.'); + + // When Discarding changes, a validation error will not be shown. + // Reload the form for fresh state. + $this->drupalGet($url); + $this->drupalPostForm(NULL, [], 'Discard changes'); + $session->pageTextNotContains('foo field is required.'); + $session->addressEquals(Url::fromRoute('layout_builder.overrides.entity_test.discard_changes', $urlParameters)->toString()); + } + +}