views_post_update_cleanup_duplicate_views_data()
Update some views fields that were previously duplicated.
File
- core/modules/views/views.post_update.php, line 50
- Post update functions for Views.
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; }
Please login to continue.