Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0 / 0 |
|
100.00% |
0 / 0 |
CRAP | |
0.00% |
0 / 79 |
|
| views_post_update_update_cacheability_metadata | |
0.00% |
0 / 1 |
0 | |
0.00% |
0 / 10 |
|||
| views_post_update_cleanup_duplicate_views_data | |
0.00% |
0 / 1 |
0 | |
0.00% |
0 / 69 |
|||
| <?php | |
| /** | |
| * @file | |
| * Post update functions for Views. | |
| */ | |
| use Drupal\Core\StringTranslation\TranslatableMarkup; | |
| use Drupal\views\Views; | |
| /** | |
| * @addtogroup updates-8.0.0-beta | |
| * @{ | |
| */ | |
| /** | |
| * Update the cacheability metadata for all views. | |
| */ | |
| function views_post_update_update_cacheability_metadata() { | |
| // Load all views. | |
| $views = \Drupal::entityManager()->getStorage('view')->loadMultiple(); | |
| /* @var \Drupal\views\Entity\View[] $views */ | |
| foreach ($views as $view) { | |
| $displays = $view->get('display'); | |
| foreach (array_keys($displays) as $display_id) { | |
| $display =& $view->getDisplay($display_id); | |
| // Unset the cache_metadata key, so all cacheability metadata for the | |
| // display is recalculated. | |
| unset($display['cache_metadata']); | |
| } | |
| $view->save(); | |
| } | |
| } | |
| /** | |
| * @} End of "addtogroup updates-8.0.0-beta". | |
| */ | |
| /** | |
| * @addtogroup updates-8.0.0-rc | |
| * @{ | |
| */ | |
| /** | |
| * Update some views fields that were previously duplicated. | |
| */ | |
| 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; | |
| } | |
| /** | |
| * @} End of "addtogroup updates-8.0.0-rc". | |
| */ |