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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 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.