diff --git a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php index 24b3224..d404862 100644 --- a/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php +++ b/src/Plugin/Field/FieldType/EntityReferenceRevisionsItem.php @@ -282,6 +282,18 @@ class EntityReferenceRevisionsItem extends EntityReferenceItem implements Option } } if ($needs_save) { + + if($is_affected){ + $languages = $host->getTranslationLanguages(); + foreach ($languages as $langcode => $language) { + $translation = $host->getTranslation($langcode); + if($this->entity->hasTranslation($langcode) && $this->entity->getTranslation($langcode)->isRevisionTranslationAffected() && $this->target_revision_id != $this->entity->getRevisionId()){ + $translation->setRevisionTranslationAffected(TRUE); + $translation->setRevisionTranslationAffectedEnforced(TRUE); + } + } + } + $this->entity->save(); } } diff --git a/tests/src/Kernel/EntityReferenceRevisionsCompositeTest.php b/tests/src/Kernel/EntityReferenceRevisionsCompositeTest.php index 1509e44..dcd7950 100644 --- a/tests/src/Kernel/EntityReferenceRevisionsCompositeTest.php +++ b/tests/src/Kernel/EntityReferenceRevisionsCompositeTest.php @@ -149,11 +149,37 @@ class EntityReferenceRevisionsCompositeTest extends EntityKernelTestBase { $this->assertNotEqual('2nd revision', $node->getTitle(), 'Node did not keep changed title after reversion.'); $this->assertNotEqual($original_composite_revision, $node->composite_reference[0]->target_revision_id, 'Composite entity got new revision when its host reverted to an old revision.'); - // Test that removing/changing composite references results in translation + // Test that removing composite references results in translation // changes. $node->set('composite_reference', []); $this->assertTrue($node->hasTranslationChanges()); + // Test that changing composite reference results in translation + // changes. + $changed_composite_reference = $composite; + $changed_composite_reference->set('name','Changing composite reference'); + + $this->assertTrue($changed_composite_reference->isRevisionTranslationAffected()); + + $node->set('composite_reference', $changed_composite_reference); + $node->setNewRevision(); + $this->assertTrue($node->hasTranslationChanges()); + $node->save(); + $node = node_load($node->id(), TRUE); + + // Check the composite has changed + $this->assertEquals('Changing composite reference', $node->get('composite_reference')->entity->getName()); + + // Make sure node had 4 revisions + $node_revisions_count = \Drupal::entityQuery('node')->condition('nid', $node->id())->allRevisions()->count()->execute(); + $this->assertEqual($node_revisions_count, 4); + + // Make sure node has no revision with + // revision translation affected set to NULL + + $node_revisions_count = \Drupal::entityQuery('node')->condition('nid', $node->id())->allRevisions()->condition('revision_translation_affected',NULL, 'IS NULL')->count()->execute(); + $this->assertEqual($node_revisions_count, 0, 'Node have a revision with revision translation affected set to NULL'); + // Revert the changes to avoid interfering with the delete test. $node->set('composite_reference', $composite); diff --git a/tests/src/Kernel/EntityReferenceRevisionsCompositeTranslationTest.php b/tests/src/Kernel/EntityReferenceRevisionsCompositeTranslationTest.php index fbe4c14..fb0425f 100644 --- a/tests/src/Kernel/EntityReferenceRevisionsCompositeTranslationTest.php +++ b/tests/src/Kernel/EntityReferenceRevisionsCompositeTranslationTest.php @@ -439,6 +439,63 @@ class EntityReferenceRevisionsCompositeTranslationTest extends EntityKernelTestB } + public function testCompositeTranslation(){ + /** @var \Drupal\node\NodeStorageInterface $node_storage */ + $node_storage = \Drupal::entityTypeManager()->getStorage('node'); + + // Create a composite entity. + $composite = EntityTestCompositeRelationship::create([ + 'langcode' => 'en', + 'name' => 'Initial Source Composite', + ]); + $composite->save(); + + // Create a node with a reference to the test composite entity. + $node = Node::create([ + 'langcode' => 'en', + 'title' => 'Initial Source Node', + 'type' => 'article', + 'composite_reference' => $composite, + ]); + $node->save(); + + /** @var \Drupal\node\NodeInterface $node */ + $node = $node_storage->load($node->id()); + + // Assert that there is only 1 revision when creating a node. + $this->assertRevisionCount(1, $node); + // Assert there is no new composite revision after creating a host entity. + $this->assertRevisionCount(1, $composite); + + $node_de = $node->addTranslation('de', ['title' => 'New Node #1 DE'] + $node->toArray()); + $node_de = $node_storage->createRevision($node_de, FALSE); + + $node_de->get('composite_reference')->entity->getTranslation('de')->set('name', 'New Composite #1 DE'); + $node_de->isDefaultRevision(TRUE); + $violations = $node_de->validate(); + foreach ($violations as $violation) { + $this->fail($violation->getPropertyPath() . ': ' . $violation->getMessage()); + } + $this->assertEquals(0, count($violations)); + $node_de->save(); + + // Test that changing composite non default language (DE) reference results in translation + // changes for the for this language but not for the default language . + $node_de->get('composite_reference')->entity->getTranslation('de')->set('name', 'Change Composite #1 DE'); + $node_de->setNewRevision(); + $node_de->save(); + + $this->assertEquals('Change Composite #1 DE', $node_de->get('composite_reference')->entity->getTranslation('de')->getName()); + + // Make sure node has no revision with + // revision translation affected set to NULL for language DE + $node_revisions_count = \Drupal::entityQuery('node')->condition('nid', $node_de->id())->allRevisions()->condition('revision_translation_affected',NULL, 'IS NULL')->condition('langcode','de', '=')->count()->execute(); + $this->assertEqual($node_revisions_count, 0, 'Node have a revision of non default language with revision translation affected set to NULL'); + + $node_revisions_count = \Drupal::entityQuery('node')->condition('nid', $node_de->id())->allRevisions()->condition('revision_translation_affected',NULL, 'IS NULL')->condition('langcode','en', '=')->count()->execute(); + $this->assertEqual($node_revisions_count, 1, 'Node have a revision of default language with revision translation affected not set to NULL'); + } + /** * Asserts the revision count of an entity. *