diff --git a/scheduled_transitions.module b/scheduled_transitions.module index d28048e..28eb2f4 100644 --- a/scheduled_transitions.module +++ b/scheduled_transitions.module @@ -61,7 +61,7 @@ function scheduled_transitions_entity_type_build(array &$entity_types) { /** * Implements hook_entity_delete(). * - * @see \Drupal\scheduled_transitions\ScheduledTransitionsEntityHooks::entityTypeBuild + * @see \Drupal\scheduled_transitions\ScheduledTransitionsEntityHooks::entityDelete */ function scheduled_transitions_entity_delete(EntityInterface $entity): void { \Drupal::classResolver(ScheduledTransitionsEntityHooks::class) @@ -69,9 +69,19 @@ function scheduled_transitions_entity_delete(EntityInterface $entity): void { } /** + * Implements hook_entity_translation_delete(). + * + * @see \Drupal\scheduled_transitions\ScheduledTransitionsEntityHooks::entityDelete() + */ +function scheduled_transitions_entity_translation_delete(EntityInterface $entity): void { + \Drupal::classResolver(ScheduledTransitionsEntityHooks::class) + ->entityDelete($entity); +} + +/** * Implements hook_entity_revision_delete(). * - * @see \Drupal\scheduled_transitions\ScheduledTransitionsEntityHooks::entityTypeBuild + * @see \Drupal\scheduled_transitions\ScheduledTransitionsEntityHooks::entityRevisionDelete */ function scheduled_transitions_entity_revision_delete(EntityInterface $entity): void { \Drupal::classResolver(ScheduledTransitionsEntityHooks::class) diff --git a/src/ScheduledTransitionsEntityHooks.php b/src/ScheduledTransitionsEntityHooks.php index 80eda49..4d8c62c 100644 --- a/src/ScheduledTransitionsEntityHooks.php +++ b/src/ScheduledTransitionsEntityHooks.php @@ -10,6 +10,7 @@ use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Entity\TranslatableInterface; use Drupal\scheduled_transitions\Form\Entity\ScheduledTransitionAddForm; use Drupal\scheduled_transitions\Form\ScheduledTransitionForm; use Drupal\scheduled_transitions\Form\ScheduledTransitionsSettingsForm as SettingsForm; @@ -214,6 +215,9 @@ class ScheduledTransitionsEntityHooks implements ContainerInjectionInterface { if ($revision_match) { $query->condition('entity_revision_id', $entity->getRevisionId()); } + if ($entity instanceof TranslatableInterface && !$entity->isDefaultTranslation()) { + $query->condition('entity_revision_langcode', $entity->language()->getId()); + } $ids = $query->execute(); return $transitionStorage->loadMultiple($ids); } diff --git a/tests/src/Kernel/ScheduledTransitionTest.php b/tests/src/Kernel/ScheduledTransitionTest.php index 4a551a5..ba3b3f1 100644 --- a/tests/src/Kernel/ScheduledTransitionTest.php +++ b/tests/src/Kernel/ScheduledTransitionTest.php @@ -359,6 +359,76 @@ class ScheduledTransitionTest extends KernelTestBase { } /** + * Test scheduled transitions are cleaned up when translations are deleted. + */ + public function testScheduledTransitionEntityTranslationCleanUp() { + ConfigurableLanguage::createFromLangcode('de')->save(); + ConfigurableLanguage::createFromLangcode('fr')->save(); + + $workflow = $this->createEditorialWorkflow(); + $workflow->getTypePlugin()->addEntityTypeAndBundle('st_entity_test', 'st_entity_test'); + $workflow->save(); + + $entity = TestEntity::create(['type' => 'st_entity_test']); + $de = $entity->addTranslation('de'); + $fr = $entity->addTranslation('fr'); + $de->name = 'deName'; + $fr->name = 'frName'; + $de->moderation_state = 'draft'; + $fr->moderation_state = 'draft'; + $entity->save(); + + $originalDeRevisionId = $de->getRevisionId(); + $originalFrRevisionId = $fr->getRevisionId(); + $this->assertEquals(1, $entity->id()); + $this->assertEquals(1, $entity->getRevisionId()); + $this->assertEquals(1, $originalDeRevisionId); + $this->assertEquals(1, $originalFrRevisionId); + + $author = User::create([ + 'uid' => 2, + 'name' => $this->randomMachineName(), + ]); + $author->save(); + $scheduledTransition = ScheduledTransition::create([ + 'entity' => $entity, + 'entity_revision_id' => $originalDeRevisionId, + // Transition 'de'. + 'entity_revision_langcode' => 'de', + 'author' => $author, + 'workflow' => $workflow->id(), + 'moderation_state' => 'published', + 'transition_on' => (new \DateTime('2 Feb 2018 11am'))->getTimestamp(), + ]); + $scheduledTransition->save(); + $scheduledTransition = ScheduledTransition::create([ + 'entity' => $entity, + 'entity_revision_id' => $originalFrRevisionId, + // Transition 'fr'. + 'entity_revision_langcode' => 'fr', + 'author' => $author, + 'workflow' => $workflow->id(), + 'moderation_state' => 'published', + 'transition_on' => (new \DateTime('2 Feb 2018 11am'))->getTimestamp(), + ]); + $scheduledTransition->save(); + + $transitions = ScheduledTransition::loadMultiple(); + $this->assertCount(2, $transitions); + + // Delete a translation of the entity. + $entity->removeTranslation('fr'); + $entity->save(); + + $transitions = ScheduledTransition::loadMultiple(); + $this->assertCount(1, $transitions); + + /** @var \Drupal\scheduled_transitions\Entity\ScheduledTransitionInterface $transition */ + $transition = reset($transitions); + $this->assertEquals('de', $transition->getEntityRevisionLanguage()); + } + + /** * Test scheduled transitions are cleaned up when revisions are deleted. */ public function testScheduledTransitionEntityRevisionCleanUp() { @@ -507,7 +577,7 @@ class ScheduledTransitionTest extends KernelTestBase { $this->assertEquals(1, $entity->id()); $this->assertEquals(1, $entity->getRevisionId()); $this->assertEquals(1, $originalDeRevisionId); - $this->assertEquals(1, $originalDeRevisionId); + $this->assertEquals(1, $originalFrRevisionId); $author = User::create([ 'uid' => 2,