From b00bed1bd419a6329f0af5643cb34c5acb1f3b28 Mon Sep 17 00:00:00 2001 From: florenttorregrosa Date: Fri, 2 Jun 2017 15:58:16 +0200 Subject: [PATCH] Issue #2883437 by Grimreaper, e0ipso: Transform link field value to use UUID --- src/Plugin/ResourceFieldEnhancerBase.php | 14 +++ .../jsonapi/FieldEnhancer/UuidLinkEnhancer.php | 100 +++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php diff --git a/src/Plugin/ResourceFieldEnhancerBase.php b/src/Plugin/ResourceFieldEnhancerBase.php index 1fa7683..fa053d6 100644 --- a/src/Plugin/ResourceFieldEnhancerBase.php +++ b/src/Plugin/ResourceFieldEnhancerBase.php @@ -26,6 +26,13 @@ abstract class ResourceFieldEnhancerBase extends PluginBase implements ResourceF /** * {@inheritdoc} */ + public function defaultConfiguration() { + return []; + } + + /** + * {@inheritdoc} + */ public function calculateDependencies() { // TODO: This should have a dependency on the resource_config entity. return []; @@ -48,4 +55,11 @@ abstract class ResourceFieldEnhancerBase extends PluginBase implements ResourceF return $this->configuration; } + /** + * {@inheritdoc} + */ + public function getSettingsForm(array $resource_field_info) { + return []; + } + } diff --git a/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php new file mode 100644 index 0000000..c86ba76 --- /dev/null +++ b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php @@ -0,0 +1,100 @@ +entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('entity_type.manager') + ); + } + + /** + * {@inheritdoc} + */ + public function postProcess($value) { + if (isset($value['uri'])) { + // Check if it is a link to an entity. + preg_match("/entity:(.*)\/(.*)/", $value['uri'], $parsed_uri); + if (!empty($parsed_uri)) { + $entity_type = $parsed_uri[1]; + $entity_id = $parsed_uri[2]; + $entity = $this->entityTypeManager->getStorage($entity_type)->load($entity_id); + $value['uri'] = 'entity:' . $entity_type . '/' . $entity->bundle() . '/' . $entity->uuid(); + } + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function prepareForInput($value) { + if (isset($value['uri'])) { + // Check if it is a link to an entity. + preg_match("/entity:(.*)\/(.*)\/(.*)/", $value['uri'], $parsed_uri); + if (!empty($parsed_uri)) { + $entity_type = $parsed_uri[1]; + $entity_uuid = $parsed_uri[3]; + $entities = $this->entityTypeManager->getStorage($entity_type)->loadByProperties(['uuid' => $entity_uuid]); + if (!empty($entities)) { + $entity = array_shift($entities); + $value['uri'] = 'entity:' . $entity_type . '/' . $entity->id(); + } + else { + // If the entity has not been imported yet we unset the field value. + $value = []; + } + } + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function getJsonSchema() { + return [ + 'type' => 'object', + ]; + } + +} -- 1.9.1