content_sync-8.x-2.x-dev/src/Plugin/SyncNormalizerDecorator/IdsCleaner.php
src/Plugin/SyncNormalizerDecorator/IdsCleaner.php
<?php namespace Drupal\content_sync\Plugin\SyncNormalizerDecorator; use Drupal\content_sync\Plugin\SyncNormalizerDecoratorBase; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a decorator for managing entities ids/target ids. * * @SyncNormalizerDecorator( * id = "id_cleaner", * name = @Translation("IDs Cleaner"), * ) * * https://chromatichq.com/insights/dependency-injection-drupal-8-plugins * */ class IdsCleaner extends SyncNormalizerDecoratorBase implements ContainerFactoryPluginInterface { /** * @var \Drupal\Core\Entity\EntityFieldManagerInterface */ protected $entityFieldManager; /** * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface */ protected $entityTypeBundleInfo; /** * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * @param array $configuration * @param string $plugin_id * @param mixed $plugin_definition * * @return static */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('entity_field.manager'), $container->get('entity_type.bundle.info') ); } /** * @param array $configuration * @param string $plugin_id * @param mixed $plugin_definition * * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityTypeBundleInfo * */ public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityFieldManagerInterface $entityFieldManager, EntityTypeBundleInfoInterface $entityTypeBundleInfo ) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->entityFieldManager = $entityFieldManager; $this->entityTypeBundleInfo = $entityTypeBundleInfo; } /** * {@inheritdoc} */ public function decorateDenormalization(array &$normalized_entity, $type, $format, array $context = []) { $this->fixReferences($normalized_entity, $type, $context['bundle']); } /** * @param array $normalized_entity * @param \Drupal\Core\Entity\ContentEntityInterface $entity * @param $format * @param array $context */ public function decorateNormalization(array &$normalized_entity, ContentEntityInterface $entity, $format, array $context = []) { $this->cleanIds($normalized_entity, $entity); } /** * @param $normalized_entity * @param \Drupal\Core\Entity\ContentEntityInterface $entity * * @return mixed */ protected function cleanIds(&$normalized_entity, ContentEntityInterface $entity) { $keys = $entity->getEntityType()->getKeys(); if (isset($normalized_entity[$keys['id']])) { unset($normalized_entity[$keys['id']]); } if (isset($keys['revision']) && isset($normalized_entity[$keys['revision']])) { unset($normalized_entity[$keys['revision']]); } // Path Alias are now entities and they have their own yml. // So,remove the path from the entity to avoid duplicated alias. if ($entity->hasLinkTemplate('canonical')) { if(isset($normalized_entity['path'])){ unset($normalized_entity['path']); } } // Move dependencies together. $dependencies = []; foreach ($normalized_entity as $field_name => $field_items) { foreach ($field_items as $key => $item) { if (!empty($item['dependencies'])){ $dependencies = array_merge_recursive($dependencies, $item['dependencies']); unset($normalized_entity[$field_name][$key]['dependencies']); } } } if (!empty($dependencies)){ array_walk($dependencies, function(&$v) { $v = array_unique($v); }); $normalized_entity['_content_sync']['entity_dependencies'] = $dependencies; } return $normalized_entity; } /** * @param array $data * @param $entity_type_id * * @return array */ protected function fixReferences(&$data, $entity_type_id, $bundle = FALSE) { if ($bundle) { $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle); } else { $bundles = array_keys($this->entityTypeBundleInfo->getBundleInfo($entity_type_id)); $field_definitions = []; foreach ($bundles as $bundle) { $field_definitions_bundle = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle); if (is_array($field_definitions_bundle)) { $field_definitions += $field_definitions_bundle; } } } // Clean up data, remove invalid fields. $field_names = array_keys($field_definitions); foreach ($data as $field_name => $field_data) { if (!in_array($field_name, $field_names)) { unset($data[$field_name]); } } return $data; } }