function views_post_update_cleanup_duplicate_views_data

Update some views fields that were previously duplicated.

File

core/modules/views/views.post_update.php, line 40

Code

function views_post_update_cleanup_duplicate_views_data() {
    $config_factory = \Drupal::configFactory();
    $ids = [];
    $message = NULL;
    $data_tables = [];
    $base_tables = [];
    $revision_tables = [];
    $entities_by_table = [];
    $duplicate_fields = [];
    $handler_types = Views::getHandlerTypes();
    
    /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
    $entity_type_manager = \Drupal::service('entity_type.manager');
    // This will allow us to create an index of all entity types of the site.
    foreach ($entity_type_manager->getDefinitions() as $entity_type_id => $entity_type) {
        // Store the entity keyed by base table. If it has a data table, use that as
        // well.
        if ($data_table = $entity_type->getDataTable()) {
            $entities_by_table[$data_table] = $entity_type;
        }
        if ($base_table = $entity_type->getBaseTable()) {
            $entities_by_table[$base_table] = $entity_type;
        }
        // The following code basically contains the same kind of logic as
        // \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout() to
        // prefetch all tables (base, data, revision, and revision data).
        $base_tables[$entity_type_id] = $entity_type->getBaseTable() ?: $entity_type->id();
        $revisionable = $entity_type->isRevisionable();
        $revision_table = '';
        if ($revisionable) {
            $revision_table = $entity_type->getRevisionTable() ?: $entity_type->id() . '_revision';
        }
        $revision_tables[$entity_type_id] = $revision_table;
        $translatable = $entity_type->isTranslatable();
        $data_table = '';
        // For example the data table just exists, when the entity type is
        // translatable.
        if ($translatable) {
            $data_table = $entity_type->getDataTable() ?: $entity_type->id() . '_field_data';
        }
        $data_tables[$entity_type_id] = $data_table;
        $duplicate_fields[$entity_type_id] = array_intersect_key($entity_type->getKeys(), array_flip([
            'id',
            'revision',
            'bundle',
        ]));
    }
    foreach ($config_factory->listAll('views.view.') as $view_config_name) {
        $changed = FALSE;
        $view = $config_factory->getEditable($view_config_name);
        $displays = $view->get('display');
        if (isset($entities_by_table[$view->get('base_table')])) {
            $entity_type = $entities_by_table[$view->get('base_table')];
            $entity_type_id = $entity_type->id();
            $data_table = $data_tables[$entity_type_id];
            $base_table = $base_tables[$entity_type_id];
            $revision_table = $revision_tables[$entity_type_id];
            if ($data_table) {
                foreach ($displays as $display_name => &$display) {
                    foreach ($handler_types as $handler_type) {
                        if (!empty($display['display_options'][$handler_type['plural']])) {
                            foreach ($display['display_options'][$handler_type['plural']] as $field_name => &$field) {
                                $table = $field['table'];
                                if (($table === $base_table || $table === $revision_table) && in_array($field_name, $duplicate_fields[$entity_type_id])) {
                                    $field['table'] = $data_table;
                                    $changed = TRUE;
                                }
                            }
                        }
                    }
                }
            }
        }
        if ($changed) {
            $view->set('display', $displays);
            $view->save();
            $ids[] = $view->get('id');
        }
    }
    if (!empty($ids)) {
        $message = new TranslatableMarkup('Updated tables for field handlers for views: @ids', [
            '@ids' => implode(', ', array_unique($ids)),
        ]);
    }
    return $message;
}

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