X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fdatetime_range%2Fdatetime_range.post_update.php;fp=web%2Fcore%2Fmodules%2Fdatetime_range%2Fdatetime_range.post_update.php;h=8cd82c8670eb123f9725f559843f8bac18e3ed96;hp=b5f3f5d310fe3113044bf91c27396248590d6109;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/modules/datetime_range/datetime_range.post_update.php b/web/core/modules/datetime_range/datetime_range.post_update.php index b5f3f5d31..8cd82c867 100644 --- a/web/core/modules/datetime_range/datetime_range.post_update.php +++ b/web/core/modules/datetime_range/datetime_range.post_update.php @@ -5,9 +5,88 @@ * Post-update functions for Datetime Range module. */ +use Drupal\views\Views; + /** * Clear caches to ensure schema changes are read. */ function datetime_range_post_update_translatable_separator() { // Empty post-update hook to cause a cache rebuild. } + +/** + * Update existing views using datetime_range fields. + */ +function datetime_range_post_update_views_string_plugin_id() { + + /* @var \Drupal\views\Entity\View[] $views */ + $views = \Drupal::entityTypeManager()->getStorage('view')->loadMultiple(); + $config_factory = \Drupal::configFactory(); + $message = NULL; + $ids = []; + + foreach ($views as $view) { + $displays = $view->get('display'); + $needs_bc_layer_update = FALSE; + + foreach ($displays as $display_name => $display) { + + // Check if datetime_range filters need updates. + if (!$needs_bc_layer_update && isset($display['display_options']['filters'])) { + foreach ($display['display_options']['filters'] as $field_name => $filter) { + if ($filter['plugin_id'] == 'string') { + + // Get field config. + $filter_views_data = Views::viewsData()->get($filter['table'])[$filter['field']]['filter']; + if (!isset($filter_views_data['entity_type']) || !isset($filter_views_data['field_name'])) { + continue; + } + $field_storage_name = 'field.storage.' . $filter_views_data['entity_type'] . '.' . $filter_views_data['field_name']; + $field_configuration = $config_factory->get($field_storage_name); + + if ($field_configuration->get('type') == 'daterange') { + // Trigger the BC layer control. + $needs_bc_layer_update = TRUE; + continue 2; + } + } + } + } + + // Check if datetime_range sort handlers need updates. + if (!$needs_bc_layer_update && isset($display['display_options']['sorts'])) { + foreach ($display['display_options']['sorts'] as $field_name => $sort) { + if ($sort['plugin_id'] == 'standard') { + + // Get field config. + $sort_views_data = Views::viewsData()->get($sort['table'])[$sort['field']]['sort']; + if (!isset($sort_views_data['entity_type']) || !isset($sort_views_data['field_name'])) { + continue; + } + $field_storage_name = 'field.storage.' . $sort_views_data['entity_type'] . '.' . $sort_views_data['field_name']; + $field_configuration = $config_factory->get($field_storage_name); + + if ($field_configuration->get('type') == 'daterange') { + // Trigger the BC layer control. + $needs_bc_layer_update = TRUE; + continue 2; + } + } + } + } + } + + // If current view needs BC layer updates save it and the hook view_presave + // will do the rest. + if ($needs_bc_layer_update) { + $view->save(); + $ids[] = $view->id(); + } + } + + if (!empty($ids)) { + $message = \Drupal::translation()->translate('Updated datetime_range filter/sort plugins for views: @ids', ['@ids' => implode(', ', array_unique($ids))]); + } + + return $message; +}