Commit 7340fee0 authored by alexpott's avatar alexpott
Browse files

Issue #2349605 by larowlan: Fixed EntityReferenceItem is fragile about entity save order.

parent c2ac32c9
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
namespace Drupal\Core\Field\Plugin\Field\FieldType; namespace Drupal\Core\Field\Plugin\Field\FieldType;
use Drupal\Core\Entity\Entity;
use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\TypedData\EntityDataDefinition; use Drupal\Core\Entity\TypedData\EntityDataDefinition;
use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldDefinitionInterface;
...@@ -193,8 +194,7 @@ public function isEmpty() { ...@@ -193,8 +194,7 @@ public function isEmpty() {
if ($target_id !== NULL) { if ($target_id !== NULL) {
return FALSE; return FALSE;
} }
// Allow auto-create entities. if ($this->entity && $this->entity instanceof Entity) {
if ($this->hasUnsavedEntity()) {
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
...@@ -206,6 +206,12 @@ public function isEmpty() { ...@@ -206,6 +206,12 @@ public function isEmpty() {
public function preSave() { public function preSave() {
if ($this->hasUnsavedEntity()) { if ($this->hasUnsavedEntity()) {
$this->entity->save(); $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(); $this->target_id = $this->entity->id();
} }
} }
......
...@@ -168,4 +168,25 @@ public function testConfigEntityReferenceItem() { ...@@ -168,4 +168,25 @@ public function testConfigEntityReferenceItem() {
$entity->save(); $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());
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment