function SqlFieldableEntityTypeListenerTrait::onFieldableEntityTypeUpdate
Same name in other branches
- 9 core/lib/Drupal/Core/Entity/Sql/SqlFieldableEntityTypeListenerTrait.php \Drupal\Core\Entity\Sql\SqlFieldableEntityTypeListenerTrait::onFieldableEntityTypeUpdate()
- 10 core/lib/Drupal/Core/Entity/Sql/SqlFieldableEntityTypeListenerTrait.php \Drupal\Core\Entity\Sql\SqlFieldableEntityTypeListenerTrait::onFieldableEntityTypeUpdate()
- 11.x core/lib/Drupal/Core/Entity/Sql/SqlFieldableEntityTypeListenerTrait.php \Drupal\Core\Entity\Sql\SqlFieldableEntityTypeListenerTrait::onFieldableEntityTypeUpdate()
1 call to SqlFieldableEntityTypeListenerTrait::onFieldableEntityTypeUpdate()
- SqlContentEntityStorageSchema::onFieldableEntityTypeUpdate in core/
lib/ Drupal/ Core/ Entity/ Sql/ SqlContentEntityStorageSchema.php - Reacts to the update of a fieldable entity type.
File
-
core/
lib/ Drupal/ Core/ Entity/ Sql/ SqlFieldableEntityTypeListenerTrait.php, line 24
Class
- SqlFieldableEntityTypeListenerTrait
- Helper methods for EntityTypeListenerInterface.
Namespace
Drupal\Core\Entity\SqlCode
public function onFieldableEntityTypeUpdate(EntityTypeInterface $entity_type, EntityTypeInterface $original, array $field_storage_definitions, array $original_field_storage_definitions, array &$sandbox = NULL) {
/** @var \Drupal\Core\Entity\EntityStorageInterface $original_storage */
$original_storage = $this->entityTypeManager
->createHandlerInstance($original->getStorageClass(), $original);
$has_data = $original_storage->hasData();
// If 'progress' is not set, then this will be the first run of the batch.
if (!isset($sandbox['progress'])) {
// We cannot support updating the schema of an entity type from
// revisionable to non-revisionable or translatable to non-translatable
// because that can lead to unintended data loss.
// @todo Add support for these conversions in case there is no data loss.
// @see https://www.drupal.org/project/drupal/issues/3024727
$convert_rev_to_non_rev = $original->isRevisionable() && !$entity_type->isRevisionable();
$convert_mul_to_non_mul = $original->isTranslatable() && !$entity_type->isTranslatable();
if ($has_data && ($convert_rev_to_non_rev || $convert_mul_to_non_mul)) {
throw new EntityStorageException('Converting an entity type from revisionable to non-revisionable or from translatable to non-translatable is not supported.');
}
// Check that the fields required by a revisionable entity type exist.
if ($entity_type->isRevisionable() && !isset($field_storage_definitions[$entity_type->getKey('revision')])) {
throw new EntityStorageException('Missing revision field.');
}
if ($entity_type->isRevisionable() && !isset($field_storage_definitions[$entity_type->getRevisionMetadataKey('revision_default')])) {
throw new EntityStorageException('Missing revision_default field.');
}
// Check that the fields required by a translatable entity type exist.
if ($entity_type->isTranslatable() && !isset($field_storage_definitions[$entity_type->getKey('langcode')])) {
throw new EntityStorageException('Missing langcode field.');
}
if ($entity_type->isTranslatable() && !isset($field_storage_definitions[$entity_type->getKey('default_langcode')])) {
throw new EntityStorageException('Missing default_langcode field.');
}
// Check that the fields required by a revisionable and translatable
// entity type exist.
if ($entity_type->isRevisionable() && $entity_type->isTranslatable() && !isset($field_storage_definitions[$entity_type->getKey('revision_translation_affected')])) {
throw new EntityStorageException('Missing revision_translation_affected field.');
}
$this->preUpdateEntityTypeSchema($entity_type, $original, $field_storage_definitions, $original_field_storage_definitions, $sandbox);
}
// Copy data from the original storage to the temporary one.
if ($has_data) {
$this->copyData($entity_type, $original, $field_storage_definitions, $original_field_storage_definitions, $sandbox);
}
else {
// If there is no existing data, we still need to run the
// post-schema-update tasks.
$sandbox['#finished'] = 1;
}
// If the data copying has finished successfully, allow the storage schema
// to do any required cleanup tasks. For example, this process should take
// care of transforming the temporary storage into the current storage.
if ($sandbox['#finished'] == 1) {
$this->postUpdateEntityTypeSchema($entity_type, $original, $field_storage_definitions, $original_field_storage_definitions, $sandbox);
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.