diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module index 7c72b84..2ecea26 100644 --- a/core/modules/content_translation/content_translation.module +++ b/core/modules/content_translation/content_translation.module @@ -14,6 +14,7 @@ use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; +use Drupal\language\ContentLanguageSettingsInterface; /** * Implements hook_help(). @@ -192,6 +193,63 @@ function content_translation_entity_base_field_info(EntityTypeInterface $entity_ } /** + * Implements hook_ENTITY_TYPE_insert() for language content settings. + */ +function content_translation_language_content_settings_insert(ContentLanguageSettingsInterface $settings) { + // @see \Drupal\content_translation\ContentTranslationManager::isEnabled() + if ($settings->getThirdPartySetting('content_translation', 'enabled', FALSE)) { + /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */ + $field_manager = \Drupal::service('entity_field.manager'); + /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $schema_repository */ + $schema_repository = \Drupal::service('entity.last_installed_schema.repository'); + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + $entity_type_id = $settings->getTargetEntityTypeId(); + + $field_manager->useCaches(FALSE); + $storage_definitions = $field_manager->getFieldStorageDefinitions($entity_type_id); + $field_manager->useCaches(TRUE); + $installed_storage_definitions = $schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id); + + foreach (array_diff_key($storage_definitions, $installed_storage_definitions) as $storage_definition) { + /** @var $storage_definition \Drupal\Core\Field\FieldStorageDefinitionInterface */ + if ($storage_definition->getProvider() == 'content_translation') { + $definition_update_manager->installFieldStorageDefinition($storage_definition->getName(), $entity_type_id, 'content_translation', $storage_definition); + } + } + } +} + +/** + * Implements hook_ENTITY_TYPE_update() for language content settings. + */ +function content_translation_language_content_settings_update(ContentLanguageSettingsInterface $settings) { + /** @var \Drupal\language\ContentLanguageSettingsInterface $original_settings */ + $original_settings = $settings->original; + // @see \Drupal\content_translation\ContentTranslationManager::isEnabled() + if ($settings->getThirdPartySetting('content_translation', 'enabled', FALSE) + && !$original_settings->getThirdPartySetting('content_translation', 'enabled', FALSE) + ) { + /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */ + $field_manager = \Drupal::service('entity_field.manager'); + /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $schema_repository */ + $schema_repository = \Drupal::service('entity.last_installed_schema.repository'); + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + $entity_type_id = $settings->getTargetEntityTypeId(); + + $field_manager->useCaches(FALSE); + $storage_definitions = $field_manager->getFieldStorageDefinitions($entity_type_id); + $field_manager->useCaches(TRUE); + $installed_storage_definitions = $schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id); + foreach (array_diff_key($storage_definitions, $installed_storage_definitions) as $storage_definition) { + /** @var $storage_definition \Drupal\Core\Field\FieldStorageDefinitionInterface */ + if ($storage_definition->getProvider() == 'content_translation') { + $definition_update_manager->installFieldStorageDefinition($storage_definition->getName(), $entity_type_id, 'content_translation', $storage_definition); + } + } + } +} + +/** * Implements hook_field_info_alter(). * * Content translation extends the @FieldType annotation with following key: diff --git a/core/modules/content_translation/content_translation.services.yml b/core/modules/content_translation/content_translation.services.yml index f7cc11f..8d4740f 100644 --- a/core/modules/content_translation/content_translation.services.yml +++ b/core/modules/content_translation/content_translation.services.yml @@ -23,10 +23,4 @@ services: content_translation.manager: class: Drupal\content_translation\ContentTranslationManager - arguments: ['@entity.manager', '@content_translation.updates_manager'] - - content_translation.updates_manager: - class: Drupal\content_translation\ContentTranslationUpdatesManager - arguments: ['@entity.manager', '@entity.definition_update_manager'] - tags: - - { name: event_subscriber } + arguments: ['@entity.manager'] diff --git a/core/modules/content_translation/src/ContentTranslationManager.php b/core/modules/content_translation/src/ContentTranslationManager.php index da8bd1c..7e05f9b 100644 --- a/core/modules/content_translation/src/ContentTranslationManager.php +++ b/core/modules/content_translation/src/ContentTranslationManager.php @@ -18,23 +18,13 @@ class ContentTranslationManager implements ContentTranslationManagerInterface { protected $entityManager; /** - * The updates manager. - * - * @var \Drupal\content_translation\ContentTranslationUpdatesManager - */ - protected $updatesManager; - - /** * Constructs a ContentTranslationManageAccessCheck object. * * @param \Drupal\Core\Entity\EntityManagerInterface $manager * The entity type manager. - * @param \Drupal\content_translation\ContentTranslationUpdatesManager $updates_manager - * The updates manager. */ - public function __construct(EntityManagerInterface $manager, ContentTranslationUpdatesManager $updates_manager) { + public function __construct(EntityManagerInterface $manager) { $this->entityManager = $manager; - $this->updatesManager = $updates_manager; } /** @@ -81,8 +71,6 @@ public function getSupportedEntityTypes() { public function setEnabled($entity_type_id, $bundle, $value) { $config = $this->loadContentLanguageSettings($entity_type_id, $bundle); $config->setThirdPartySetting('content_translation', 'enabled', $value)->save(); - $entity_type = $this->entityManager->getDefinition($entity_type_id); - $this->updatesManager->updateDefinitions([$entity_type_id => $entity_type]); } /** diff --git a/core/modules/content_translation/src/ContentTranslationUpdatesManager.php b/core/modules/content_translation/src/ContentTranslationUpdatesManager.php deleted file mode 100644 index 4fa54f3..0000000 --- a/core/modules/content_translation/src/ContentTranslationUpdatesManager.php +++ /dev/null @@ -1,104 +0,0 @@ -entityManager = $entity_manager; - $this->updateManager = $update_manager; - } - - /** - * Executes field storage definition updates if needed. - * - * @param array $entity_types - * A list of entity type definitions to be processed. - */ - public function updateDefinitions(array $entity_types) { - // Handle field storage definition creation, if needed. - // @todo Generalize this code in https://www.drupal.org/node/2346013. - // @todo Handle initial values in https://www.drupal.org/node/2346019. - if ($this->updateManager->needsUpdates()) { - foreach ($entity_types as $entity_type_id => $entity_type) { - $storage_definitions = $this->entityManager->getFieldStorageDefinitions($entity_type_id); - $installed_storage_definitions = $this->entityManager->getLastInstalledFieldStorageDefinitions($entity_type_id); - foreach (array_diff_key($storage_definitions, $installed_storage_definitions) as $storage_definition) { - /** @var $storage_definition \Drupal\Core\Field\FieldStorageDefinitionInterface */ - if ($storage_definition->getProvider() == 'content_translation') { - $this->updateManager->installFieldStorageDefinition($storage_definition->getName(), $entity_type_id, 'content_translation', $storage_definition); - } - } - } - } - } - - /** - * Listener for the ConfigImporter import event. - */ - public function onConfigImporterImport() { - $entity_types = array_filter($this->entityManager->getDefinitions(), function (EntityTypeInterface $entity_type) { - return $entity_type->isTranslatable(); - }); - $this->updateDefinitions($entity_types); - } - - /** - * Listener for migration imports. - */ - public function onMigrateImport(MigrateImportEvent $event) { - $migration = $event->getMigration(); - $configuration = $migration->getDestinationConfiguration(); - $entity_types = NestedArray::getValue($configuration, ['content_translation_update_definitions']); - if ($entity_types) { - $entity_types = array_intersect_key($this->entityManager->getDefinitions(), array_flip($entity_types)); - $this->updateDefinitions($entity_types); - } - } - - /** - * {@inheritdoc} - */ - public static function getSubscribedEvents() { - $events[ConfigEvents::IMPORT][] = ['onConfigImporterImport', 60]; - if (class_exists('\Drupal\migrate\Event\MigrateEvents')) { - $events[MigrateEvents::POST_IMPORT][] = ['onMigrateImport']; - } - return $events; - } - -} diff --git a/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateLanguageContentSettingsTest.php b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateLanguageContentSettingsTest.php index 0420d70..33ac603 100644 --- a/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateLanguageContentSettingsTest.php +++ b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateLanguageContentSettingsTest.php @@ -25,6 +25,7 @@ protected function setUp() { parent::setUp(); $this->installConfig(['node']); + $this->installEntitySchema('node'); $this->executeMigrations(['d6_node_type', 'd6_language_content_settings']); } diff --git a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageContentSettingsTest.php b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageContentSettingsTest.php index defc6cd..3cbf1d6 100644 --- a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageContentSettingsTest.php +++ b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateLanguageContentSettingsTest.php @@ -24,6 +24,7 @@ protected function setUp() { parent::setUp(); $this->installConfig(['node']); + $this->installEntitySchema('node'); $this->executeMigrations(['d7_node_type', 'd7_language_content_settings']); }