Commit 7340fee0 authored by alexpott's avatar alexpott

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

parent c2ac32c9
......@@ -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();
}
}
......
......@@ -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());
}
}
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