Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
CRAP | |
40.00% |
4 / 10 |
FieldNormalizer | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
31.60 | |
40.00% |
4 / 10 |
normalize | |
100.00% |
1 / 1 |
3 | |
100.00% |
0 / 0 |
|||
denormalize | |
0.00% |
0 / 1 |
7.46 | |
40.00% |
4 / 10 |
|||
normalizeFieldItems | |
100.00% |
1 / 1 |
3 | |
100.00% |
0 / 0 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\hal\Normalizer\FieldNormalizer. | |
*/ | |
namespace Drupal\hal\Normalizer; | |
use Drupal\Component\Utility\NestedArray; | |
use Symfony\Component\Serializer\Exception\InvalidArgumentException; | |
/** | |
* Converts the Drupal field structure to HAL array structure. | |
*/ | |
class FieldNormalizer extends NormalizerBase { | |
/** | |
* The interface or class that this Normalizer supports. | |
* | |
* @var string | |
*/ | |
protected $supportedInterfaceOrClass = 'Drupal\Core\Field\FieldItemListInterface'; | |
/** | |
* {@inheritdoc} | |
*/ | |
public function normalize($field, $format = NULL, array $context = array()) { | |
$normalized_field_items = array(); | |
// Get the field definition. | |
$entity = $field->getEntity(); | |
$field_name = $field->getName(); | |
$field_definition = $field->getFieldDefinition(); | |
// If this field is not translatable, it can simply be normalized without | |
// separating it into different translations. | |
if (!$field_definition->isTranslatable()) { | |
$normalized_field_items = $this->normalizeFieldItems($field, $format, $context); | |
} | |
// Otherwise, the languages have to be extracted from the entity and passed | |
// in to the field item normalizer in the context. The langcode is appended | |
// to the field item values. | |
else { | |
foreach ($entity->getTranslationLanguages() as $language) { | |
$context['langcode'] = $language->getId(); | |
$translation = $entity->getTranslation($language->getId()); | |
$translated_field = $translation->get($field_name); | |
$normalized_field_items = array_merge($normalized_field_items, $this->normalizeFieldItems($translated_field, $format, $context)); | |
} | |
} | |
// Merge deep so that links set in entity reference normalizers are merged | |
// into the links property. | |
$normalized = NestedArray::mergeDeepArray($normalized_field_items); | |
return $normalized; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function denormalize($data, $class, $format = NULL, array $context = array()) { | |
if (!isset($context['target_instance'])) { | |
throw new InvalidArgumentException('$context[\'target_instance\'] must be set to denormalize with the FieldNormalizer'); | |
} | |
if ($context['target_instance']->getParent() == NULL) { | |
throw new InvalidArgumentException('The field passed in via $context[\'target_instance\'] must have a parent set.'); | |
} | |
$items = $context['target_instance']; | |
$item_class = $items->getItemDefinition()->getClass(); | |
foreach ($data as $item_data) { | |
// Create a new item and pass it as the target for the unserialization of | |
// $item_data. Note: if $item_data is about a different language than the | |
// default, FieldItemNormalizer::denormalize() will dismiss this item and | |
// create a new one for the right language. | |
$context['target_instance'] = $items->appendItem(); | |
$this->serializer->denormalize($item_data, $item_class, $format, $context); | |
} | |
return $items; | |
} | |
/** | |
* Helper function to normalize field items. | |
* | |
* @param \Drupal\Core\Field\FieldItemListInterface $field | |
* The field object. | |
* @param string $format | |
* The format. | |
* @param array $context | |
* The context array. | |
* | |
* @return array | |
* The array of normalized field items. | |
*/ | |
protected function normalizeFieldItems($field, $format, $context) { | |
$normalized_field_items = array(); | |
if (!$field->isEmpty()) { | |
foreach ($field as $field_item) { | |
$normalized_field_items[] = $this->serializer->normalize($field_item, $format, $context); | |
} | |
} | |
return $normalized_field_items; | |
} | |
} |