diff --git a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php index 0c2ee9ed4d..b5f37d74c4 100644 --- a/core/modules/hal/src/Normalizer/FieldItemNormalizer.php +++ b/core/modules/hal/src/Normalizer/FieldItemNormalizer.php @@ -2,6 +2,7 @@ namespace Drupal\hal\Normalizer; +use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\Field\FieldItemInterface; use Symfony\Component\Serializer\Exception\InvalidArgumentException; @@ -127,9 +128,43 @@ protected function createTranslatedInstance(FieldItemInterface $item, $langcode) // Instead, create a new item for the entity in the requested language. $entity = $item->getEntity(); - $entity_translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode); + // Get the translated entity, or create it if it does not exist. + $entity_translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $this->createTranslatedEntity($entity, $langcode); $field_name = $item->getFieldDefinition()->getName(); - return $entity_translation->get($field_name)->appendItem(); + $field = $entity_translation->get($field_name); + + // Append an item only if the field is empty or allows multiple values. + if ($field->isEmpty() || $item->getFieldDefinition()->getFieldStorageDefinition()->isMultiple()) { + return $field->appendItem(); + } + return $field->first(); + } + + /** + * Create an empty entity translation to fill with field data. + * + * @param \Drupal\Core\Entity\FieldableEntityInterface $entity + * The untranslated entity. + * @param string $langcode + * The langcode. + * + * @return \Drupal\Core\Entity\FieldableEntityInterface + * The translated entity. + */ + protected function createTranslatedEntity(FieldableEntityInterface $entity, $langcode) { + // Create a new translation. + /** @var \Drupal\Core\TypedData\TranslatableInterface $entity */ + /** @var \Drupal\Core\Entity\FieldableEntityInterface $entity_translation */ + $entity_translation = $entity->addTranslation($langcode); + + // Remove all default values, except for the langcode. + $translated_fields = $entity_translation->getTranslatableFields(FALSE); + unset($translated_fields['langcode']); + foreach ($translated_fields as $field) { + $field->setValue([]); + } + + return $entity_translation; } }