workspaces.post_update.php

Same filename and directory in other branches
  1. 9 core/modules/workspaces/workspaces.post_update.php
  2. 10 core/modules/workspaces/workspaces.post_update.php
  3. 11.x core/modules/workspaces/workspaces.post_update.php

Post update functions for the Workspaces module.

File

core/modules/workspaces/workspaces.post_update.php

View source
<?php


/**
 * @file
 * Post update functions for the Workspaces module.
 */
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Site\Settings;

/**
 * Clear caches due to access changes.
 */
function workspaces_post_update_access_clear_caches() {
}

/**
 * Remove the default workspace.
 */
function workspaces_post_update_remove_default_workspace() {
    if ($workspace = \Drupal::entityTypeManager()->getStorage('workspace')
        ->load('live')) {
        $workspace->delete();
    }
}

/**
 * Move the workspace association data to an entity field and a custom table.
 */
function workspaces_post_update_move_association_data(&$sandbox) {
    $database = \Drupal::database();
    $entity_type_manager = \Drupal::entityTypeManager();
    // @see workspaces_update_8803()
    $tables = \Drupal::state()->get('workspaces_update_8803.tables');
    if (!$tables) {
        return;
    }
    // If 'progress' is not set, this will be the first run of the batch.
    if (!isset($sandbox['progress'])) {
        $sandbox['progress'] = 0;
        $sandbox['current_id'] = -1;
        // Create a temporary table for the new workspace_association index.
        $schema = [
            'description' => 'Stores the association between entity revisions and their workspace.',
            'fields' => [
                'workspace' => [
                    'type' => 'varchar_ascii',
                    'length' => 128,
                    'not null' => TRUE,
                    'default' => '',
                    'description' => 'The workspace ID.',
                ],
                'target_entity_type_id' => [
                    'type' => 'varchar_ascii',
                    'length' => EntityTypeInterface::ID_MAX_LENGTH,
                    'not null' => TRUE,
                    'default' => '',
                    'description' => 'The ID of the associated entity type.',
                ],
                'target_entity_id' => [
                    'type' => 'int',
                    'unsigned' => TRUE,
                    'not null' => TRUE,
                    'description' => 'The ID of the associated entity.',
                ],
                'target_entity_revision_id' => [
                    'type' => 'int',
                    'unsigned' => TRUE,
                    'not null' => TRUE,
                    'description' => 'The revision ID of the associated entity.',
                ],
            ],
            'indexes' => [
                'target_entity_revision_id' => [
                    'target_entity_revision_id',
                ],
            ],
            'primary key' => [
                'workspace',
                'target_entity_type_id',
                'target_entity_id',
            ],
        ];
        if ($database->schema()
            ->tableExists('tmp_workspace_association')) {
            $database->schema()
                ->dropTable('tmp_workspace_association');
        }
        $database->schema()
            ->createTable('tmp_workspace_association', $schema);
        // Copy all the data from the base table of the 'workspace_association'
        // entity type to the temporary association table.
        $select = $database->select($tables['base_table'])
            ->fields($tables['base_table'], [
            'workspace',
            'target_entity_type_id',
            'target_entity_id',
            'target_entity_revision_id',
        ]);
        $database->insert('tmp_workspace_association')
            ->from($select)
            ->execute();
    }
    $table_name = $tables['revision_table'];
    $revision_field_name = 'revision_id';
    // Get the next entity association revision records to migrate.
    $step_size = Settings::get('entity_update_batch_size', 50);
    $workspace_association_records = $database->select($table_name, 't')
        ->condition("t.{$revision_field_name}", $sandbox['current_id'], '>')
        ->fields('t')
        ->orderBy($revision_field_name, 'ASC')
        ->range(0, $step_size)
        ->execute()
        ->fetchAll();
    foreach ($workspace_association_records as $record) {
        // Set the workspace reference on the tracked entity revision.
        
        /** @var \Drupal\Core\Entity\ContentEntityInterface $revision */
        $revision = $entity_type_manager->getStorage($record->target_entity_type_id)
            ->loadRevision($record->target_entity_revision_id);
        $revision->set('workspace', $record->workspace);
        $revision->setSyncing(TRUE);
        $revision->save();
        $sandbox['progress']++;
        $sandbox['current_id'] = $record->{$revision_field_name};
    }
    // Get an updated count of workspace_association revisions that still need to
    // be migrated to the new storage.
    $missing = $database->select($table_name, 't')
        ->condition("t.{$revision_field_name}", $sandbox['current_id'], '>')
        ->orderBy($revision_field_name, 'ASC')
        ->countQuery()
        ->execute()
        ->fetchField();
    $sandbox['#finished'] = $missing ? $sandbox['progress'] / ($sandbox['progress'] + (int) $missing) : 1;
    // Uninstall the 'workspace_association' entity type and rename the temporary
    // table.
    if ($sandbox['#finished'] == 1) {
        $database->schema()
            ->dropTable($tables['base_table']);
        $database->schema()
            ->dropTable($tables['revision_table']);
        $database->schema()
            ->renameTable('tmp_workspace_association', 'workspace_association');
        \Drupal::state()->delete('workspaces_update_8803.tables');
    }
}

/**
 * Add the workspace 'parent' field to the 'deploy' form display.
 */
function workspaces_post_update_update_deploy_form_display() {
    if ($form_display = EntityFormDisplay::load('workspace.workspace.deploy')) {
        $form_display->removeComponent('parent')
            ->save();
    }
}

/**
 * Removes the workspace association entity and field schema data.
 */
function workspaces_post_update_remove_association_schema_data() {
    // Delete the entity and field schema data.
    $keys = [
        'workspace_association.entity_schema_data',
        'workspace_association.field_schema_data.id',
        'workspace_association.field_schema_data.revision_id',
        'workspace_association.field_schema_data.uuid',
        'workspace_association.field_schema_data.revision_default',
        'workspace_association.field_schema_data.target_entity_id',
        'workspace_association.field_schema_data.target_entity_revision_id',
        'workspace_association.field_schema_data.target_entity_type_id',
        'workspace_association.field_schema_data.workspace',
    ];
    \Drupal::keyValue('entity.storage_schema.sql')->deleteMultiple($keys);
}

Functions

Title Deprecated Summary
workspaces_post_update_access_clear_caches Clear caches due to access changes.
workspaces_post_update_move_association_data Move the workspace association data to an entity field and a custom table.
workspaces_post_update_remove_association_schema_data Removes the workspace association entity and field schema data.
workspaces_post_update_remove_default_workspace Remove the default workspace.
workspaces_post_update_update_deploy_form_display Add the workspace 'parent' field to the 'deploy' form display.

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