diff --git a/core/modules/views/views.install b/core/modules/views/views.install index e8e3e5e..8d07c29 100644 --- a/core/modules/views/views.install +++ b/core/modules/views/views.install @@ -11,3 +11,86 @@ function views_install() { module_set_weight('views', 10); } + +/** + * @addtogroup updates-8.0.0-beta + * @{ + */ + +/** + * Update views field plugins. + */ +function views_update_8001(&$sandbox) { + $config_factory = \Drupal::configFactory(); + $ids = []; + + foreach ($config_factory->listAll('views.view.') as $view_config_name) { + $view = $config_factory->getEditable($view_config_name); + + $displays = $view->get('display'); + + // @todo + // - only operate on field on entities + // - handle timeago + + foreach ($displays as $display_name => $display) { + if ($display['display_options']['row']['type'] === 'fields') { + foreach ($display['display_options']['fields'] as $field_name => $field) { + if ($field['plugin_id'] === 'date') { + $ids[] = $view->get('id'); + + // Grab the settings we need to move to a different place in the + // config schema. + $date_format = !empty($field['date_format']) ? $field['date_format'] : 'medium'; + $custom_date_format = !empty($field['custom_date_format']) ? $field['custom_date_format'] : ''; + $timezone = !empty($field['timezone']) ? $field['timezone'] : ''; + + if ($date_format === 'time ago') { + // Update the field to use the Field API formatter. + $view->set("display.$display_name.display_options.fields.$field_name.plugin_id", 'field'); + $view->set("display.$display_name.display_options.fields.$field_name.type", 'timestamp_ago'); + + // Add the new settings + $view->set("display.$display_name.display_options.fields.$field_name.settings.future_format", '@interval hence'); + $view->set("display.$display_name.display_options.fields.$field_name.settings.past_format", '@interval ago'); + $view->set("display.$display_name.display_options.fields.$field_name.settings.granularity", 2); + } + elseif ($date_format === 'raw time ago') { + // Update the field to use the Field API formatter. + $view->set("display.$display_name.display_options.fields.$field_name.plugin_id", 'field'); + $view->set("display.$display_name.display_options.fields.$field_name.type", 'timestamp_ago'); + + // Add the new settings + $view->set("display.$display_name.display_options.fields.$field_name.settings.future_format", '@interval'); + $view->set("display.$display_name.display_options.fields.$field_name.settings.past_format", '@interval'); + $view->set("display.$display_name.display_options.fields.$field_name.settings.granularity", 2); + } + else { + // Update the field to use the Field API formatter. + $view->set("display.$display_name.display_options.fields.$field_name.plugin_id", 'field'); + $view->set("display.$display_name.display_options.fields.$field_name.type", 'timestamp'); + + // Add the new settings + $view->set("display.$display_name.display_options.fields.$field_name.settings.date_format", $date_format); + $view->set("display.$display_name.display_options.fields.$field_name.settings.custom_date_format", $custom_date_format); + $view->set("display.$display_name.display_options.fields.$field_name.settings.timezone", $timezone); + } + + // Remove the old settings. + $view->clear("display.$display_name.display_options.fields.$field_name.date_format"); + $view->clear("display.$display_name.display_options.fields.$field_name.custom_date_format"); + $view->clear("display.$display_name.display_options.fields.$field_name.timezone"); + } + } + } + } + + $view->save(); + } + + return \Drupal::translation()->translate('Updated field plugins for views: @ids', ['@views' => implode(', ', array_unique($ids))]); +} + +/** + * @} End of "addtogroup updates-8.0.0-beta". + */