From 5513b8d8b775f3dd71e16fe44a4a5bf2f6755e32 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 | 110 +++++++++++++++++++++ 2 files changed, 124 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..c76be9e --- /dev/null +++ b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php @@ -0,0 +1,110 @@ +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); + if (!is_null($entity)) { + $value['uri'] = 'entity:' . $entity_type . '/' . $entity->bundle() . '/' . $entity->uuid(); + } + // Remove the value. + else { + $value = [ + 'uri' => '', + 'title' => '', + 'options' => [], + ]; + } + } + } + + 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