From 63b6c4f64afa82f9f070c7ddcfaaff2c59aba65e Mon Sep 17 00:00:00 2001 From: ashwinimone Date: Tue, 16 Jun 2020 15:56:49 +0200 Subject: [PATCH 01/15] Remove deprecated code --- rest_normalizations.info.yml | 1 + .../rest_normalizations_video_embed_field.info.yml | 1 + src/Normalizer/EntityReferenceFieldItemNormalizer.php | 4 ++-- src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rest_normalizations.info.yml b/rest_normalizations.info.yml index ecb4282..3a28de3 100644 --- a/rest_normalizations.info.yml +++ b/rest_normalizations.info.yml @@ -2,6 +2,7 @@ name: Rest Normalizations type: module description: Hoppinger Normalizations for the REST API core: 8.x +core_version_requirement: ^8 || ^9 package: Hoppinger dependencies: - serialization diff --git a/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml b/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml index 82345ad..6014c69 100644 --- a/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml +++ b/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml @@ -2,6 +2,7 @@ name: Rest Normalizations Video Embed Field type: module description: Hoppinger Normalizations for the REST API for Video Embed Field core: 8.x +core_version_requirement: ^8 || ^9 package: Hoppinger dependencies: - rest_normalizations diff --git a/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/src/Normalizer/EntityReferenceFieldItemNormalizer.php index 43127e1..100f3bb 100644 --- a/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -34,7 +34,7 @@ public function normalize($field_item, $format = NULL, array $context = []) { $values['target_uuid'] = $entity->uuid(); if ($entity instanceof TranslatableInterface) { - $entity = Drupal::entityManager()->getTranslationFromContext($entity, $langcode); + $entity = \Drupal::service('entity.repository')->getTranslationFromContext($entity, $langcode); } // Add a 'url' value if there is a reference and a canonical URL. Hard @@ -53,4 +53,4 @@ public function normalize($field_item, $format = NULL, array $context = []) { return $values; } -} \ No newline at end of file +} diff --git a/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php b/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php index c4a8060..13e463a 100644 --- a/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php @@ -50,9 +50,9 @@ public function normalize($field_item, $format = NULL, array $context = []) { if ($entity = $field_item->get('entity')->getValue()) { if ($entity instanceof TranslatableInterface) { - $entity = Drupal::entityManager()->getTranslationFromContext($entity, $langcode); + $entity = \Drupal::service('entity.repository')->getTranslationFromContext($entity, $langcode); } - + $this->addCacheableDependency($context, $entity); $values['target'] = $this->serializer->normalize($entity, $format, $context); } From b41c8fb9359e5b05a5ac19654da34c0ebecd10a5 Mon Sep 17 00:00:00 2001 From: ashwinimone Date: Tue, 16 Jun 2020 16:30:35 +0200 Subject: [PATCH 02/15] update Readme file --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 412b70c..593eb68 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ composer require hoppinger/rest_normalizations ## Version compatibiliy Version 1.4.0 and up are only compatible with Drupal 8.7.0 and up, and older versions are not compatible with Drupal 8.7.0 and up. +Version 2.0.0 are compatible with Drupal 9.x ## Usage From 07263bd2540afa7addbc402410bed8eba1a40efa Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Thu, 6 Aug 2020 15:32:31 +0200 Subject: [PATCH 03/15] wip --- src/Normalizer/ContentEntityNormalizer.php | 2 +- src/Normalizer/EntityReferenceFieldItemNormalizer.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php index 376b3a5..686380c 100644 --- a/src/Normalizer/ContentEntityNormalizer.php +++ b/src/Normalizer/ContentEntityNormalizer.php @@ -41,7 +41,7 @@ public function normalize($object, $format = NULL, array $context = []) { $data['language_links'] = []; foreach ($object->getTranslationLanguages() as $language) { - $data['language_links'][$language->getId()] = $object->getTranslation($language->getId())->url('canonical'); + $data['language_links'][$language->getId()] = $object->getTranslation($language->getId()); } $currentUser = \Drupal::currentUser(); diff --git a/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/src/Normalizer/EntityReferenceFieldItemNormalizer.php index 100f3bb..ae79de7 100644 --- a/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -40,8 +40,8 @@ public function normalize($field_item, $format = NULL, array $context = []) { // Add a 'url' value if there is a reference and a canonical URL. Hard // code 'canonical' here as config entities override the default $rel // parameter value to 'edit-form. - if ($url = $entity->url('canonical')) { - $values['url'] = $url; + if ($entity->hasLinkTemplate('canonical') && !$entity->isNew() && $url = $entity->toUrl('canonical')->toString(TRUE)) { + $values['url'] = $url->getGeneratedUrl(); } $values['target_label'] = $entity->label(); From dab3abd786a94becdc93aca9ed311dab10ac6b8d Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Thu, 6 Aug 2020 17:18:38 +0200 Subject: [PATCH 04/15] wip --- src/Normalizer/ContentEntityNormalizer.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php index 686380c..5bf80ac 100644 --- a/src/Normalizer/ContentEntityNormalizer.php +++ b/src/Normalizer/ContentEntityNormalizer.php @@ -41,7 +41,9 @@ public function normalize($object, $format = NULL, array $context = []) { $data['language_links'] = []; foreach ($object->getTranslationLanguages() as $language) { - $data['language_links'][$language->getId()] = $object->getTranslation($language->getId()); + if ($object->hasLinkTemplate('canonical') && $url = $object->getTranslation($language->getId())->toUrl('canonical')->toString(TRUE)) { + $data['language_links'][$language->getId()] = $url->getGeneratedUrl(); + } } $currentUser = \Drupal::currentUser(); From f0f0d6df8be8cd23a5a4706d03db070bec22b72a Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Tue, 25 Aug 2020 13:44:43 +0200 Subject: [PATCH 05/15] send the arguments expected by Entity normalizer --- src/Normalizer/ContentEntityNormalizer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php index 5bf80ac..d7d5f01 100644 --- a/src/Normalizer/ContentEntityNormalizer.php +++ b/src/Normalizer/ContentEntityNormalizer.php @@ -18,7 +18,7 @@ class ContentEntityNormalizer extends BaseNormalizer { protected $exclude_operations; public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeRepositoryInterface $entity_type_repository = NULL, EntityFieldManagerInterface $entity_field_manager = NULL, $exclude_operations) { - parent::__construct($entity_type_manager); + parent::__construct($entity_type_manager, $entity_type_repository, $entity_field_manager); $this->exclude_operations = $exclude_operations; } From d95d02a9518794615a4cddf9246ebf10565d6d30 Mon Sep 17 00:00:00 2001 From: Ashwini Mone Date: Thu, 18 Mar 2021 18:38:50 +0530 Subject: [PATCH 06/15] field target normalizer --- README.md | 1 - rest_normalizations.info.yml | 1 - rest_normalizations.services.yml | 25 +- ..._normalizations_video_embed_field.info.yml | 1 - ...tityReferenceTargetFieldFieldGenerator.php | 342 ++++++++++++++++++ .../EntityReferenceTargetFieldGenerator.php | 4 +- ...eferenceFieldItemFieldTargetNormalizer.php | 87 +++++ .../EntityReferenceFieldItemNormalizer.php | 2 +- ...tityReferenceFieldItemTargetNormalizer.php | 2 +- 9 files changed, 451 insertions(+), 14 deletions(-) create mode 100644 src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php create mode 100644 src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php diff --git a/README.md b/README.md index 593eb68..412b70c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ composer require hoppinger/rest_normalizations ## Version compatibiliy Version 1.4.0 and up are only compatible with Drupal 8.7.0 and up, and older versions are not compatible with Drupal 8.7.0 and up. -Version 2.0.0 are compatible with Drupal 9.x ## Usage diff --git a/rest_normalizations.info.yml b/rest_normalizations.info.yml index 3a28de3..b9db7ce 100644 --- a/rest_normalizations.info.yml +++ b/rest_normalizations.info.yml @@ -1,7 +1,6 @@ name: Rest Normalizations type: module description: Hoppinger Normalizations for the REST API -core: 8.x core_version_requirement: ^8 || ^9 package: Hoppinger dependencies: diff --git a/rest_normalizations.services.yml b/rest_normalizations.services.yml index 4a58d31..6e4f8c6 100644 --- a/rest_normalizations.services.yml +++ b/rest_normalizations.services.yml @@ -20,13 +20,18 @@ services: rest_normalizations.normalizer.entity_reference_field_item_target: class: Drupal\rest_normalizations\Normalizer\EntityReferenceFieldItemTargetNormalizer tags: - - { name: normalizer, priority: 25 } + - { name: normalizer, priority: 30 } arguments: ['@language_manager', '%rest_normalizations.target_identifiers%'] rest_normalizations.normalizer.image_entity: - class: Drupal\rest_normalizations\Normalizer\ImageNormalizer - tags: - - { name: normalizer, priority: 5 } - arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager', '%rest_normalizations.content_entity_operations_exclude%'] + class: Drupal\rest_normalizations\Normalizer\ImageNormalizer + tags: + - { name: normalizer, priority: 5 } + arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager', '%rest_normalizations.content_entity_operations_exclude%'] + rest_normalizations.normalizer.entity_reference_field_item_field_target: + class: Drupal\rest_normalizations\Normalizer\EntityReferenceFieldItemFieldTargetNormalizer + tags: + - { name: normalizer, priority: 25 } + arguments: ['@language_manager', '%rest_normalizations.field_target_identifiers%'] rest_normalizations.ts_generator_component.entity_file: class: Drupal\rest_normalizations\ComponentGenerator\FileGenerator @@ -71,18 +76,24 @@ services: rest_normalizations.ts_generator_component.field.entity_reference_target: class: Drupal\rest_normalizations\ComponentGenerator\EntityReferenceTargetFieldGenerator tags: - - { name: ts_generator_component, priority: 21 } + - { name: ts_generator_component, priority: 22 } arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.target_identifiers%'] rest_normalizations.ts_generator_component.field.file: class: Drupal\rest_normalizations\ComponentGenerator\FileFieldGenerator tags: - - { name: ts_generator_component, priority: 22 } + - { name: ts_generator_component, priority: 23 } arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '%rest_normalizations.target_identifiers%'] + rest_normalizations.ts_generator_component.field.entity_reference_target_field: + class: Drupal\rest_normalizations\ComponentGenerator\EntityReferenceTargetFieldFieldGenerator + tags: + - { name: ts_generator_component, priority: 21 } + arguments: ['@plugin.manager.field.field_type', '@entity_type.manager', '@entity_field.manager', '%rest_normalizations.field_target_identifiers%'] parameters: rest_normalizations.target_identifiers: - media - file - paragraph + rest_normalizations.field_target_identifiers: {} rest_normalizations.content_entity_operations_exclude: - commerce_product_variation diff --git a/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml b/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml index 6014c69..db00985 100644 --- a/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml +++ b/rest_normalizations_video_embed_field/rest_normalizations_video_embed_field.info.yml @@ -1,7 +1,6 @@ name: Rest Normalizations Video Embed Field type: module description: Hoppinger Normalizations for the REST API for Video Embed Field -core: 8.x core_version_requirement: ^8 || ^9 package: Hoppinger dependencies: diff --git a/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php new file mode 100644 index 0000000..7e69255 --- /dev/null +++ b/src/ComponentGenerator/EntityReferenceTargetFieldFieldGenerator.php @@ -0,0 +1,342 @@ +entityFieldManager = $entityFieldManager; + $this->field_target_identifiers = $field_target_identifiers; + } + + public function supportsGeneration($object) { + if (!parent::supportsGeneration($object)) { + return FALSE; + } + + return !!$this->getFieldData($object); + } + + /** + * Generate name suffix and field target identifiers. + * + * @param $object + * @return [string, array]|bool + */ + protected function getFieldData($object) { + if (isset($this->field_target_identifiers[$object->getSettings()['target_type']])) { + return [ + '', + $this->field_target_identifiers[$object->getSettings()['target_type']] + ]; + } + + if (isset($this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getName()])) { + return [ + Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getName()), + $this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getName()] + ]; + } + + if ($object->getTargetBundle() && isset($this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getTargetBundle() . '-' . $object->getName()])) { + return [ + Container::camelize($object->getTargetEntityTypeId()) . Container::camelize($object->getTargetBundle()) . Container::camelize($object->getName()), + $this->field_target_identifiers[$object->getTargetEntityTypeId() . '-' . $object->getTargetBundle() . '-' . $object->getName()] + ]; + } + + return FALSE; + } + + protected function getItemProperties($object, Settings $settings, Result $result, ComponentResult $component_result) { + /** @var \Drupal\Core\Field\FieldDefinitionInterface $object */ + $storage_object = $object->getFieldStorageDefinition(); + + $properties = parent::getItemProperties($object, $settings, $result, $component_result); + + $properties['target'] = $component_result->getContext('target'); + + return $properties; + } + + public function getItemMapping($object, $properties, Settings $settings, Result $result, ComponentResult $componentResult) { + $mapping = parent::getItemMapping($object, $properties, $settings, $result, $componentResult); + + $mapping['target'] = 'target'; + + return $mapping; + } + + protected function getName($object, Settings $settings, Result $result, ComponentResult $component_result) { + /** @var \Drupal\Core\Field\FieldDefinitionInterface $object */ + $name = parent::getName($object, $settings, $result, $component_result); + list($name_suffix, ) = $this->getFieldData($object); + return $name . $name_suffix; + } + + public function getBundles($object) { + if (!($object instanceof FieldConfigInterface)) { + return NULL; + } + + $entity_type_id = $object->getSettings()['target_type']; + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + if ($bundle_entity_type_id = $entity_type->getBundleEntityType()) { + $bundles = []; + foreach ($this->entityTypeManager->getStorage($bundle_entity_type_id)->loadMultiple() as $entity) { + $bundles[] = $entity; + } + } else { + return NULL; + } + + $handler = $object->getSetting('handler'); + if ($handler !== 'default:' . $entity_type->id()) { + return $bundles; + } + + $handler_settings = $object->getSetting('handler_settings'); + if (empty($handler_settings) || empty($handler_settings['target_bundles'])) { + return $bundles; + } + + $negate = !empty($handler_settings['negate']); + $target_bundle_names = array_values(array_filter($handler_settings['target_bundles'])); + + $result_bundles = []; + foreach ($bundles as $bundle) { + if ($negate xor in_array($bundle->id(), $target_bundle_names)) { + $result_bundles[] = $bundle; + } + } + + return $result_bundles; + } + + public function preGenerateBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundle_list = $this->getBundles($object); + if (!$bundle_list) { + return FALSE; + } + + $bundles = []; + foreach ($bundle_list as $bundle) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target' . Container::camelize($bundle->id()); + $bundles[$bundle->id()] = new ComponentResult([ + 'type' => ':types/' . $name . ':', + 'target_type' => ':types/Parsed' . $name . ':', + 'parser' => ':parser/' . Container::underscore($name) . '_parser:', + 'guard' => ':parser/' . Container::underscore($name) . '_guard:', + ]); + } + return $bundles; + } + + public function generateTargetFromBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + + $targetComponentResult = new ComponentResult(); + $bundles_results = $componentResult->getContext('bundles'); + + $type = $targetComponentResult->setComponent('type', $result->setComponent( + 'types/' . $name, + 'type ' . $name . " = " . $this->generateUnionObject($bundles_results, 'type') + )); + if ($settings->generateParser()) { + $target_type = $targetComponentResult->setComponent('target_type', $result->setComponent( + 'types/Parsed' . $name, + 'type Parsed' . $name . " = " . $this->generateUnionObject($bundles_results, 'target_type') + )); + $targetComponentResult->setComponent('parser', $result->setComponent( + 'parser/' . Container::underscore($name) . '_parser', + 'const ' . Container::underscore($name) . '_parser' . ' = ' . $this->generateUnionParser( + $bundles_results, + $type, + $target_type + ) + )); + } + + return $targetComponentResult; + } + + public function preGenerateTargetWithoutBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + + return new ComponentResult([ + 'type' => ':types/' . $name . ':', + 'target_type' => ':types/Parsed' . $name . ':', + 'parser' => ':parser/' . Container::underscore($name) . '_parser:' + ]); + } + + public function generateTargetWithoutBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target'; + list(, $field_target_identifiers) = $this->getFieldData($object); + + $entity_type_id = $object->getSettings()['target_type']; + $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id); + + $properties = []; + $mapping = []; + + foreach ($base_field_definitions as $key => $field_definition) { + if ($field_definition->isInternal()) { + continue; + } + + if (!in_array($key, $field_target_identifiers)) { + continue; + } + + $property_value = $this->generator->generate($field_definition, $settings, $result); + $properties[$key] = $property_value; + $mapping[$key] = $key; + } + + return $this->generatePropertiesComponentResult( + $properties, + $name, + 'Parsed' . $name, + Container::underscore($name) . '_parser', + $mapping, + $settings, + $result + ); + } + + /** + * @param $object + * @param Settings $settings + * @param Result $result + * @param ComponentResult $componentResult + * @return array|bool + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + */ + public function generateBundles($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundle_list = $this->getBundles($object); + if (!$bundle_list) { + return FALSE; + } + + $bundles = []; + foreach ($bundle_list as $bundle) { + $bundles[$bundle->id()] = $this->generateBundle($object, $bundle, $settings, $result, $componentResult); + } + return $bundles; + } + + /** + * @param $object + * @param $bundle + * @param Settings $settings + * @param Result $result + * @param ComponentResult $componentResult + * + */ + public function generateBundle($object, $bundle, Settings $settings, Result $result, ComponentResult $componentResult) { + list(, $field_target_identifiers) = $this->getFieldData($object); + + $entity_type_id = $object->getSettings()['target_type']; + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); + + $bundle_id = $bundle->id(); + + $base_field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($entity_type_id); + $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle_id); + + $_bundle_field_type = $this->generator->generate($base_field_definitions[$entity_type->getKey('bundle')], $settings, $result); + $bundle_field_type = $_bundle_field_type->getComponent('wrapper_type') . '<' . $_bundle_field_type->getComponent('specific_item_type') . "<" . json_encode($bundle_id) . ">>"; + + $properties = [ + $entity_type->getKey('bundle') => new ComponentResult([ + 'type' => $bundle_field_type, + 'target_type' => json_encode($bundle_id), + 'parser' => '((_: any): ' . json_encode($bundle_id) . ' => ' . json_encode($bundle_id) . ')', + 'guard' => '((t: any): t is ' . $bundle_field_type . ' => Array.isArray(t) && t[0] !== undefined && t[0].target_id !== undefined && t[0].target_id === ' . json_encode($bundle_id) . ')' + ]) + ]; + $mapping = [ + 'bundle' => $entity_type->getKey('bundle'), + ]; + + foreach ($field_definitions as $key => $field_definition) { + if ($field_definition->isInternal()) { + continue; + } + + if (!in_array($key, $field_target_identifiers)) { + continue; + } + + $property_value = $this->generator->generate($field_definition, $settings, $result); + $properties[$key] = $property_value; + $mapping[$key] = $key; + } + + $name = $this->getName($object, $settings, $result, $componentResult) . 'Target' . Container::camelize($bundle->id()); + + return $this->generatePropertiesComponentResult( + $properties, + $name, + 'Parsed' . $name, + Container::underscore($name) . '_parser', + $mapping, + $settings, + $result, + Container::underscore($name) . '_guard' + ); + } + + protected function preGenerate($object, Settings $settings, Result $result, ComponentResult $componentResult) { + $bundle_list = $this->getBundles($object); + if ($bundle_list) { + $bundles = $componentResult->getContext('bundles'); + if (!isset($bundles)) { + $bundles = $this->preGenerateBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('bundles', $bundles); + $bundles = $this->generateBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('bundles', $bundles); + } + + $target = $componentResult->getContext('target'); + if (!$target) { + $target = $this->generateTargetFromBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + } + } else { + $target = $componentResult->getContext('target'); + if (!$target) { + $target = $this->preGenerateTargetWithoutBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + $target = $this->generateTargetWithoutBundles($object, $settings, $result, $componentResult); + $componentResult->setContext('target', $target); + } + } + + parent::preGenerate($object, $settings, $result, $componentResult); + } +} diff --git a/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php b/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php index 7a2b8e5..3f338cf 100644 --- a/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php +++ b/src/ComponentGenerator/EntityReferenceTargetFieldGenerator.php @@ -154,11 +154,11 @@ public function generateParser($object, Settings $settings, Result $result, Comp $item_target_type = implode(' | ', array_diff(array_map('trim', explode('|', $item_target_type)), array('undefined'))); $item_properties = $this->getItemProperties($object, $settings, $result, $componentResult); - $item_mapping = $this->getItemMapping($object, $properties, $settings, $result, $componentResult); + $item_mapping = $this->getItemMapping($object, $item_properties, $settings, $result, $componentResult); $item_parser = $componentResult->getContext('item')->getComponent('parser'); $item_guard = $componentResult->getContext('item')->getComponent('guard'); - + if ($object->getFieldStorageDefinition()->getCardinality() == 1) { if ($object->isRequired()) { $name = 'singular_required_' . Container::underscore($this->getName($object, $settings, $result, $componentResult)) . '_parser'; diff --git a/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php b/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php new file mode 100644 index 0000000..8ffb32f --- /dev/null +++ b/src/Normalizer/EntityReferenceFieldItemFieldTargetNormalizer.php @@ -0,0 +1,87 @@ +field_target_identifiers = $field_target_identifiers; + } + + public function supportsNormalization($data, $format = NULL) { + if (!parent::supportsNormalization($data, $format)) { + return FALSE; + } + + return !!$this->getFieldData($data); + } + + protected function getFieldData($data) { + $entity = $data->get('entity')->getValue(); + if (!$entity) { + return FALSE; + } + + $field_entity = $data->getEntity(); + $field_entity_identifiers = array_filter([ + $entity->getEntityTypeId(), + $field_entity->getEntityTypeId() . '-' . $data->getFieldDefinition()->getName(), + $field_entity->bundle() ? ( + $field_entity->getEntityTypeId() . '-' . $field_entity->bundle() . '-' . $data->getFieldDefinition()->getName() + ) : NULL, + ]); + + foreach ($field_entity_identifiers as $field_entity_identifier) { + if (isset($this->field_target_identifiers[$field_entity_identifier])) { + return $this->field_target_identifiers[$field_entity_identifier]; + } + } + + return FALSE; + } + + public function normalize($field_item, $format = NULL, array $context = []) { + $values = parent::normalize($field_item, $format, $context); + $field_identifiers = $this->getFieldData($field_item); + + $langcode = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + if ($entity = $field_item->get('entity')->getValue()) { + + if ($entity instanceof TranslatableInterface) { + $entity = \Drupal::service('entity.repository')->getTranslationFromContext($entity, $langcode); + } + + $entity_type = $entity->getEntityType(); + + $this->addCacheableDependency($context, $entity); + + $target = (object) []; + + /** @var \Drupal\Core\Entity\Entity $entity */ + foreach (TypedDataInternalPropertiesHelper::getNonInternalProperties($entity->getTypedData()) as $name => $field_items) { + if ($field_items->access('view', $context['account']) && ( + in_array($name, $field_identifiers) || + $name == $entity_type->getKey('bundle') + )) { + $target->{$name} = $this->serializer->normalize($field_items, $format, $context); + } + } + + $values['target'] = $target; + } + return $values; + } +} diff --git a/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/src/Normalizer/EntityReferenceFieldItemNormalizer.php index ae79de7..a1326ae 100644 --- a/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -53,4 +53,4 @@ public function normalize($field_item, $format = NULL, array $context = []) { return $values; } -} +} \ No newline at end of file diff --git a/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php b/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php index 13e463a..89b22c9 100644 --- a/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemTargetNormalizer.php @@ -52,7 +52,7 @@ public function normalize($field_item, $format = NULL, array $context = []) { if ($entity instanceof TranslatableInterface) { $entity = \Drupal::service('entity.repository')->getTranslationFromContext($entity, $langcode); } - + $this->addCacheableDependency($context, $entity); $values['target'] = $this->serializer->normalize($entity, $format, $context); } From 1a9595c332c8392ddaf68cc1a36f6807050c7b62 Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Fri, 15 Oct 2021 13:47:11 +0530 Subject: [PATCH 07/15] Conditional check to remove warning messages --- src/Normalizer/ContentEntityNormalizer.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Normalizer/ContentEntityNormalizer.php b/src/Normalizer/ContentEntityNormalizer.php index d7d5f01..135cdc2 100644 --- a/src/Normalizer/ContentEntityNormalizer.php +++ b/src/Normalizer/ContentEntityNormalizer.php @@ -24,15 +24,16 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Ent } protected function operationsExcluded($entity_type_id) { - foreach ($this->exclude_operations as $exclude_operation) { - $exclude_operation_regex = '/' . implode('.*', array_map(function($x) { - return preg_quote($x, '/'); - }, explode('*', $exclude_operation))) . '/'; - if (preg_match($exclude_operation_regex, $entity_type_id)) { - return TRUE; + if($this->exclude_operations) { + foreach ($this->exclude_operations as $exclude_operation) { + $exclude_operation_regex = '/' . implode('.*', array_map(function($x) { + return preg_quote($x, '/'); + }, explode('*', $exclude_operation))) . '/'; + if (preg_match($exclude_operation_regex, $entity_type_id)) { + return TRUE; + } } } - return FALSE; } From 548a445a672e3709ebc383348b794982a468d872 Mon Sep 17 00:00:00 2001 From: Korstiaan de Ridder Date: Wed, 2 Feb 2022 09:37:48 +0100 Subject: [PATCH 08/15] Also populate url's for file entities --- src/Normalizer/EntityReferenceFieldItemNormalizer.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/src/Normalizer/EntityReferenceFieldItemNormalizer.php index a1326ae..9dc58fa 100644 --- a/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -42,6 +42,8 @@ public function normalize($field_item, $format = NULL, array $context = []) { // parameter value to 'edit-form. if ($entity->hasLinkTemplate('canonical') && !$entity->isNew() && $url = $entity->toUrl('canonical')->toString(TRUE)) { $values['url'] = $url->getGeneratedUrl(); + } elseif ($entity->getEntityTypeId() === 'file' && $entity->access('download')) { + $values['url'] = Drupal\Core\Url::fromUri(file_create_url($entity->getFileUri()))->toString(); } $values['target_label'] = $entity->label(); From 8f198d232924041de8dd02df8434e7c559a7f260 Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Wed, 28 Sep 2022 15:43:40 +0530 Subject: [PATCH 09/15] Prevent styles on gif images --- src/Normalizer/ImageNormalizer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Normalizer/ImageNormalizer.php b/src/Normalizer/ImageNormalizer.php index 1a28718..43e70dc 100644 --- a/src/Normalizer/ImageNormalizer.php +++ b/src/Normalizer/ImageNormalizer.php @@ -19,6 +19,11 @@ public function supportsNormalization($data, $format = NULL) { return FALSE; } + //Prevent styles on gif images + if ($mimetype[1] == 'gif') { + return FALSE; + } + return TRUE; } From 29fc9718ad868c4c005b01c4ff9ecbbabc49b9fa Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Sat, 29 Oct 2022 14:47:15 +0530 Subject: [PATCH 10/15] Support for symphony 4.1 and up --- src/Normalizer/EntityReferenceFieldItemNormalizer.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Normalizer/EntityReferenceFieldItemNormalizer.php b/src/Normalizer/EntityReferenceFieldItemNormalizer.php index 9dc58fa..a975523 100644 --- a/src/Normalizer/EntityReferenceFieldItemNormalizer.php +++ b/src/Normalizer/EntityReferenceFieldItemNormalizer.php @@ -55,4 +55,11 @@ public function normalize($field_item, $format = NULL, array $context = []) { return $values; } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool { + return FALSE; + } } \ No newline at end of file From 7f95ae300be10446f390cd39d8af62790272b52f Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Thu, 15 Dec 2022 18:25:26 +0530 Subject: [PATCH 11/15] Prevent image styles for svg images --- src/Normalizer/ImageNormalizer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Normalizer/ImageNormalizer.php b/src/Normalizer/ImageNormalizer.php index 43e70dc..9b51890 100644 --- a/src/Normalizer/ImageNormalizer.php +++ b/src/Normalizer/ImageNormalizer.php @@ -24,6 +24,11 @@ public function supportsNormalization($data, $format = NULL) { return FALSE; } + //Prevent styles on svg images + if ($mimetype[1] == 'svg+xml') { + return FALSE; + } + return TRUE; } From 2b1500e4a676829d7aa275f66b8571f8ee3afebd Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Wed, 15 Feb 2023 13:47:06 +0530 Subject: [PATCH 12/15] Fix cacheble normalizer issue. This is done for the case when file is other than image. --- src/Normalizer/ImageNormalizer.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Normalizer/ImageNormalizer.php b/src/Normalizer/ImageNormalizer.php index 9b51890..f680c13 100644 --- a/src/Normalizer/ImageNormalizer.php +++ b/src/Normalizer/ImageNormalizer.php @@ -45,4 +45,11 @@ public function normalize($entity, $format = NULL, array $context = []) { return $data; } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool { + return FALSE; + } } \ No newline at end of file From 143a2d9d66082c5818894269fc00f5d5a097a308 Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Fri, 29 Sep 2023 23:57:51 +0530 Subject: [PATCH 13/15] Fix for deprecated code --- src/RedirectDestination.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/RedirectDestination.php b/src/RedirectDestination.php index 53b418a..64f2acd 100644 --- a/src/RedirectDestination.php +++ b/src/RedirectDestination.php @@ -9,11 +9,14 @@ class RedirectDestination extends BaseRedirectDestination { public function get() { if (!isset($this->destination)) { $query = $this->requestStack->getCurrentRequest()->query; - if (UrlHelper::isExternal($query->get('destination'))) { - $this->destination = '/'; - } - elseif ($query->has('destination')) { - $this->destination = $query->get('destination'); + + if ($query->has('destination')) { + if (UrlHelper::isExternal($query->get('destination'))) { + $this->destination = '/'; + } + else { + $this->destination = $query->get('destination'); + } } else { $this->destination = $this->urlGenerator->generateFromRoute('', [], ['query' => UrlHelper::filterQueryParameters($query->all(), ['_format'])]); @@ -22,4 +25,4 @@ public function get() { return $this->destination; } -} \ No newline at end of file +} From 8aae94c1d4d476c2cef0f6b8bac880cc3b0779a0 Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Wed, 25 Oct 2023 20:08:58 +0530 Subject: [PATCH 14/15] Mention requirement in composer.json --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 842100f..dd88ce9 100644 --- a/composer.json +++ b/composer.json @@ -11,5 +11,8 @@ "role": "Maintainer" } ], - "require": {} + "require": { + "php": ">=7.3", + "drupal/core": "^8 || ^9" + } } \ No newline at end of file From 307ce0b9d8496151d6e2f47f1efa0bb8ae5d7a68 Mon Sep 17 00:00:00 2001 From: Amit Ajgaonkar Date: Tue, 5 Dec 2023 15:08:09 +0530 Subject: [PATCH 15/15] Make style urls optional since they are not present for svg or gif images --- src/ComponentGenerator/FileGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ComponentGenerator/FileGenerator.php b/src/ComponentGenerator/FileGenerator.php index b9f4237..8ea4a2b 100644 --- a/src/ComponentGenerator/FileGenerator.php +++ b/src/ComponentGenerator/FileGenerator.php @@ -57,7 +57,7 @@ protected function generateImage($object, Settings $settings, Result $result, Co $name = Container::camelize($object->id()) . 'Image'; $properties = [ - 'style_urls' => $stylesResult, + 'style_urls?' => $stylesResult, ]; $mapping = [ $baseResult,