Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
15.38% |
4 / 26 |
| FieldItemNormalizer | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
70.58 | |
15.38% |
4 / 26 |
| normalize | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| denormalize | |
0.00% |
0 / 1 |
13.30 | |
30.77% |
4 / 13 |
|||
| constructValue | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| createTranslatedInstance | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\hal\Normalizer\FieldItemNormalizer. | |
| */ | |
| namespace Drupal\hal\Normalizer; | |
| use Drupal\Core\Field\FieldItemInterface; | |
| use Symfony\Component\Serializer\Exception\InvalidArgumentException; | |
| /** | |
| * Converts the Drupal field item object structure to HAL array structure. | |
| */ | |
| class FieldItemNormalizer extends NormalizerBase { | |
| /** | |
| * The interface or class that this Normalizer supports. | |
| * | |
| * @var string | |
| */ | |
| protected $supportedInterfaceOrClass = 'Drupal\Core\Field\FieldItemInterface'; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function normalize($field_item, $format = NULL, array $context = array()) { | |
| $values = $field_item->toArray(); | |
| if (isset($context['langcode'])) { | |
| $values['lang'] = $context['langcode']; | |
| } | |
| // The values are wrapped in an array, and then wrapped in another array | |
| // keyed by field name so that field items can be merged by the | |
| // FieldNormalizer. This is necessary for the EntityReferenceItemNormalizer | |
| // to be able to place values in the '_links' array. | |
| $field = $field_item->getParent(); | |
| return array( | |
| $field->getName() => array($values), | |
| ); | |
| } | |
| /** | |
| * {@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 FieldItemNormalizer'); | |
| } | |
| if ($context['target_instance']->getParent() == NULL) { | |
| throw new InvalidArgumentException('The field item passed in via $context[\'target_instance\'] must have a parent set.'); | |
| } | |
| $field_item = $context['target_instance']; | |
| // If this field is translatable, we need to create a translated instance. | |
| if (isset($data['lang'])) { | |
| $langcode = $data['lang']; | |
| unset($data['lang']); | |
| $field_definition = $field_item->getFieldDefinition(); | |
| if ($field_definition->isTranslatable()) { | |
| $field_item = $this->createTranslatedInstance($field_item, $langcode); | |
| } | |
| } | |
| $field_item->setValue($this->constructValue($data, $context)); | |
| return $field_item; | |
| } | |
| /** | |
| * Build the field item value using the incoming data. | |
| * | |
| * @param $data | |
| * The incoming data for this field item. | |
| * @param $context | |
| * The context passed into the Normalizer. | |
| * | |
| * @return mixed | |
| * The value to use in Entity::setValue(). | |
| */ | |
| protected function constructValue($data, $context) { | |
| return $data; | |
| } | |
| /** | |
| * Get a translated version of the field item instance. | |
| * | |
| * To indicate that a field item applies to one translation of an entity and | |
| * not another, the property path must originate with a translation of the | |
| * entity. This is the reason for using target_instances, from which the | |
| * property path can be traversed up to the root. | |
| * | |
| * @param \Drupal\Core\Field\FieldItemInterface $field_item | |
| * The untranslated field item instance. | |
| * @param $langcode | |
| * The langcode. | |
| * | |
| * @return \Drupal\Core\Field\FieldItemInterface | |
| * The translated field item instance. | |
| */ | |
| protected function createTranslatedInstance(FieldItemInterface $item, $langcode) { | |
| // Remove the untranslated item that was created for the default language | |
| // by FieldNormalizer::denormalize(). | |
| $items = $item->getParent(); | |
| $delta = $item->getName(); | |
| unset($items[$delta]); | |
| // 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); | |
| $field_name = $item->getFieldDefinition()->getName(); | |
| return $entity_translation->get($field_name)->appendItem(); | |
| } | |
| } |