function menu_link_content_post_update_make_menu_link_content_revisionable

Update custom menu links to be revisionable.

1 string reference to 'menu_link_content_post_update_make_menu_link_content_revisionable'
menu_link_content_requirements in core/modules/menu_link_content/menu_link_content.install
Implements hook_requirements().

File

core/modules/menu_link_content/menu_link_content.post_update.php, line 19

Code

function menu_link_content_post_update_make_menu_link_content_revisionable(&$sandbox) {
    $finished = _menu_link_content_post_update_make_menu_link_content_revisionable__fix_default_langcode($sandbox);
    if (!$finished) {
        $sandbox['#finished'] = 0;
        return NULL;
    }
    $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
    
    /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
    $last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
    $entity_type = $definition_update_manager->getEntityType('menu_link_content');
    $field_storage_definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions('menu_link_content');
    // Update the entity type definition.
    $entity_keys = $entity_type->getKeys();
    $entity_keys['revision'] = 'revision_id';
    $entity_keys['revision_translation_affected'] = 'revision_translation_affected';
    $entity_type->set('entity_keys', $entity_keys);
    $entity_type->set('revision_table', 'menu_link_content_revision');
    $entity_type->set('revision_data_table', 'menu_link_content_field_revision');
    $revision_metadata_keys = [
        'revision_default' => 'revision_default',
        'revision_user' => 'revision_user',
        'revision_created' => 'revision_created',
        'revision_log_message' => 'revision_log_message',
    ];
    $entity_type->set('revision_metadata_keys', $revision_metadata_keys);
    // Update the field storage definitions and add the new ones required by a
    // revisionable entity type.
    $field_storage_definitions['langcode']->setRevisionable(TRUE);
    $field_storage_definitions['title']->setRevisionable(TRUE);
    $field_storage_definitions['description']->setRevisionable(TRUE);
    $field_storage_definitions['link']->setRevisionable(TRUE);
    $field_storage_definitions['external']->setRevisionable(TRUE);
    $field_storage_definitions['enabled']->setRevisionable(TRUE);
    $field_storage_definitions['changed']->setRevisionable(TRUE);
    $field_storage_definitions['revision_id'] = BaseFieldDefinition::create('integer')->setName('revision_id')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Revision ID'))
        ->setReadOnly(TRUE)
        ->setSetting('unsigned', TRUE);
    $field_storage_definitions['revision_default'] = BaseFieldDefinition::create('boolean')->setName('revision_default')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Default revision'))
        ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.'))
        ->setStorageRequired(TRUE)
        ->setInternal(TRUE)
        ->setTranslatable(FALSE)
        ->setRevisionable(TRUE);
    $field_storage_definitions['revision_translation_affected'] = BaseFieldDefinition::create('boolean')->setName('revision_translation_affected')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Revision translation affected'))
        ->setDescription(new TranslatableMarkup('Indicates if the last edit of a translation belongs to current revision.'))
        ->setReadOnly(TRUE)
        ->setRevisionable(TRUE)
        ->setTranslatable(TRUE);
    $field_storage_definitions['revision_created'] = BaseFieldDefinition::create('created')->setName('revision_created')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Revision create time'))
        ->setDescription(new TranslatableMarkup('The time that the current revision was created.'))
        ->setRevisionable(TRUE);
    $field_storage_definitions['revision_user'] = BaseFieldDefinition::create('entity_reference')->setName('revision_user')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Revision user'))
        ->setDescription(new TranslatableMarkup('The user ID of the author of the current revision.'))
        ->setSetting('target_type', 'user')
        ->setRevisionable(TRUE);
    $field_storage_definitions['revision_log_message'] = BaseFieldDefinition::create('string_long')->setName('revision_log_message')
        ->setTargetEntityTypeId('menu_link_content')
        ->setTargetBundle(NULL)
        ->setLabel(new TranslatableMarkup('Revision log message'))
        ->setDescription(new TranslatableMarkup('Briefly describe the changes you have made.'))
        ->setRevisionable(TRUE)
        ->setDefaultValue('');
    $definition_update_manager->updateFieldableEntityType($entity_type, $field_storage_definitions, $sandbox);
    if (!empty($sandbox['data_fix']['default_langcode']['processed'])) {
        $count = $sandbox['data_fix']['default_langcode']['processed'];
        if (\Drupal::moduleHandler()->moduleExists('dblog')) {
            // @todo Simplify with https://www.drupal.org/node/2548095
            $base_url = str_replace('/update.php', '', \Drupal::request()->getBaseUrl());
            $args = [
                ':url' => Url::fromRoute('dblog.overview', [], [
                    'query' => [
                        'type' => [
                            'update',
                        ],
                        'severity' => [
                            RfcLogLevel::WARNING,
                        ],
                    ],
                ])->setOption('base_url', $base_url)
                    ->toString(TRUE)
                    ->getGeneratedUrl(),
            ];
            return new PluralTranslatableMarkup($count, 'Custom menu links have been converted to be revisionable. One menu link with data integrity issues was restored. More details have been <a href=":url">logged</a>.', 'Custom menu links have been converted to be revisionable. @count menu links with data integrity issues were restored. More details have been <a href=":url">logged</a>.', $args);
        }
        else {
            return new PluralTranslatableMarkup($count, 'Custom menu links have been converted to be revisionable. One menu link with data integrity issues was restored. More details have been logged.', 'Custom menu links have been converted to be revisionable. @count menu links with data integrity issues were restored. More details have been logged.');
        }
    }
    else {
        return t('Custom menu links have been converted to be revisionable.');
    }
}

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