Skip to content
Snippets Groups Projects

Resolve #3503805 "Add documentation to"

Files
5
@@ -3,7 +3,9 @@
namespace Drupal\entity_usage\Plugin\EntityUsage\Track;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\entity_usage\EntityUsageTrackBase;
use Drupal\entity_usage\EntityUsageTrackMultipleLoadInterface;
/**
* Tracks usage of entities related in dynamic_entity_reference fields.
@@ -15,31 +17,60 @@ use Drupal\entity_usage\EntityUsageTrackBase;
* field_types = {"dynamic_entity_reference"},
* )
*/
class DynamicEntityReference extends EntityUsageTrackBase {
class DynamicEntityReference extends EntityUsageTrackBase implements EntityUsageTrackMultipleLoadInterface {
/**
* {@inheritdoc}
*/
public function getTargetEntities(FieldItemInterface $item) {
/** @var \Drupal\dynamic_entity_reference\Plugin\Field\FieldType\DynamicEntityReferenceItem $item */
$target_id = $item->get('target_id')->getValue();
$target_type_id = $item->get('target_type')->getValue();
if (empty($target_id) || empty($target_type_id)) {
return [];
/** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */
return $this->doGetTargetEntities($item->getParent(), $item);
}
/**
* {@inheritdoc}
*/
public function getTargetEntitiesFromField(FieldItemListInterface $field): array {
return $this->doGetTargetEntities($field);
}
/**
* Retrieve the target entity(ies) from a field.
*
* @param \Drupal\Core\Field\FieldItemListInterface $field
* The field to get the target entity(ies) from.
* @param \Drupal\Core\Field\FieldItemInterface|null $field_item
* (optional) The field item to get the target entity(ies) from.
*
* @return string[]
* An indexed array of strings where each target entity type and ID are
* concatenated with a "|" character. Will return an empty array if no
* target entity could be retrieved from the received field item value.
*/
private function doGetTargetEntities(FieldItemListInterface $field, ?FieldItemInterface $field_item = NULL): array {
$entity_ids = [];
if ($field_item instanceof FieldItemInterface) {
$iterable = [$field_item];
}
// Check if target entity type is enabled, all entity types are enabled by
// default.
if (!$this->isEntityTypeTracked($target_type_id)) {
return [];
else {
$iterable = &$field;
}
foreach ($iterable as $item) {
/** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */
$item_value = $item->get('target_id')->getValue();
$target_type_id = $item->get('target_type')->getValue();
if (!empty($item_value)) {
$entity_ids[$target_type_id][] = $item_value;
}
}
$return = [];
foreach ($entity_ids as $target_type_id => $entity_id_values) {
$return = array_merge($return, $this->checkAndPrepareEntityIds($target_type_id, $entity_id_values, 'id'));
}
$target_type = $this->entityTypeManager->getDefinition($target_type_id);
// Only return a valid result if the target entity exists.
$query = $this->entityTypeManager->getStorage($target_type_id)
->getQuery()
->accessCheck(FALSE)
->condition($target_type->getKey('id'), $target_id)
->count();
return $query->execute() > 0 ? [$target_type_id . '|' . $target_id] : [];
return $return;
}
}
Loading