diff --git a/consumers.install b/consumers.install index 5354a0f..183274f 100644 --- a/consumers.install +++ b/consumers.install @@ -58,73 +58,7 @@ function consumers_update_8102() { * Make consumers translatable. */ function consumers_update_8103() { - $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); - $entity_type = $entity_definition_update_manager->getEntityType('consumer'); - $last_installed_field_storage_definitions = \Drupal::service('entity.last_installed_schema.repository')->getLastInstalledFieldStorageDefinitions('consumer'); - - /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $storage */ - - // Initialize the storage with the currently installed entity type and field storage definitions. - $storage = \Drupal::entityTypeManager()->getStorage('consumer'); - $storage->setEntityType($entity_type); - $storage->setTableMapping($storage->getTableMapping($last_installed_field_storage_definitions)); - - // Load all consumers and convert them to raw arrays. The entity always loads the live field definitions, so we - // have to explicitly unset the langcode and default_langcode keys so that it will create proper default values for - // those. - $consumers = array_map(function (Consumer $consumer) { - $values = $consumer->toArray(); - unset($values['langcode'], $values['default_langcode']); - return $values; - }, $storage->loadMultiple()); - - // Now, truncate the table to delete the data. - \Drupal::database()->truncate('consumer')->execute(); - - // Make the entity type translatable. - $entity_type->set('translatable', TRUE); - $entity_type->set('data_table', 'consumer_field_data'); - $keys = $entity_type->getKeys(); - $keys['langcode'] = 'langcode'; - $entity_type->set('entity_keys', $keys); - - $entity_definition_update_manager->updateEntityType($entity_type); - - // Create the new fields. - $langcode_field = BaseFieldDefinition::create('language') - ->setLabel(t('Language')) - ->setDisplayOptions('view', [ - 'region' => 'hidden', - ]) - ->setDisplayOptions('form', [ - 'type' => 'language_select', - 'weight' => 2, - ]) - ->setRevisionable(TRUE) - ->setTranslatable(TRUE); - - $default_langcode_field = BaseFieldDefinition::create('boolean') - ->setLabel(t('Default translation')) - ->setDescription(t('A flag indicating whether this is the default translation.')) - ->setTranslatable(TRUE) - ->setRevisionable(TRUE) - ->setDefaultValue(TRUE); - - $entity_definition_update_manager->installFieldStorageDefinition('langcode', $entity_type->id(), 'consumers', $langcode_field); - $entity_definition_update_manager->installFieldStorageDefinition('default_langcode', $entity_type->id(), 'consumers', $default_langcode_field); - - // Resave all consumers, make sure they are treated as new entities and get the new default values and so on. - foreach ($consumers as $values) { - $new_consumer = Consumer::create($values); - - // Special handling for the secret field added by simple_oauth, make sure that it is not hashed again. - if ($new_consumer->hasField('secret')) { - $new_consumer->get('secret')->pre_hashed = TRUE; - } - - $new_consumer->save(); - } - + // Replaced by consumers_post_update_make_consumer_entity_type_translatable(). } /** diff --git a/consumers.post_update.php b/consumers.post_update.php new file mode 100644 index 0000000..417c102 --- /dev/null +++ b/consumers.post_update.php @@ -0,0 +1,54 @@ +getEntityType('consumer'); + + // If the entity type is already translatable, there's nothing we need to do. + if ($entity_type->isTranslatable()) { + return; + } + + // Make the entity type translatable. + $entity_type->set('translatable', TRUE); + $entity_type->set('data_table', 'consumer_field_data'); + $keys = $entity_type->getKeys(); + $keys['langcode'] = 'langcode'; + $entity_type->set('entity_keys', $keys); + + // Create the new fields. + $field_storage_definitions = \Drupal::service('entity.last_installed_schema.repository')->getLastInstalledFieldStorageDefinitions('consumer'); + $field_storage_definitions['langcode'] = BaseFieldDefinition::create('language') + ->setLabel(t('Language')) + ->setDisplayOptions('view', [ + 'region' => 'hidden', + ]) + ->setDisplayOptions('form', [ + 'type' => 'language_select', + 'weight' => 2, + ]) + ->setRevisionable(TRUE) + ->setTranslatable(TRUE) + ->setName('langcode') + ->setTargetEntityTypeId('consumer') + ->setTargetBundle(NULL); + + $field_storage_definitions['default_langcode'] = BaseFieldDefinition::create('boolean') + ->setLabel(t('Default translation')) + ->setDescription(t('A flag indicating whether this is the default translation.')) + ->setTranslatable(TRUE) + ->setRevisionable(TRUE) + ->setDefaultValue(TRUE) + ->setName('default_langcode') + ->setTargetEntityTypeId('consumer') + ->setTargetBundle(NULL); + + $entity_definition_update_manager->updateFieldableEntityType($entity_type, $field_storage_definitions, $sandbox); + + return t('Consumers have been converted to be translatable.'); +} diff --git a/src/ConsumerStorage.php b/src/ConsumerStorage.php new file mode 100644 index 0000000..fc97f16 --- /dev/null +++ b/src/ConsumerStorage.php @@ -0,0 +1,22 @@ +hasField('secret')) { + $entity->get('secret')->pre_hashed = TRUE; + } + parent::restore($entity); + } + +} diff --git a/src/Entity/Consumer.php b/src/Entity/Consumer.php index 10d50ab..eb080cf 100644 --- a/src/Entity/Consumer.php +++ b/src/Entity/Consumer.php @@ -33,6 +33,7 @@ use Drupal\consumers\EntityOwnerTrait; * }, * "views_data" = "\Drupal\views\EntityViewsData", * "access" = "Drupal\consumers\AccessControlHandler", + * "storage" = "Drupal\consumers\ConsumerStorage", * }, * base_table = "consumer", * data_table = "consumer_field_data",