3 namespace Drupal\hal\Normalizer;
5 use Drupal\Component\Utility\NestedArray;
6 use Drupal\serialization\Normalizer\FieldNormalizer as SerializationFieldNormalizer;
9 * Converts the Drupal field structure to HAL array structure.
11 class FieldNormalizer extends SerializationFieldNormalizer {
16 protected $format = ['hal_json'];
21 public function normalize($field_items, $format = NULL, array $context = []) {
22 $normalized_field_items = [];
24 // Get the field definition.
25 $entity = $field_items->getEntity();
26 $field_name = $field_items->getName();
27 $field_definition = $field_items->getFieldDefinition();
29 // If this field is not translatable, it can simply be normalized without
30 // separating it into different translations.
31 if (!$field_definition->isTranslatable()) {
32 $normalized_field_items = $this->normalizeFieldItems($field_items, $format, $context);
34 // Otherwise, the languages have to be extracted from the entity and passed
35 // in to the field item normalizer in the context. The langcode is appended
36 // to the field item values.
38 foreach ($entity->getTranslationLanguages() as $language) {
39 $context['langcode'] = $language->getId();
40 $translation = $entity->getTranslation($language->getId());
41 $translated_field_items = $translation->get($field_name);
42 $normalized_field_items = array_merge($normalized_field_items, $this->normalizeFieldItems($translated_field_items, $format, $context));
46 // Merge deep so that links set in entity reference normalizers are merged
47 // into the links property.
48 return NestedArray::mergeDeepArray($normalized_field_items);
52 * Helper function to normalize field items.
54 * @param \Drupal\Core\Field\FieldItemListInterface $field_items
55 * The field item list object.
56 * @param string $format
58 * @param array $context
62 * The array of normalized field items.
64 protected function normalizeFieldItems($field_items, $format, $context) {
65 $normalized_field_items = [];
66 if (!$field_items->isEmpty()) {
67 foreach ($field_items as $field_item) {
68 $normalized_field_items[] = $this->serializer->normalize($field_item, $format, $context);
71 return $normalized_field_items;