function system_update_8501

Add the 'revision_default' field to all relevant entity types.

File

core/modules/system/system.install, line 2456

Code

function system_update_8501() {
    $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
    // Clear the cached entity type definitions so we get the new
    // 'revision_default' revision metadata key.
    \Drupal::entityTypeManager()->clearCachedDefinitions();
    // Get a list of revisionable entity types.
    
    /** @var \Drupal\Core\Entity\ContentEntityTypeInterface[] $definitions */
    $definitions = array_filter(\Drupal::entityTypeManager()->getDefinitions(), function (EntityTypeInterface $entity_type) use ($definition_update_manager) {
        if ($entity_type = $definition_update_manager->getEntityType($entity_type->id())) {
            return $entity_type->isRevisionable();
        }
        return FALSE;
    });
    // Install the 'revision_default' field.
    foreach ($definitions as $entity_type_id => $entity_type) {
        $field_name = $entity_type->getRevisionMetadataKey('revision_default');
        // Install the 'revision_default' field if needed.
        if (!$definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id)) {
            // Make sure the new "revision_default" revision metadata key is available
            // also to code using the latest installed definition.
            $installed_entity_type = $definition_update_manager->getEntityType($entity_type_id);
            $revision_metadata_keys = $installed_entity_type->get('revision_metadata_keys');
            if (!isset($revision_metadata_keys['revision_default'])) {
                // Update the property holding the required revision metadata keys,
                // which is used by the BC layer for retrieving the revision metadata
                // keys.
                // @see \Drupal\Core\Entity\ContentEntityType::getRevisionMetadataKeys().
                $required_revision_metadata_keys = $installed_entity_type->get('requiredRevisionMetadataKeys');
                $required_revision_metadata_keys['revision_default'] = $field_name;
                $installed_entity_type->set('requiredRevisionMetadataKeys', $required_revision_metadata_keys);
                // Update the revision metadata keys to add the new required revision
                // metadata key "revision_default".
                $revision_metadata_keys['revision_default'] = $required_revision_metadata_keys['revision_default'];
                $installed_entity_type->set('revision_metadata_keys', $revision_metadata_keys);
                $definition_update_manager->updateEntityType($installed_entity_type);
            }
            $storage_definition = BaseFieldDefinition::create('boolean')->setLabel(t('Default revision'))
                ->setDescription(t('A flag indicating whether this was a default revision when it was saved.'))
                ->setStorageRequired(TRUE)
                ->setTranslatable(FALSE)
                ->setRevisionable(TRUE)
                ->setInitialValue(TRUE);
            $definition_update_manager->installFieldStorageDefinition($field_name, $entity_type_id, $entity_type_id, $storage_definition);
        }
        else {
            $variables = [
                '@entity_type_label' => $entity_type->getLabel(),
            ];
            if ($field_name === 'revision_default') {
                \Drupal::logger('system')->error('An existing "Default revision" field was found for the @entity_type_label entity type, but no "revision_default" revision metadata key was found in its definition.', $variables);
            }
            else {
                \Drupal::logger('system')->error('An existing "Default revision" field was found for the @entity_type_label entity type.', $variables);
            }
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.