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