From 7340fee0c26c2b498979e138ef733afffa20b91c Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sun, 12 Oct 2014 21:52:45 +0100
Subject: [PATCH] Issue #2349605 by larowlan: Fixed EntityReferenceItem is
 fragile about entity save order.

---
 .../Field/FieldType/EntityReferenceItem.php   | 10 +++++++--
 .../src/Tests/EntityReferenceItemTest.php     | 21 +++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
index 4665f1c2551b..63c9a668ff0c 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Field\Plugin\Field\FieldType;
 
+use Drupal\Core\Entity\Entity;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\TypedData\EntityDataDefinition;
 use Drupal\Core\Field\FieldDefinitionInterface;
@@ -193,8 +194,7 @@ public function isEmpty() {
     if ($target_id !== NULL) {
       return FALSE;
     }
-    // Allow auto-create entities.
-    if ($this->hasUnsavedEntity()) {
+    if ($this->entity && $this->entity instanceof Entity) {
       return FALSE;
     }
     return TRUE;
@@ -206,6 +206,12 @@ public function isEmpty() {
   public function preSave() {
     if ($this->hasUnsavedEntity()) {
       $this->entity->save();
+    }
+    // Handle the case where an unsaved entity was directly set using the public
+    // 'entity' property and then saved before this entity. In this case
+    // ::hasUnsavedEntity() will return FALSE but $this->target_id will still be
+    // empty.
+    if (empty($this->target_id) && $this->entity) {
       $this->target_id = $this->entity->id();
     }
   }
diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceItemTest.php b/core/modules/entity_reference/src/Tests/EntityReferenceItemTest.php
index d34a6b2ce190..4191d51cfe67 100644
--- a/core/modules/entity_reference/src/Tests/EntityReferenceItemTest.php
+++ b/core/modules/entity_reference/src/Tests/EntityReferenceItemTest.php
@@ -168,4 +168,25 @@ public function testConfigEntityReferenceItem() {
     $entity->save();
   }
 
+  /**
+   * Test saving order sequence doesn't matter.
+   */
+  public function testEntitySaveOrder() {
+    // The term entity is unsaved here.
+    $term = entity_create('taxonomy_term', array(
+      'name' => $this->randomMachineName(),
+      'vid' => $this->term->bundle(),
+      'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+    ));
+    $entity = entity_create('entity_test');
+    // Now assign the unsaved term to the field.
+    $entity->field_test_taxonomy_term->entity = $term;
+    $entity->name->value = $this->randomMachineName();
+    // Now save the term.
+    $term->save();
+    // And then the entity.
+    $entity->save();
+    $this->assertEqual($entity->field_test_taxonomy_term->entity->id(), $term->id());
+  }
+
 }
-- 
GitLab