diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php index bcf0f3d..633291a 100644 --- a/core/lib/Drupal/Core/Entity/EntityManager.php +++ b/core/lib/Drupal/Core/Entity/EntityManager.php @@ -499,12 +499,15 @@ public function getFieldDefinitions($entity_type, $bundle = NULL) { // Enforce fields to be multiple and untranslatable by default. $entity_info = $this->getDefinition($entity_type); $keys = array_intersect_key(array_filter($entity_info['entity_keys']), array_flip(array('id', 'revision', 'uuid', 'bundle'))); - $base_fields = array_flip(array('langcode') + $keys); + $untranslatable_fields = array_flip(array('langcode') + $keys); foreach (array('definitions', 'optional') as $key) { foreach ($this->entityFieldInfo[$entity_type][$key] as $name => &$definition) { $definition['list'] = TRUE; - // Ensure base fields are never made translatable. - if (isset($base_fields[$name]) || !isset($definition['translatable'])) { + // Ensure ids and langcode fields are never made translatable. + if (isset($untranslatable_fields[$name]) && !empty($definition['translatable'])) { + throw new \LogicException(format_string('The @field field cannot be translatable.', array('@field' => $definition['label']))); + } + if (!isset($definition['translatable'])) { $definition['translatable'] = FALSE; } } diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php index 5e663ca..38e4c23 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php @@ -9,6 +9,7 @@ use Drupal\Core\Language\Language; use Drupal\Core\TypedData\TranslatableInterface; +use Drupal\entity_test\Entity\EntityTestMulRev; /** * Tests entity translation. @@ -491,4 +492,42 @@ function testEntityTranslationAPI() { $this->assertEqual($field->getLangcode(), $langcode2, 'Field object has the expected langcode.'); } + /** + * Check that field translatability is handled properly. + */ + function testFieldDefinitions() { + // Check that field translatability can be altered to be enabled or disabled + // in field definitions. + $entity_type = 'entity_test_mulrev'; + $this->state->set('entity_test.field_definitions.translatable', array('name' => FALSE)); + $this->entityManager->clearCachedFieldDefinitions(); + $definitions = $this->entityManager->getFieldDefinitions($entity_type); + $this->assertFalse($definitions['name']['translatable'], 'Field translatability can be disabled programmatically.'); + + $this->state->set('entity_test.field_definitions.translatable', array('name' => TRUE)); + $this->entityManager->clearCachedFieldDefinitions(); + $definitions = $this->entityManager->getFieldDefinitions($entity_type); + $this->assertTrue($definitions['name']['translatable'], 'Field translatability can be enabled programmatically.'); + + // Check that field translatability is disabled by default. + $base_field_definitions = EntityTestMulRev::baseFieldDefinitions($entity_type); + $this->assertTrue(!isset($base_field_definitions['id']['translatable']), 'Translatability for the id field is not defined.'); + $this->assertFalse($definitions['id']['translatable'], 'Field translatability is disabled by default.'); + + // Check that entity ids and langcode fields cannot be translatable. + foreach (array('id', 'uuid', 'revision_id', 'type', 'langcode') as $name) { + $this->state->set('entity_test.field_definitions.translatable', array($name => TRUE)); + $this->entityManager->clearCachedFieldDefinitions(); + $message = format_string('Field %field cannot be translatable.', array('%field' => $name)); + + try { + $definitions = $this->entityManager->getFieldDefinitions($entity_type); + $this->fail($message); + } + catch (\LogicException $e) { + $this->pass($message); + } + } + } + } diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module index cc8800e..e949e50 100644 --- a/core/modules/system/tests/modules/entity_test/entity_test.module +++ b/core/modules/system/tests/modules/entity_test/entity_test.module @@ -73,6 +73,17 @@ function entity_test_entity_info_alter(&$info) { } /** + * Implements hook_entity_field_info_alter(). + */ +function entity_test_entity_field_info_alter(&$info, $entity_type) { + if ($entity_type == 'entity_test_mulrev' && ($names = \Drupal::state()->get('entity_test.field_definitions.translatable'))) { + foreach ($names as $name => $value) { + $info['definitions'][$name]['translatable'] = $value; + } + } +} + +/** * Creates a new bundle for entity_test entities. * * @param string $bundle