X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fviews%2Fviews.install;h=8d5d2504f5fc5aaae58e17cff26ee1bd97d11a52;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hp=f542416b0b5f8b9937a8934f97dabaf61c243b55;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/web/core/modules/views/views.install b/web/core/modules/views/views.install index f542416b0..8d5d2504f 100644 --- a/web/core/modules/views/views.install +++ b/web/core/modules/views/views.install @@ -5,6 +5,9 @@ * Contains install and update functions for Views. */ +use Drupal\Core\Config\Schema\ArrayElement; +use Drupal\views\Views; + /** * Implements hook_install(). */ @@ -312,6 +315,10 @@ function views_update_8003() { // Empty update to cause a cache flush so that views data is rebuilt. Entity // types that don't implement a list builder cannot have the entity operations // field. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. } /** @@ -319,6 +326,10 @@ function views_update_8003() { */ function views_update_8004() { // Empty update to cause a cache flush so that views data is rebuilt. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. } /** @@ -326,6 +337,10 @@ function views_update_8004() { */ function views_update_8005() { // Empty update function to rebuild the views data. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. } /** @@ -333,6 +348,10 @@ function views_update_8005() { */ function views_update_8100() { // Empty update to cause a cache flush so that views data is rebuilt. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. } /** @@ -362,6 +381,10 @@ function views_update_8101() { */ function views_update_8200() { // Empty update to cause a cache rebuild so that the container is rebuilt. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. } /** @@ -369,4 +392,143 @@ function views_update_8200() { */ function views_update_8201() { // Empty update to cause a cache rebuild so that config schema get refreshed. + + // Use hook_post_update_NAME() instead to clear the cache.The use + // of hook_update_N to clear the cache has been deprecated see + // https://www.drupal.org/node/2960601 for more details. +} + +/** + * Update field names for multi-value base fields. + */ +function views_update_8500() { + // Find all multi-value base fields for content entities. + $entity_type_manager = \Drupal::entityTypeManager(); + $entity_field_manager = \Drupal::service('entity_field.manager'); + $table_update_info = []; + + foreach ($entity_type_manager->getDefinitions() as $entity_type_id => $entity_type) { + if ($entity_type->hasHandlerClass('views_data')) { + $base_field_definitions = $entity_field_manager->getBaseFieldDefinitions($entity_type_id); + + $entity_storage = $entity_type_manager->getStorage($entity_type_id); + $table_mapping = $entity_storage->getTableMapping($base_field_definitions); + + foreach ($base_field_definitions as $field_name => $base_field_definition) { + $base_field_storage_definition = $base_field_definition->getFieldStorageDefinition(); + + // Skip single value and custom storage base fields. + if (!$base_field_storage_definition->isMultiple() || $base_field_storage_definition->hasCustomStorage()) { + continue; + } + + // Get the actual table, as well as the column for the main property + // name so we can perform an update later on the views. + $table_name = $table_mapping->getFieldTableName($field_name); + $main_property_name = $base_field_storage_definition->getMainPropertyName(); + + $table_update_info[$table_name][$field_name] = $table_mapping->getFieldColumnName($base_field_storage_definition, $main_property_name); + } + } + } + + if (empty($table_update_info)) { + return; + } + + $config_factory = \Drupal::configFactory(); + /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */ + $typed_config_manager = \Drupal::service('config.typed'); + $views_data = Views::viewsData(); + $handler_types = ['field', 'argument', 'sort', 'relationship', 'filter']; + + $required_cleanup_handlers = []; + foreach ($config_factory->listAll('views.view.') as $id) { + $view = $config_factory->getEditable($id); + $changed = FALSE; + + foreach ($view->get('display') as $display_id => &$display) { + foreach ($handler_types as $handler_type_singular) { + $handler_type_plural = $handler_type_singular . 's'; + $handler_data = $view->get("display.$display_id.display_options.$handler_type_plural"); + + if (empty($handler_data)) { + continue; + } + + foreach ($handler_data as $key => $data) { + // If this handler has a table we're interested in, update the field + // name. + $table = $data['table']; + if (isset($table_update_info[$table])) { + $path_to_handler = "display.$display_id.display_options.$handler_type_plural.$key"; + $path_field = "{$path_to_handler}.field"; + $path_plugin_id = "{$path_to_handler}.plugin_id"; + $original_field_name = $view->get($path_field); + + // Only if the wrong field name is set do we change the field. It + // could already be using the correct field. Like + // user__roles/roles_target_id. + if (isset($table_update_info[$table][$original_field_name])) { + $required_cleanup_handlers[$id][] = $path_to_handler; + + // Set both the new table field as well as new 'plugin_id' field. + $view->set($path_field, $table_update_info[$table][$original_field_name]); + $view->set($path_plugin_id, $views_data->get($table)[$table_update_info[$table][$original_field_name]][$handler_type_singular]['id']); + + $changed = TRUE; + } + } + } + } + } + + if ($changed) { + $view->save(TRUE); + } + } + + // Beside of updating the field and plugin ID we also need to truncate orphan + // keys so he configuration applies to the config schema. + // We cannot do that inline in the other code, due to caching issues with + // typed configuration. + foreach ($required_cleanup_handlers as $id => $paths_to_handlers) { + $changed = FALSE; + $typed_view = $typed_config_manager->get($id); + $view = $config_factory->getEditable($id); + foreach ($paths_to_handlers as $path_to_handler) { + /** @var \Drupal\Core\Config\Schema\TypedConfigInterface $typed_view */ + + /** @var \Drupal\Core\Config\Schema\ArrayElement $typed_config */ + $typed_config = $typed_view->get($path_to_handler); + $config = $typed_config->getValue(); + + // Filter values we want to convert from a string to an array. + if (strpos($path_to_handler, 'filters') !== FALSE && $typed_config->get('value') instanceof ArrayElement && is_string($config['value'])) { + // An empty string casted to an array is an array with one + // element. + if ($config['value'] === '') { + $config['value'] = []; + } + else { + $config['value'] = (array) $config['value']; + } + } + + // For all the other fields we try to determine the fields using + // config schema and remove everything which is not needed. + foreach (array_keys($config) as $config_key) { + if (!isset($typed_config->getDataDefinition()['mapping'][$config_key])) { + unset($config[$config_key]); + $changed = TRUE; + } + } + $typed_config->setValue($config); + $view->set($path_to_handler, $typed_config->getValue()); + } + + if ($changed) { + $view->save(); + } + } }