summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Pott2018-06-18 08:28:31 (GMT)
committerAlex Pott2018-06-18 08:28:31 (GMT)
commita46c46194d2998f3f6a5c09d387512cc98c7c25c (patch)
treee99753e274efe961301d28a4b28e867ee512245e
parent8b388f07c2fab25ad0a160327b76d4d1c9ee0f2d (diff)
Issue #2935738 by samuel.mortenson, Wim Leers, Berdir: Entity reference field subclasses (such as file and image fields) lose the non-default properties upon denormalization, in both hal_json and json
-rw-r--r--core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php2
-rw-r--r--core/modules/rest/tests/src/Functional/FileUploadResourceTestBase.php4
-rw-r--r--core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php2
-rw-r--r--core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php40
4 files changed, 42 insertions, 6 deletions
diff --git a/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php b/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
index de9fdc7..a9fc7e6 100644
--- a/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
+++ b/core/modules/hal/src/Normalizer/EntityReferenceItemNormalizer.php
@@ -149,7 +149,7 @@ class EntityReferenceItemNormalizer extends FieldItemNormalizer implements UuidR
$target_type = $field_definition->getSetting('target_type');
$id = $this->entityResolver->resolve($this, $data, $target_type);
if (isset($id)) {
- return ['target_id' => $id];
+ return ['target_id' => $id] + array_intersect_key($data, $field_item->getProperties());
}
return NULL;
}
diff --git a/core/modules/rest/tests/src/Functional/FileUploadResourceTestBase.php b/core/modules/rest/tests/src/Functional/FileUploadResourceTestBase.php
index 05aa5ea5..42c7b2c 100644
--- a/core/modules/rest/tests/src/Functional/FileUploadResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/FileUploadResourceTestBase.php
@@ -199,10 +199,6 @@ abstract class FileUploadResourceTestBase extends ResourceTestBase {
$response = $this->request('POST', $entity_test_post_url, $request_options);
$this->assertResourceResponse(201, FALSE, $response);
$this->assertTrue($this->fileStorage->loadUnchanged(1)->isPermanent());
- // @todo Remove this early return in https://www.drupal.org/project/drupal/issues/2935738.
- if (static::$format === 'hal_json') {
- return;
- }
$this->assertSame([
[
'target_id' => '1',
diff --git a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
index 2d3c6f0..4865c90 100644
--- a/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
+++ b/core/modules/serialization/src/Normalizer/EntityReferenceFieldItemNormalizer.php
@@ -78,7 +78,7 @@ class EntityReferenceFieldItemNormalizer extends FieldItemNormalizer {
throw new UnexpectedValueException(sprintf('The field "%s" property "target_type" must be set to "%s" or omitted.', $field_item->getFieldDefinition()->getName(), $target_type));
}
if ($entity = $this->entityRepository->loadEntityByUuid($target_type, $data['target_uuid'])) {
- return ['target_id' => $entity->id()];
+ return ['target_id' => $entity->id()] + array_intersect_key($data, $field_item->getProperties());
}
else {
// Unable to load entity by uuid.
diff --git a/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php b/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php
index 9320d17..96274a6 100644
--- a/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php
+++ b/core/modules/serialization/tests/src/Unit/Normalizer/EntityReferenceFieldItemNormalizerTest.php
@@ -4,12 +4,14 @@ namespace Drupal\Tests\serialization\Unit\Normalizer;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\TypedData\Type\IntegerInterface;
use Drupal\Core\TypedData\TypedDataInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\FieldableEntityInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
+use Drupal\locale\StringInterface;
use Drupal\serialization\Normalizer\EntityReferenceFieldItemNormalizer;
use Drupal\Tests\UnitTestCase;
use Prophecy\Argument;
@@ -237,6 +239,9 @@ class EntityReferenceFieldItemNormalizerTest extends UnitTestCase {
->willReturn($entity)
->shouldBeCalled();
+ $this->fieldItem->getProperties()->willReturn([
+ 'target_id' => $this->prophesize(IntegerInterface::class),
+ ]);
$this->fieldItem->setValue(['target_id' => 'test'])->shouldBeCalled();
$this->assertDenormalize($data);
@@ -260,6 +265,9 @@ class EntityReferenceFieldItemNormalizerTest extends UnitTestCase {
->willReturn($entity)
->shouldBeCalled();
+ $this->fieldItem->getProperties()->willReturn([
+ 'target_id' => $this->prophesize(IntegerInterface::class),
+ ]);
$this->fieldItem->setValue(['target_id' => 'test'])->shouldBeCalled();
$this->assertDenormalize($data);
@@ -361,4 +369,36 @@ class EntityReferenceFieldItemNormalizerTest extends UnitTestCase {
$this->assertSame($context['target_instance'], $denormalized);
}
+ /**
+ * @covers ::constructValue
+ */
+ public function testConstructValueProperties() {
+ $data = [
+ 'target_id' => 'test',
+ 'target_type' => 'test_type',
+ 'target_uuid' => '080e3add-f9d5-41ac-9821-eea55b7b42fb',
+ 'extra_property' => 'extra_value',
+ ];
+
+ $entity = $this->prophesize(FieldableEntityInterface::class);
+ $entity->id()
+ ->willReturn('test')
+ ->shouldBeCalled();
+ $this->entityRepository
+ ->loadEntityByUuid($data['target_type'], $data['target_uuid'])
+ ->willReturn($entity)
+ ->shouldBeCalled();
+
+ $this->fieldItem->getProperties()->willReturn([
+ 'target_id' => $this->prophesize(IntegerInterface::class),
+ 'extra_property' => $this->prophesize(StringInterface::class),
+ ]);
+ $this->fieldItem->setValue([
+ 'target_id' => 'test',
+ 'extra_property' => 'extra_value',
+ ])->shouldBeCalled();
+
+ $this->assertDenormalize($data);
+ }
+
}