From bfff05c2db7c982b2a2ed2fcc6b296c81c55b20d Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 14:37:33 +0900 Subject: [PATCH 01/12] use ->getOriginal() instead of ->original --- src/Entity/FieldEncryptEntityType.php | 2 +- src/ProcessEntities.php | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Entity/FieldEncryptEntityType.php b/src/Entity/FieldEncryptEntityType.php index ee015dc..df074d6 100644 --- a/src/Entity/FieldEncryptEntityType.php +++ b/src/Entity/FieldEncryptEntityType.php @@ -117,7 +117,7 @@ class FieldEncryptEntityType extends ConfigEntityBase { */ public function postSave(EntityStorageInterface $storage, $update = TRUE): void { parent::postSave($storage, $update); - if (!$update || $this->getBaseFields() !== $this->original->getBaseFields()) { + if (!$update || $this->getBaseFields() !== $this->getOriginal()->getBaseFields()) { self::queueEntityUpdates($this->id()); } // Update the field_encrypt module's state. diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index 9ddd530..df78dda 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -77,16 +77,16 @@ class ProcessEntities { } // The entity storage handler has clever logic to ensure that configurable - // fields are only saved if necessary. If entity->original is set we need + // fields are only saved if necessary. If entity->getOriginal() we need // to ensure the field values are the values in the database and not the // unencrypted values so that they are saved if necessary. This is // particularly important when a previously encrypted field is set to be // unencrypted. // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::saveToDedicatedTables() // @see \Drupal\Core\Entity\ContentEntityStorageBase::hasFieldValueChanged() - if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { - if ($translated_entity->original->hasTranslation($language->getId())) { - $translated_original = $translated_entity->original->getTranslation($language->getId()); + if ($translated_entity->getOriginal() && $translated_entity->getOriginal() instanceof ContentEntityInterface) { + if ($translated_entity->getOriginal()->hasTranslation($language->getId())) { + $translated_original = $translated_entity->getOriginal()->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_original, 'getUnencryptedPlaceholderValue'); } } @@ -118,9 +118,9 @@ class ProcessEntities { $translated_entity = $entity->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_entity); // Reverse the logic to encrypt the original entity in ::encryptEntity(). - if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { - if ($translated_entity->original->hasTranslation($language->getId())) { - $this->decryptEntity($translated_entity->original); + if ($translated_entity->getOriginal() && $translated_entity->getOriginal() instanceof ContentEntityInterface) { + if ($translated_entity->getOriginal()->hasTranslation($language->getId())) { + $this->decryptEntity($translated_entity->getOriginal()); } } } -- GitLab From ea027afa4c93ee33003d9168c9e5568695341ec4 Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 15:10:08 +0900 Subject: [PATCH 02/12] Revert "use ->getOriginal() instead of ->original" This reverts commit e18bd35adbbe5509dc39f7440e169c4e1af61927. --- src/Entity/FieldEncryptEntityType.php | 2 +- src/ProcessEntities.php | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Entity/FieldEncryptEntityType.php b/src/Entity/FieldEncryptEntityType.php index df074d6..ee015dc 100644 --- a/src/Entity/FieldEncryptEntityType.php +++ b/src/Entity/FieldEncryptEntityType.php @@ -117,7 +117,7 @@ class FieldEncryptEntityType extends ConfigEntityBase { */ public function postSave(EntityStorageInterface $storage, $update = TRUE): void { parent::postSave($storage, $update); - if (!$update || $this->getBaseFields() !== $this->getOriginal()->getBaseFields()) { + if (!$update || $this->getBaseFields() !== $this->original->getBaseFields()) { self::queueEntityUpdates($this->id()); } // Update the field_encrypt module's state. diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index df78dda..9ddd530 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -77,16 +77,16 @@ class ProcessEntities { } // The entity storage handler has clever logic to ensure that configurable - // fields are only saved if necessary. If entity->getOriginal() we need + // fields are only saved if necessary. If entity->original is set we need // to ensure the field values are the values in the database and not the // unencrypted values so that they are saved if necessary. This is // particularly important when a previously encrypted field is set to be // unencrypted. // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::saveToDedicatedTables() // @see \Drupal\Core\Entity\ContentEntityStorageBase::hasFieldValueChanged() - if ($translated_entity->getOriginal() && $translated_entity->getOriginal() instanceof ContentEntityInterface) { - if ($translated_entity->getOriginal()->hasTranslation($language->getId())) { - $translated_original = $translated_entity->getOriginal()->getTranslation($language->getId()); + if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { + if ($translated_entity->original->hasTranslation($language->getId())) { + $translated_original = $translated_entity->original->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_original, 'getUnencryptedPlaceholderValue'); } } @@ -118,9 +118,9 @@ class ProcessEntities { $translated_entity = $entity->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_entity); // Reverse the logic to encrypt the original entity in ::encryptEntity(). - if ($translated_entity->getOriginal() && $translated_entity->getOriginal() instanceof ContentEntityInterface) { - if ($translated_entity->getOriginal()->hasTranslation($language->getId())) { - $this->decryptEntity($translated_entity->getOriginal()); + if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { + if ($translated_entity->original->hasTranslation($language->getId())) { + $this->decryptEntity($translated_entity->original); } } } -- GitLab From c37715f78599d4a2acf0922dc489e516a2cb2ede Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 15:18:20 +0900 Subject: [PATCH 03/12] getOriginal() in backwards-compatible way --- src/Entity/FieldEncryptEntityType.php | 11 ++++++++++- src/ProcessEntities.php | 28 ++++++++++++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/Entity/FieldEncryptEntityType.php b/src/Entity/FieldEncryptEntityType.php index ee015dc..b7a7e90 100644 --- a/src/Entity/FieldEncryptEntityType.php +++ b/src/Entity/FieldEncryptEntityType.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Drupal\field_encrypt\Entity; +use Drupal\Component\Utility\DeprecationHelper; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\Attribute\ConfigEntityType; use Drupal\Core\Entity\EntityStorageInterface; @@ -117,7 +118,15 @@ class FieldEncryptEntityType extends ConfigEntityBase { */ public function postSave(EntityStorageInterface $storage, $update = TRUE): void { parent::postSave($storage, $update); - if (!$update || $this->getBaseFields() !== $this->original->getBaseFields()) { + + $original_entity = DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.2', + fn () => $this->getOriginal(), + fn () => $this->original, + ); + + if (!$update || $this->getBaseFields() !== $original_entity->getBaseFields()) { self::queueEntityUpdates($this->id()); } // Update the field_encrypt module's state. diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index 9ddd530..ddb000b 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Drupal\field_encrypt; +use Drupal\Component\Utility\DeprecationHelper; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Field\FieldItemListInterface; @@ -77,16 +78,22 @@ class ProcessEntities { } // The entity storage handler has clever logic to ensure that configurable - // fields are only saved if necessary. If entity->original is set we need + // fields are only saved if necessary. If entity->getOriginal() we need // to ensure the field values are the values in the database and not the // unencrypted values so that they are saved if necessary. This is // particularly important when a previously encrypted field is set to be // unencrypted. // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::saveToDedicatedTables() // @see \Drupal\Core\Entity\ContentEntityStorageBase::hasFieldValueChanged() - if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { - if ($translated_entity->original->hasTranslation($language->getId())) { - $translated_original = $translated_entity->original->getTranslation($language->getId()); + $translated_original = DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.2', + fn () => $translated_entity->getOriginal(), + fn () => $translated_entity->original, + ); + if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { + if ($translated_original->hasTranslation($language->getId())) { + $translated_original = $translated_original->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_original, 'getUnencryptedPlaceholderValue'); } } @@ -118,9 +125,16 @@ class ProcessEntities { $translated_entity = $entity->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_entity); // Reverse the logic to encrypt the original entity in ::encryptEntity(). - if (isset($translated_entity->original) && $translated_entity->original instanceof ContentEntityInterface) { - if ($translated_entity->original->hasTranslation($language->getId())) { - $this->decryptEntity($translated_entity->original); + $translated_original = DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.2', + fn () => $translated_entity->getOriginal(), + fn () => $translated_entity->original, + ); + + if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { + if ($translated_original->hasTranslation($language->getId())) { + $this->decryptEntity($translated_original); } } } -- GitLab From 67344054335eb8af67bbabe912b3f2bba16af08e Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 15:28:43 +0900 Subject: [PATCH 04/12] this->original is NULLable --- src/ProcessEntities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index ddb000b..1f934ab 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -89,7 +89,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => $translated_entity->original, + fn () => $translated_entity->original ?? NULL, ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { @@ -129,7 +129,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => $translated_entity->original, + fn () => $translated_entity->original ?? NULL, ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { -- GitLab From 91e88c988abbc27bcd7c329dfdf479f15a2fd7b0 Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 15:51:05 +0900 Subject: [PATCH 05/12] try using property_exists --- src/ProcessEntities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index 1f934ab..d8aaceb 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -89,7 +89,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => $translated_entity->original ?? NULL, + fn () => property_exists($translated_entity, 'original') ? $translated_entity->original : NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { @@ -129,7 +129,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => $translated_entity->original ?? NULL, + fn () => property_exists($translated_entity, 'original') ? $translated_entity->original : NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { -- GitLab From 8a82fb79329fc4b5abb0c30641f364342739d76d Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 17:06:53 +0900 Subject: [PATCH 06/12] use isset() instead of property_exists() --- src/ProcessEntities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index d8aaceb..af865c7 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -89,7 +89,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => property_exists($translated_entity, 'original') ? $translated_entity->original : NULL + fn () => isset($translated_entity->original) ? $translated_entity->original : NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { @@ -129,7 +129,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => property_exists($translated_entity, 'original') ? $translated_entity->original : NULL + fn () => isset($translated_entity->original) ? $translated_entity->original : NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { -- GitLab From fb0c87bb73e0c194278f0e0e177888d964c1e8ed Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 17:11:58 +0900 Subject: [PATCH 07/12] use ?? --- src/ProcessEntities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index af865c7..18f0c75 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -89,7 +89,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => isset($translated_entity->original) ? $translated_entity->original : NULL + fn () => $translated_entity->original ?? NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { @@ -129,7 +129,7 @@ class ProcessEntities { \Drupal::VERSION, '11.2', fn () => $translated_entity->getOriginal(), - fn () => isset($translated_entity->original) ? $translated_entity->original : NULL + fn () => $translated_entity->original ?? NULL ); if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { -- GitLab From 027d3558f30ce457e94a0f65d43c96008108b729 Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 20:58:05 +0900 Subject: [PATCH 08/12] add code removal todo --- field_encrypt.install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/field_encrypt.install b/field_encrypt.install index 5cb2088..a2a71b4 100644 --- a/field_encrypt.install +++ b/field_encrypt.install @@ -28,6 +28,8 @@ function field_encrypt_uninstall(bool $is_syncing): void { /** * Implements hook_requirements(). + * + * Remove this function when the minimum Drupal version is 11.2. */ function field_encrypt_requirements(string $phase): array { $requirements = []; -- GitLab From 0cb17abde50e54fa828932b4b873498f597dbaee Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 23:04:34 +0900 Subject: [PATCH 09/12] remove isset() --- src/ProcessEntities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index 18f0c75..a88f7ae 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -91,7 +91,7 @@ class ProcessEntities { fn () => $translated_entity->getOriginal(), fn () => $translated_entity->original ?? NULL ); - if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { + if ($translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { $translated_original = $translated_original->getTranslation($language->getId()); $this->setEncryptedFieldValues($translated_original, 'getUnencryptedPlaceholderValue'); @@ -132,7 +132,7 @@ class ProcessEntities { fn () => $translated_entity->original ?? NULL ); - if (isset($translated_original) && $translated_original instanceof ContentEntityInterface) { + if ($translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { $this->decryptEntity($translated_original); } -- GitLab From 6db3a32935c27457008f3ac6ee482e7fd72b6bb4 Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 23:06:41 +0900 Subject: [PATCH 10/12] remove extra line --- src/ProcessEntities.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ProcessEntities.php b/src/ProcessEntities.php index a88f7ae..2512d02 100644 --- a/src/ProcessEntities.php +++ b/src/ProcessEntities.php @@ -131,7 +131,6 @@ class ProcessEntities { fn () => $translated_entity->getOriginal(), fn () => $translated_entity->original ?? NULL ); - if ($translated_original instanceof ContentEntityInterface) { if ($translated_original->hasTranslation($language->getId())) { $this->decryptEntity($translated_original); -- GitLab From 4b388e736464e248f1e39023b4f199a947874a3c Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 23:17:01 +0900 Subject: [PATCH 11/12] do deprecation dance in FieldEncryptTestHooks --- .../src/Hook/FieldEncryptTestHooks.php | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php b/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php index ea2288a..8f23551 100644 --- a/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php +++ b/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php @@ -41,9 +41,17 @@ class FieldEncryptTestHooks { $this->messenger->addMessage( $this->t('Field encrypt test hook_entity_update: @label', ['@label' => $entity->label()]) ); - if (isset($entity->original)) { + $original_entity = DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.2', + fn () => $entity->getOriginal(), + fn () => $entity->original ?? NULL + ); + if (isset($original_entity)) { $this->messenger->addMessage( - $this->t('Field encrypt test hook_entity_update: Original label -> @label', ['@label' => $entity->original->label()]) + $this->t('Field encrypt test hook_entity_update: Original label -> @label', [ + '@label' => $original_entity->label(), + ]) ); } } @@ -55,11 +63,21 @@ class FieldEncryptTestHooks { #[Hook('node_update')] public function nodeUpdate(EntityInterface $entity): void { $this->messenger->addMessage( - $this->t('Field encrypt test hook_ENTITY_TYPE_update: @label', ['@label' => $entity->label()]) + $this->t('Field encrypt test hook_ENTITY_TYPE_update: @label', [ + '@label' => $entity->label(), + ]) + ); + $original_entity = DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.2', + fn () => $entity->getOriginal(), + fn () => $entity->original ?? NULL ); - if (isset($entity->original)) { + if (isset($original_entity)) { $this->messenger->addMessage( - $this->t('Field encrypt test hook_ENTITY_TYPE_update: Original label -> @label', ['@label' => $entity->original->label()]) + $this->t('Field encrypt test hook_ENTITY_TYPE_update: Original label -> @label', [ + '@label' => $original_entity->label(), + ]) ); } } -- GitLab From 8510eb71ae6370c41bd1d3cff19b85ed3575d2ce Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Wed, 14 May 2025 23:21:21 +0900 Subject: [PATCH 12/12] import class --- .../field_encrypt_test/src/Hook/FieldEncryptTestHooks.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php b/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php index 8f23551..c63f404 100644 --- a/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php +++ b/tests/modules/field_encrypt_test/src/Hook/FieldEncryptTestHooks.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Drupal\field_encrypt_test\Hook; +use Drupal\Component\Utility\DeprecationHelper; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; -- GitLab