Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 82 |
EntityReferenceFieldItemList | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
506 | |
0.00% |
0 / 82 |
getConstraints | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
referencedEntities | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 24 |
|||
processDefaultValue | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 34 |
|||
defaultValuesFormSubmit | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 19 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Field\EntityReferenceFieldItemList. | |
*/ | |
namespace Drupal\Core\Field; | |
use Drupal\Core\Entity\FieldableEntityInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
/** | |
* Defines a item list class for entity reference fields. | |
*/ | |
class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getConstraints() { | |
$constraints = parent::getConstraints(); | |
$constraint_manager = $this->getTypedDataManager()->getValidationConstraintManager(); | |
$constraints[] = $constraint_manager->create('ValidReference', []); | |
return $constraints; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function referencedEntities() { | |
if (empty($this->list)) { | |
return array(); | |
} | |
// Collect the IDs of existing entities to load, and directly grab the | |
// "autocreate" entities that are already populated in $item->entity. | |
$target_entities = $ids = array(); | |
foreach ($this->list as $delta => $item) { | |
if ($item->target_id !== NULL) { | |
$ids[$delta] = $item->target_id; | |
} | |
elseif ($item->hasNewEntity()) { | |
$target_entities[$delta] = $item->entity; | |
} | |
} | |
// Load and add the existing entities. | |
if ($ids) { | |
$target_type = $this->getFieldDefinition()->getSetting('target_type'); | |
$entities = \Drupal::entityManager()->getStorage($target_type)->loadMultiple($ids); | |
foreach ($ids as $delta => $target_id) { | |
if (isset($entities[$target_id])) { | |
$target_entities[$delta] = $entities[$target_id]; | |
} | |
} | |
// Ensure the returned array is ordered by deltas. | |
ksort($target_entities); | |
} | |
return $target_entities; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function processDefaultValue($default_value, FieldableEntityInterface $entity, FieldDefinitionInterface $definition) { | |
$default_value = parent::processDefaultValue($default_value, $entity, $definition); | |
if ($default_value) { | |
// Convert UUIDs to numeric IDs. | |
$uuids = array(); | |
foreach ($default_value as $delta => $properties) { | |
if (isset($properties['target_uuid'])) { | |
$uuids[$delta] = $properties['target_uuid']; | |
} | |
} | |
if ($uuids) { | |
$target_type = $definition->getSetting('target_type'); | |
$entity_ids = \Drupal::entityQuery($target_type) | |
->condition('uuid', $uuids, 'IN') | |
->execute(); | |
$entities = \Drupal::entityManager() | |
->getStorage($target_type) | |
->loadMultiple($entity_ids); | |
$entity_uuids = array(); | |
foreach ($entities as $id => $entity) { | |
$entity_uuids[$entity->uuid()] = $id; | |
} | |
foreach ($uuids as $delta => $uuid) { | |
if (isset($entity_uuids[$uuid])) { | |
$default_value[$delta]['target_id'] = $entity_uuids[$uuid]; | |
unset($default_value[$delta]['target_uuid']); | |
} | |
else { | |
unset($default_value[$delta]); | |
} | |
} | |
} | |
// Ensure we return consecutive deltas, in case we removed unknown UUIDs. | |
$default_value = array_values($default_value); | |
} | |
return $default_value; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) { | |
$default_value = parent::defaultValuesFormSubmit($element, $form, $form_state); | |
// Convert numeric IDs to UUIDs to ensure config deployability. | |
$ids = array(); | |
foreach ($default_value as $delta => $properties) { | |
if (isset($properties['entity']) && $properties['entity']->isNew()) { | |
// This may be a newly created term. | |
$properties['entity']->save(); | |
$default_value[$delta]['target_id'] = $properties['entity']->id(); | |
unset($default_value[$delta]['entity']); | |
} | |
$ids[] = $default_value[$delta]['target_id']; | |
} | |
$entities = \Drupal::entityManager() | |
->getStorage($this->getSetting('target_type')) | |
->loadMultiple($ids); | |
foreach ($default_value as $delta => $properties) { | |
unset($default_value[$delta]['target_id']); | |
$default_value[$delta]['target_uuid'] = $entities[$properties['target_id']]->uuid(); | |
} | |
return $default_value; | |
} | |
} |