acquia_dam-1.0.0-rc1/modules/acquia_dam_integration_links/src/AssetDetector/ParagraphsAssetDetector.php
modules/acquia_dam_integration_links/src/AssetDetector/ParagraphsAssetDetector.php
<?php
namespace Drupal\acquia_dam_integration_links\AssetDetector;
use Drupal\acquia_dam_integration_links\AssetTracker;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
/**
* Detects DAM asset usage in paragraph reference fields.
*/
class ParagraphsAssetDetector extends AssetDetectorBase {
/**
* List of field types supported by this detector.
*
* @var string[]
*/
protected $supportedFieldTypes = [
'entity_reference_revisions',
];
/**
* Asset tracker service.
*
* @var \Drupal\acquia_dam_integration_links\AssetTracker
*/
protected $assetTracker;
/**
* Entity field manager service.
*
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
*/
protected $entityFieldManager;
/**
* ParagraphsAssetDetector constructor.
*
* @param \Drupal\acquia_dam_integration_links\AssetTracker $assetTracker
* Asset tracker service.
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
* Entity field manager service.
*/
public function __construct(AssetTracker $assetTracker, EntityFieldManagerInterface $entityFieldManager) {
$this->assetTracker = $assetTracker;
$this->entityFieldManager = $entityFieldManager;
}
/**
* {@inheritdoc}
*/
public function discoverAsset(ContentEntityInterface $entity, array $field_definitions, bool $is_title_changed): array {
$supported_fields = $this->filterSupportedFields($field_definitions, $this->supportedFieldTypes);
$new_assets = [];
$old_assets = [];
foreach ($supported_fields as $field) {
// Get paragraph entities referenced on the field.
$referenced_entities = $entity->get($field->getName())->referencedEntities();
// Re-runs asset gathering process for paragraphs.
$new_assets = array_merge($new_assets, $this->getParagraphsAssets($referenced_entities));
// If the title changed on the main entity we don't care what was on the
// original since we will delete every link and re-register.
if (isset($entity->original) && !$is_title_changed) {
// Re-runs asset gathering process for paragraphs on parent update.
$old_referenced_entities = $entity->original->get($field->getName())->referencedEntities();
$old_assets = array_merge($old_assets, $this->getParagraphsAssets($old_referenced_entities));
}
}
return [
'asset_to_register' => array_diff($new_assets, $old_assets),
'assets_to_remove' => array_diff($old_assets, $new_assets),
];
}
/**
* Re-runs asset discovery for paragraph entities.
*
* @param array $referenced_entities
* Referenced paragraph instances.
*
* @return array
* Asset ids from paragraphs.
*/
protected function getParagraphsAssets(array $referenced_entities): array {
$result = [
'asset_to_register' => [],
'assets_to_remove' => [],
];
foreach ($referenced_entities as $referenced_entity) {
// Get field definitions for every entity, those can be of different type.
$field_definitions = $this
->entityFieldManager
->getFieldDefinitions($referenced_entity->getEntityTypeId(), $referenced_entity->bundle());
$assets = $this->assetTracker->runAssetDiscovery($referenced_entity, $field_definitions);
$result = array_merge_recursive(
$result,
$assets
);
}
// Always work with asset_to_register values. assets_to_remove only gets
// populated on update, but we cannot track paragraph update since original
// property will be never set for paragraph instances. It might change in
// the future.
// https://www.drupal.org/project/paragraphs/issues/3013961
return !empty($result['asset_to_register']) ? $result['asset_to_register'] : [];
}
/**
* {@inheritdoc}
*/
protected function filterSupportedFields(array $field_definitions, array $supported_field_types): array {
$supported_fields = [];
foreach (parent::filterSupportedFields($field_definitions, $supported_field_types) as $field) {
$storage = $field->getFieldStorageDefinition();
$settings = $storage->getSettings();
if ($settings['target_type'] !== 'paragraph') {
continue;
}
$supported_fields[] = $field;
}
return $supported_fields;
}
}
