diff --git a/src/Normalizer/EntityNormalizerTrait.php b/src/Normalizer/EntityNormalizerTrait.php index 1cd343d5d3aefcd524dc5bba30b30710c44f6062..4ebc6d1a11110b0834c3b4d75ba5430e86f4fea0 100644 --- a/src/Normalizer/EntityNormalizerTrait.php +++ b/src/Normalizer/EntityNormalizerTrait.php @@ -21,6 +21,11 @@ trait EntityNormalizerTrait { * The modified input data. */ protected function prepareInput(array $data, ResourceType $resource_type) { + /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $field_storage_definitions */ + $field_storage_definitions = \Drupal::service('entity_field.manager') + ->getFieldStorageDefinitions( + $resource_type->getEntityTypeId() + ); $data_internal = []; /** @var \Drupal\jsonapi_extras\ResourceType\ConfigurableResourceType $resource_type */ // Translate the public fields into the entity fields. @@ -31,7 +36,19 @@ trait EntityNormalizerTrait { } $internal_name = $resource_type->getInternalName($public_field_name); $enhancer = $resource_type->getFieldEnhancer($public_field_name, 'publicName'); - $field_value = $enhancer ? $enhancer->prepareForInput($field_value) : $field_value; + + if (isset($field_storage_definitions[$internal_name])) { + $field_storage_definition = $field_storage_definitions[$internal_name]; + if ($field_storage_definition->getCardinality() === 1) { + $field_value = $enhancer ? $enhancer->prepareForInput($field_value) : $field_value; + } + else { + foreach ($field_value as $key => $individual_field_value) { + $field_value[$key] = $enhancer ? $enhancer->prepareForInput($individual_field_value) : $individual_field_value; + } + } + } + $data_internal[$internal_name] = $field_value; }