From 5a6f295406c84a36bf815555c40bc8d13f78e81d Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Thu, 3 May 2018 23:12:56 +0100 Subject: [PATCH] Issue #2899248 by Sam152: Don't reimplement validation rules for workflow state add/edit forms in ::copyFormValuesToEntity --- .../workflows/src/Form/WorkflowStateAddForm.php | 12 +++++------- .../workflows/src/Form/WorkflowStateEditForm.php | 4 ++++ .../tests/src/Functional/WorkflowUiTest.php | 7 +++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/modules/workflows/src/Form/WorkflowStateAddForm.php b/core/modules/workflows/src/Form/WorkflowStateAddForm.php index 5eb1b9a4c768..1abc8e3df734 100644 --- a/core/modules/workflows/src/Form/WorkflowStateAddForm.php +++ b/core/modules/workflows/src/Form/WorkflowStateAddForm.php @@ -116,15 +116,13 @@ public function exists($state_id) { * The current state of the form. */ protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) { + if (!$form_state->isValidationComplete()) { + // Only do something once form validation is complete. + return; + } /** @var \Drupal\workflows\WorkflowInterface $entity */ $values = $form_state->getValues(); - $type_plugin = $entity->getTypePlugin(); - - // Replicate the validation that Workflow::addState() does internally as the - // form values have not been validated at this point. - if (!$type_plugin->hasState($values['id']) && !preg_match('/[^a-z0-9_]+/', $values['id'])) { - $type_plugin->addState($values['id'], $values['label']); - } + $entity->getTypePlugin()->addState($values['id'], $values['label']); } /** diff --git a/core/modules/workflows/src/Form/WorkflowStateEditForm.php b/core/modules/workflows/src/Form/WorkflowStateEditForm.php index 4fe5f5e55753..7b8b90355ebf 100644 --- a/core/modules/workflows/src/Form/WorkflowStateEditForm.php +++ b/core/modules/workflows/src/Form/WorkflowStateEditForm.php @@ -161,6 +161,10 @@ public function form(array $form, FormStateInterface $form_state) { * The current state of the form. */ protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) { + if (!$form_state->isValidationComplete()) { + // Only do something once form validation is complete. + return; + } /** @var \Drupal\workflows\WorkflowInterface $entity */ $values = $form_state->getValues(); $entity->getTypePlugin()->setStateLabel($values['id'], $values['label']); diff --git a/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php b/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php index 487e28cce082..227ddd769a0c 100644 --- a/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php +++ b/core/modules/workflows/tests/src/Functional/WorkflowUiTest.php @@ -90,12 +90,19 @@ public function testStateMachineNameValidation() { ])->save(); $this->drupalLogin($this->createUser(['administer workflows'])); + $this->drupalPostForm('admin/config/workflow/workflows/manage/test_workflow/add_state', [ 'label' => 'Test State', 'id' => 'Invalid ID', ], 'Save'); $this->assertSession()->statusCodeEquals(200); $this->assertSession()->pageTextContains('The machine-readable name must contain only lowercase letters, numbers, and underscores.'); + + $this->drupalPostForm('admin/config/workflow/workflows/manage/test_workflow/add_transition', [ + 'label' => 'Test Transition', + 'id' => 'Invalid ID', + ], 'Save'); + $this->assertSession()->pageTextContains('The machine-readable name must contain only lowercase letters, numbers, and underscores.'); } /** -- GitLab