diff --git a/sources/content/src/Controller/ContentTranslationPreviewController.php b/sources/content/src/Controller/ContentTranslationPreviewController.php index fe5ab964..0c194a67 100644 --- a/sources/content/src/Controller/ContentTranslationPreviewController.php +++ b/sources/content/src/Controller/ContentTranslationPreviewController.php @@ -122,7 +122,8 @@ class ContentTranslationPreviewController extends ControllerBase { $translation = $entity->getTranslation($target_langcode); - foreach ($data as $name => $field_data) { + foreach (Element::children($data) as $name) { + $field_data = $data[$name]; foreach (Element::children($field_data) as $delta) { $field_item = $field_data[$delta]; foreach (Element::children($field_item) as $property) { diff --git a/sources/content/src/DefaultFieldProcessor.php b/sources/content/src/DefaultFieldProcessor.php index dc5d94a3..c9962f8d 100644 --- a/sources/content/src/DefaultFieldProcessor.php +++ b/sources/content/src/DefaultFieldProcessor.php @@ -87,13 +87,11 @@ class DefaultFieldProcessor implements FieldProcessorInterface { // If there is translation data for the field property, save it. if (isset($property_data['#translation']['#text']) && $property_data['#translate']) { - if (!$field->offsetExists($delta)) { - $name = $field->getFieldDefinition()->getName(); - $translation = $field->getEntity(); - throw new \Exception("Offset $delta on field '$name' does not exist on entity " . $translation->getEntityTypeId() . '/' . $translation->id()); + // Only set the value if the offset currently exists on the entity. + // @todo: Should this create a new item instead? + if ($field->offsetExists($delta)) { + $field->offsetGet($delta)->set($property, $property_data['#translation']['#text']); } - - $field->offsetGet($delta)->set($property, $property_data['#translation']['#text']); } } } diff --git a/sources/content/tests/src/Kernel/ContentEntitySourceUnitTest.php b/sources/content/tests/src/Kernel/ContentEntitySourceUnitTest.php index 278f37ca..15309f46 100644 --- a/sources/content/tests/src/Kernel/ContentEntitySourceUnitTest.php +++ b/sources/content/tests/src/Kernel/ContentEntitySourceUnitTest.php @@ -68,7 +68,7 @@ class ContentEntitySourceUnitTest extends EntityKernelTestBase { // Make the test field translatable. $field_storage = FieldStorageConfig::loadByName('entity_test_mul', 'field_test_text'); - $field_storage->setCardinality(3); + $field_storage->setCardinality(4); $field_storage->save(); $field = FieldConfig::loadByName('entity_test_mul', 'entity_test_mul', 'field_test_text'); $field->setTranslatable(TRUE); @@ -128,35 +128,41 @@ class ContentEntitySourceUnitTest extends EntityKernelTestBase { 'langcode' => 'en', 'user_id' => 1, ); - $entity_test = entity_create($this->entityTypeId, $values); - $translation = $entity_test->getTranslation('en'); - $translation->name->value = $this->randomMachineName(); - $translation->field_test_text->appendItem([ + $entity_test = EntityTestMul::create($values); + $entity_test->name->value = $this->randomMachineName(); + $entity_test->field_test_text->appendItem([ 'value' => $this->randomMachineName(), 'format' => 'text_plain', ]); - $translation->field_test_text->appendItem([ + $entity_test->field_test_text->appendItem([ 'value' => $this->randomMachineName(), 'format' => 'text_plain', ]); - $translation->field_test_text->appendItem([ + $entity_test->field_test_text->appendItem([ 'value' => $this->randomMachineName(), 'format' => 'unallowed_format', ]); + // Add another item that will be removed again. + $entity_test->field_test_text->appendItem([ + 'value' => $this->randomMachineName(), + 'format' => 'text_plain', + ]); + $values = array( 'target_id' => $this->image->id(), 'alt' => $this->randomMachineName(), 'title' => $this->randomMachineName(), ); - $translation->image_test->appendItem($values); - $entity_test->save(); + $entity_test->image_test->appendItem($values); - $translation->ignored_field->appendItem([ + $entity_test->ignored_field->appendItem([ 'value' => 'This field should not be translated.', 'format' => 'text_plain', ]); + $entity_test->save(); + $job = tmgmt_job_create('en', 'de'); $job->translator = 'test_translator'; $job->save(); @@ -204,6 +210,15 @@ class ContentEntitySourceUnitTest extends EntityKernelTestBase { $this->assertEqual($data['field_test_text'][2]['format']['#translate'], FALSE); $this->assertFalse(isset($data['field_test_text'][2]['processed'])); + $this->assertEqual($data['field_test_text'][3]['#label'], 'Delta #3'); + $this->assertFalse(isset($data['field_test_text'][3]['value']['#label'])); + $this->assertEqual($data['field_test_text'][3]['value']['#text'], $entity_test->field_test_text[3]->value); + $this->assertEqual($data['field_test_text'][3]['value']['#translate'], TRUE); + $this->assertFalse(isset($data['field_test_text'][3]['format']['#label'])); + $this->assertEqual($data['field_test_text'][3]['format']['#text'], $entity_test->field_test_text[3]->format); + $this->assertEqual($data['field_test_text'][3]['format']['#translate'], FALSE); + $this->assertFalse(isset($data['field_test_text'][3]['processed'])); + // Test the image field. $image_item = $data['image_test'][0]; $this->assertEqual($data['image_test']['#label'], $this->image_label); @@ -223,6 +238,10 @@ class ContentEntitySourceUnitTest extends EntityKernelTestBase { // Now request a translation and save it back. $job->requestTranslation(); + + $entity_test->get('field_test_text')->offsetUnset(3); + $entity_test->save(); + $items = $job->getItems(); $item = reset($items); $item->acceptTranslation(); @@ -235,6 +254,10 @@ class ContentEntitySourceUnitTest extends EntityKernelTestBase { $this->assertEqual($translation->name->value, $data['name'][0]['value']['#translation']['#text']); $this->assertEqual($translation->field_test_text[0]->value, $data['field_test_text'][0]['value']['#translation']['#text']); $this->assertEqual($translation->field_test_text[1]->value, $data['field_test_text'][1]['value']['#translation']['#text']); + $this->assertEqual($translation->field_test_text[2]->value, $data['field_test_text'][2]['value']['#text']); + + // Ensure no item was created for the removed delta. + $this->assertFalse(isset($translation->field_test_text[3])); } /**